errexpect-error "undefined $key"
}
+proc errexpect-arrayget-boolean {arrayvar key} {
+ switch -exact [uplevel 1 [list errexpect-arrayget $arrayvar $key]] {
+ true { return 1 }
+ false { return 0 }
+ default { errexpect-error "unexpected $key" }
+ }
+}
+
proc errexpect-catch {code} {
global errorInfo errorCode
set rc [catch {
if {![string length $l]} continue
if {[regexp {^\#} $l]} continue
if {![regexp -expanded \
- {^ (\d+) (?: \s+([^=]*?) )? \s*
- (?: = \s* (\S+)
+ {^ (\d+) (?: \s+([^=]*?) )? \s* =
+ (?: \s* (\S+)
(?: \s+ (\S+) )?)? $} \
$l dummy vid vname owner note]} {
errexpect-error "badly formatted"
}
}
-proc note-info {lno vid name description} {
+proc note-info {lno vid name island description} {
global note_infos
- lappend note_infos [list $lno $vid $name $description]
+ lappend note_infos [list $lno $vid $name $island $description]
}
proc display-note-infos {} {
- global note_infos note_missings
+ 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} {
+ } elseif {$nmissing && [array size notes]} {
set tiny "$nmissing missing"
} else {
return
set infodata {}
foreach info $note_infos {
- manyset $info lno vid name description
+ 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} {
- append infodata "$nmissing vessels not mentioned in notes:\n"
- foreach info $note_missings {
- manyset $info vid name
+ 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] warnings;\
- $nmissing vessels missing" \
+ "[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_abbrev2full
+ foreach {game code abbrev full} {
+ 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_game2code($game) $code
+ set vc_code2abbrev($code) $abbrev
+ set vc_abbrev2full($abbrev) $full
+ }
+}
+
+proc code2abbrev {code} {
+ global vc_code2abbrev
+
+ manyset [split $code _] inport class subclass lockown xabbrev
+ manyset [split $lockown ""] lock own
+
+ set abbrev {}
+ append abbrev [lindex {? {}} $inport]
+ append abbrev $vc_code2abbrev($class)
+ append abbrev $subclass
+ append abbrev [lindex {* + -} $lock]
+ append abbrev [lindex {- = ?} [regsub {\D} $own 2]]
+ append abbrev $xabbrev
+
+ debug "CODE2ABBREV $code $abbrev"
+ return $abbrev
+}
+
#---------- loading and parsing the clipboard (vessel locations) ----------
proc vessel {vin} {
global pirate notes_used note_missings newnotes
upvar 1 $vin vi
- switch -exact [errexpect-arrayget vi vesselClass] {
- smsloop { set sz 00sl }
- lgsloop { set sz 01ct }
- dhow { set sz 02dh }
- longship { set sz 03ls }
- baghlah { set sz 04bg }
- merchbrig { set sz 05mb }
- warbrig { set sz 06wb }
- xebec { set sz 07xe }
- warfrig { set sz 08wf }
- merchgal { set sz 09mg }
- grandfrig { set sz 10gf }
- default { errexpect-error "unknown class" }
- }
- set abbrev $sz
- switch -exact [errexpect-arrayget vi vesselSubclass] {
- null { }
- icy { append abbrev F }
- default { errexpect-error "unknown subclass ?" }
+
+ set codel {}
+ lappend codel [errexpect-arrayget-boolean vi inPort]
+
+ set gameclass [errexpect-arrayget vi vesselClass]
+ upvar #0 vc_game2code($gameclass) class
+ if {![info exists class]} { errexpect-error "unexpected vesselClass"}
+ lappend codel $class
+
+ set subclass [errexpect-arrayget vi vesselSubclass]
+ switch -exact $subclass {
+ null { lappend codel {} }
+ icy { lappend codel F }
+ default { lappend codel ($subclass) }
}
+
switch -exact [errexpect-arrayget vi isLocked]/[ \
errexpect-arrayget vi isBattleReady] {
- true/false { append abbrev 2- }
- false/false { append abbrev 1+ }
- false/true { append abbrev 0* }
+ true/false { set lock 2 }
+ false/false { set lock 1 }
+ false/true { set lock 0 }
default { errexpect-error "unexpected isLocked/isBattleReady" }
}
- switch -exact [errexpect-arrayget vi inPort] {
- true { }
- false { append abbrev ? }
- default { errexpect-error "unexpected inPort" }
- }
+
set vid [errexpect-arrayget vi vesselId]
upvar #0 notes($vid) note
set realname [errexpect-arrayget vi vesselName]
+ set island [errexpect-arrayget vi islandName]
set owner {}
set xabbrev {}
if {[info exists note]} {
manyset $note lno notename owner xabbrev
if {[string compare -nocase $realname $notename]} {
- note-info $lno $vid $realname \
- "notes say name is $notename - perhaps renamed"
+ note-info $lno $vid $realname $island \
+ "notes say name is $notename"
}
- if {![string compare $owner $pirate]} {
- append abbrev =
+ if {[string length $owner]} {
+ if {![string compare $owner $pirate]} {
+ set own 1
+ } else {
+ set own 0
+ }
} else {
- append abbrev -
+ set own U
}
append abbrev $xabbrev
set notes_used($vid) 1
} else {
- lappend note_missings [list $vid $realname]
+ set own M
+ lappend note_missings [list $island $realname $vid]
}
+
+ lappend codel "$lock$own" $xabbrev
lappend newnotes [list $vid $realname $owner $xabbrev]
-
- set kk "[errexpect-arrayget vi islandName] $abbrev"
+ set kk "$island [join $codel _]"
upvar #0 count($kk) k
if {![info exists k]} { set k 0 }
incr k
+
+ debug "CODED $kk $vid $realname"
}
set clipboard {}
foreach vid [lsort [array names notes]] {
if {![info exists notes_used($vid)]} {
manyset $notes($vid) lno notename
- note-info $lno $vid $notename \
+ note-info $lno $vid $notename {} \
"vessel in notes no longer found"
}
}
foreach key [lsort [array names count]] {
set c $count($key)
# debug "SHOWING $key $c"
- regexp {^(.*) (\S+)$} $key dummy islandname abbrev
+ regexp {^(.*) (\S+)$} $key dummy islandname code
+
+ set abbrev [code2abbrev $code]
+
if {[string compare $lastislandname $islandname]} {
manyset $isleloc($islandname) x y
set x [coord $x]
$eb.text.text tag add error $lno.0 $lno.end
$eb.text.text see $lno.0
}
-proc parser-control-failed-unexpected {w base tiny summary fulldesc fulldata} {
+proc parser-control-failed-unexpected {w base emsg ei} {
+ global errorInfo
parser-control-failed-core $w $base \
black yellow 1 \
- $tiny $summary $fulldesc $fulldata
+ $emsg $emsg "Details and stack trace:" $ei
}
-proc reparse {base varname old fulldesc okshow noneshow parse} {
+proc reparse {base varname old fulldesc okshow noneshow parse ok} {
upvar #0 $varname var
manyset [errexpect-catch {
uplevel 1 $parse
$emsg $lno $ei $fulldesc $var
set var $old
uplevel 1 $parse
+ } else {
+ uplevel 1 $ok
}
}
}
proc invoke_acquire {} {
- global clipboard
+ global clipboard errorInfo
set old $clipboard
- set clipboard [clipboard get]
- reparse acquire \
- clipboard $old "Clipboard contents:" { acquired ok } { no vessels } \
- { parse-clipboard }
+ if {[catch {
+ set clipboard [clipboard get]
+ } emsg]} {
+ parser-control-failed-unexpected .ctrl.acquire acquire \
+ $emsg "fetching clipboard:\n\n$errorInfo"
+ return
+ }
- display-note-infos
+ reparse acquire \
+ clipboard $old "Clipboard contents:" { acquired ok } { no vessels } {
+ parse-clipboard
+ } {
+ display-note-infos
+ }
draw
}
load-notes
} emsg]} {
parser-control-failed-unexpected .ctrl.notes notes \
- $emsg $emsg "Details and stack trace:" \
- "loading $notes_loc:\n\n$errorInfo"
+ $emsg "loading $notes_loc:\n\n$errorInfo"
return
}
reparse notes \
- notes_data $old "Vessel notes:" "loaded ok" { no notes } \
- { parse-notes }
-
- parse-clipboard
- display-note-infos
+ notes_data $old "Vessel notes:" "loaded ok" { no notes } {
+ parse-notes
+ parse-clipboard
+ } {
+ display-note-infos
+ }
draw
}
#---------- main program ----------
+vesselclasses-init
+
parseargs
argdefaults
httpclientsetup where-vessels
widgets-setup
set notes_data {}
+if {[catch { parse-clipboard } emsg]} {
+ puts stderr "$emsg\n$errorInfo"
+ exit 1
+}
after idle invoke_notes
draw