X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~yarrgweb/git?a=blobdiff_plain;f=yarrg%2Fwhere-vessels;h=9ec3b35fc8ee8b139abcd94286672cce43df76af;hb=de02daca3d377ebdd1e53689e5c3470f7284b726;hp=0376796314509424a76952e53864e84530fc41ad;hpb=0133a79929da1c6bcbd524b6e7d23decdfc80198;p=ypp-sc-tools.db-test.git diff --git a/yarrg/where-vessels b/yarrg/where-vessels index 0376796..9ec3b35 100755 --- a/yarrg/where-vessels +++ b/yarrg/where-vessels @@ -66,6 +66,14 @@ proc errexpect-arrayget {arrayvar key} { 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 { @@ -166,8 +174,8 @@ proc parse-notes {} { 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" @@ -180,18 +188,20 @@ proc parse-notes {} { } } -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 @@ -200,17 +210,24 @@ proc display-note-infos {} { 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] } } @@ -218,78 +235,120 @@ proc display-note-infos {} { 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 {} @@ -330,7 +389,7 @@ proc parse-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" } } @@ -412,7 +471,10 @@ proc draw {} { 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] @@ -553,13 +615,14 @@ proc parser-control-failed-expected {w base emsg lno ei fulldesc newdata} { $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 @@ -574,6 +637,8 @@ proc reparse {base varname old fulldesc okshow noneshow parse} { $emsg $lno $ei $fulldesc $var set var $old uplevel 1 $parse + } else { + uplevel 1 $ok } } @@ -630,15 +695,23 @@ proc zoom {extail} { } 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 } @@ -650,22 +723,24 @@ proc invoke_notes {} { 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 @@ -673,6 +748,10 @@ load-chart widgets-setup set notes_data {} +if {[catch { parse-clipboard } emsg]} { + puts stderr "$emsg\n$errorInfo" + exit 1 +} after idle invoke_notes draw