+
+proc argdefaults {} {
+ global ocean notes_loc pirate scraper
+ if {![info exists ocean] || ![info exists pirate]} {
+ set cmd {./yarrg --find-window-only --quiet}
+ if {[info exists ocean]} { lappend cmd --ocean $ocean }
+ if {[info exists pirate]} { lappend cmd --pirate $pirate }
+ manyset [split [eval exec $cmd] " "] ocean pirate
+ }
+ lappend scraper $ocean
+}
+
+
+#---------- loading and parsing the vessel notes ----------
+
+proc load-notes {} {
+ global notes_loc notes_data
+ if {[regexp {^\w+\:} $notes_loc]} {
+ update
+ debug "FETCHING NOTES $notes_loc"
+ set req [::http::geturl $notes_loc]
+ switch -glob [::http::status $req].[::http::ncode $req] {
+ ok.200 { }
+ ok.* { error "retrieving vessel-notes: [::http::code $req]" }
+ * { error "Retrieving vessel-notes: [::http::error $req]" }
+ }
+ set newdata [::http::data $req]
+ ::http::cleanup $req
+ } else {
+ debug "READING NOTES $notes_loc"
+ set vn [open $notes_loc]
+ set newdata [read $vn]
+ close $vn
+ }
+ set notes_data $newdata
+}
+
+proc parse-notes {} {
+ global notes_data notes
+ catch { unset notes }
+
+ set lno 0
+ foreach l [split $notes_data "\n"] {
+ incr lno
+ errexpect-setline $lno $l
+ set l [string trim $l]
+ if {![string length $l]} continue
+ if {[regexp {^\#} $l]} continue
+ if {![regexp -expanded \
+ {^ (\d+) (?: \s+([^=]*?) )? \s* =
+ (?: \s* (\S+)
+ (?: \s+ (\S+) )?)? $} \
+ $l dummy vid vname owner note]} {
+ errexpect-error "badly formatted"
+ }
+ set vname [string trim $vname]
+ if {[info exists notes($vid)]} {
+ errexpect-error "duplicate vesselid $vid"
+ }
+ set notes($vid) [list $lno $vname $owner $note]
+ }
+}
+
+proc note-info {lno vid name island description} {
+ global note_infos
+ lappend note_infos [list $lno $vid $name $island $description]
+}
+
+proc display-note-infos {} {
+ global note_infos note_missings notes
+
+ set nmissing [llength $note_missings]
+ debug "display-note-infos $nmissing [array size notes]"
+
+ if {[llength $note_infos]} {
+ set tiny "[llength $note_infos] warnings"
+ } elseif {$nmissing && [array size notes]} {
+ set tiny "$nmissing missing"
+ } else {
+ return
+ }
+
+ set infodata {}
+
+ foreach info $note_infos {
+ manyset $info lno vid name island description
+ append infodata "vessel"
+ append infodata " $vid"
+ if {[string length $name]} { append infodata " $name" }
+ if {[string length $island]} { append infodata " ($island)" }
+ append infodata ": " $description "\n"
+ }
+
+ if {$nmissing} {
+ if {[string length $infodata]} { append infodata "\n" }
+ append infodata "$nmissing vessel(s) not mentioned in notes:\n"
+ set last_island {}
+ foreach info [lsort $note_missings] {
+ manyset $info island name vid
+ if {[string compare $island $last_island]} {
+ append infodata "# $island:\n"
+ set last_island $island
+ }
+ append infodata [format "%-9d %-29s =\n" $vid $name]
+ }
+ }
+
+ parser-control-failed-core .ctrl.notes notes \
+ white blue 0 \
+ $tiny \
+ "[llength $note_infos] warning(s);\
+ $nmissing vessel(s) missing" \
+ "Full description of warnings and missing vessels:" \
+ $infodata
+}
+
+#---------- vessel properties ----------
+
+proc vesselclasses-init {} {
+ global vc_game2code vc_code2abbrev vc_code2full vc_codes
+ set vcl {
+ smsloop am sl Sloop
+ lgsloop bm ct Cutter
+ dhow cm dh Dhow
+ longship dm ls Longship
+ baghlah em bg Baghlah
+ merchbrig fm mb {Merchant Brig}
+ warbrig gm wb {War Brig}
+ xebec hm xe Xebec
+ warfrig im wf {War Frigate}
+ merchgal jm mg {Merchant Galleon}
+ grandfrig km gf {Grand Frigate}
+ }
+ set vc_codes {}
+ foreach {game code abbrev full} $vcl {
+ lappend vc_codes $code
+ set vc_game2code($game) $code
+ set vc_code2abbrev($code) $abbrev
+ set vc_code2full($code) $full
+ }
+}
+
+proc code2abbrev-lock {lockown} {
+ manyset [split $lockown ""] lock notown
+ append abbrev [lindex {* + -} $lock]
+ append abbrev [lindex {= - ?} [regsub {\D} $notown 2]]
+}
+
+proc code2abbrev {code} {
+ global vc_code2abbrev
+
+ manyset [split $code _] inport class subclass lockown xabbrev
+
+ set abbrev {}
+ append abbrev [lindex {? {}} $inport]
+ append abbrev $vc_code2abbrev($class)
+ append abbrev $subclass
+ append abbrev [code2abbrev-lock $lockown]
+ append abbrev $xabbrev
+
+ debug "CODE2ABBREV $code $abbrev"
+ return $abbrev
+}
+
+proc show-report-decode {code} {
+ global vc_code2full
+
+ manyset [split $code _] inport classcode subclass lockown xabbrev
+ manyset [split $lockown ""] lock notown