From a321912bb3a23a3cc5a1a09d75039df277d6a5b5 Mon Sep 17 00:00:00 2001 From: Adam Lesperance Date: Thu, 20 Jan 2022 18:32:22 -0600 Subject: [PATCH 1/4] Update deps --- Cargo.lock | 584 ++++++++++++++--------------------------------------- Cargo.toml | 20 +- 2 files changed, 160 insertions(+), 444 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8d735d8..08bc1d0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,10 +1,12 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +version = 3 + [[package]] name = "addr2line" -version = "0.14.1" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a55f82cfe485775d02112886f4169bde0c5894d75e79ead7eafe7e40a25e45f7" +checksum = "b9ecd88a8c8378ca913a680cd98f0f13ac67383d35993f86c90a70e3f137816b" dependencies = [ "gimli", ] @@ -17,21 +19,15 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "ahash" -version = "0.6.3" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "796540673305a66d127804eef19ad696f1f204b8c1025aaca4958c17eab32877" +checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" dependencies = [ "getrandom", "once_cell", "version_check", ] -[[package]] -name = "array-macro" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06e97b4e522f9e55523001238ac59d13a8603af57f69980de5d8de4bbbe8ada6" - [[package]] name = "autocfg" version = "1.0.1" @@ -40,9 +36,9 @@ checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" [[package]] name = "backtrace" -version = "0.3.58" +version = "0.3.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88fb5a785d6b44fd9d6700935608639af1b8356de1e55d5f7c2740f4faa15d82" +checksum = "321629d8ba6513061f26707241fa9bc89524ff1cd7a915a97ef0c62c666ce1b6" dependencies = [ "addr2line", "cc", @@ -53,33 +49,21 @@ dependencies = [ "rustc-demangle", ] -[[package]] -name = "base-x" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4521f3e3d031370679b3b140beb36dfe4801b09ac77e30c61941f97df3ef28b" - [[package]] name = "bitflags" -version = "1.2.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bstr" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90682c8d613ad3373e66de8c6411e0ae2ab2571e879d2efbf73558cc66f21279" +checksum = "ba3569f383e8f1598449f1a423e72e99569137b47740b1da11ef19af3d5c3223" dependencies = [ "memchr", ] -[[package]] -name = "bumpalo" -version = "3.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63396b8a4b9de3f4fdfb320ab6080762242f66a8ef174c49d8e19b674db4cdbe" - [[package]] name = "byteorder" version = "1.4.3" @@ -88,9 +72,9 @@ checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" [[package]] name = "cc" -version = "1.0.67" +version = "1.0.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3c69b077ad434294d3ce9f1f6143a2a4b89a8a2d54ef813d85003a4fd1137fd" +checksum = "22a9137b95ea06864e018375b72adfb7db6e6f68cfc8df5a04d00288050485ee" [[package]] name = "cfg-if" @@ -98,30 +82,11 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" -[[package]] -name = "chrono" -version = "0.4.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" -dependencies = [ - "libc", - "num-integer", - "num-traits", - "time 0.1.43", - "winapi", -] - -[[package]] -name = "const_fn" -version = "0.4.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "402da840495de3f976eaefc3485b7f5eb5b0bf9761f9a47be27fe975b3b8c2ec" - [[package]] name = "crossbeam-channel" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ed27e177f16d65f0f0c22a213e17c696ace5dd64b14258b52f9417ccb52db4" +checksum = "e54ea8bc3fb1ee042f5aace6e3c6e025d3874866da222930f70ce62aceba0bfa" dependencies = [ "cfg-if", "crossbeam-utils", @@ -129,45 +94,44 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.4" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4feb231f0d4d6af81aed15928e58ecf5816aa62a2393e2c82f46973e92a9a278" +checksum = "cfcae03edb34f947e64acdb1c33ec169824e20657e9ecb61cef6c8c74dcb8120" dependencies = [ - "autocfg", "cfg-if", "lazy_static", ] [[package]] name = "crossterm" -version = "0.19.0" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c36c10130df424b2f3552fcc2ddcd9b28a27b1e54b358b45874f88d1ca6888c" +checksum = "c85525306c4291d1b73ce93c8acf9c339f9b213aef6c1d85c3830cbf1c16325c" dependencies = [ "bitflags", "crossterm_winapi", - "lazy_static", "libc", "mio", "parking_lot", - "signal-hook 0.1.17", + "signal-hook", + "signal-hook-mio", "winapi", ] [[package]] name = "crossterm_winapi" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0da8964ace4d3e4a044fd027919b2237000b24315a37c916f61809f1ff2140b9" +checksum = "2ae1b35a484aa10e07fe0638d02301c5ad24de82d310ccbd2f3693da5f09bf1c" dependencies = [ "winapi", ] [[package]] name = "cursive" -version = "0.16.3" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6593c3409eb794bf22090bec60dda1e19d1def284478bec7e5a92da3cf977c52" +checksum = "ca536d245342f6c005e7547ab640e444a3dc2fc0319a92124c8c1cbff025e775" dependencies = [ "ahash", "cfg-if", @@ -179,40 +143,37 @@ dependencies = [ "log", "maplit", "ncurses", - "signal-hook 0.3.8", + "signal-hook", "term_size", "unicode-segmentation", "unicode-width", - "wasmer_enumset", ] [[package]] name = "cursive_core" -version = "0.2.2" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "025ac0bcd21ced752d27b70e6aa2285a3513d07b5a0c7f89e71121d20ca1429d" +checksum = "e27fbda42833e46148ff28db338f6189a4407e4a38ba1f4105e2f623089e66a0" dependencies = [ "ahash", - "chrono", "crossbeam-channel", "enum-map", + "enumset", "lazy_static", - "libc", "log", "num", "owning_ref", - "syn", + "time", "unicode-segmentation", "unicode-width", - "wasmer_enumset", "xi-unicode", ] [[package]] name = "darling" -version = "0.10.2" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d706e75d87e35569db781a9b5e2416cff1236a47ed380831f959382ccd5f858" +checksum = "d0d720b8683f8dd83c65155f0530560cba68cd2bf395f6513a483caee57ff7f4" dependencies = [ "darling_core", "darling_macro", @@ -220,9 +181,9 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.10.2" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0c960ae2da4de88a91b2d920c2a7233b400bc33cb28453a2987822d8392519b" +checksum = "7a340f241d2ceed1deb47ae36c4144b2707ec7dd0b649f894cb39bb595986324" dependencies = [ "fnv", "ident_case", @@ -234,9 +195,9 @@ dependencies = [ [[package]] name = "darling_macro" -version = "0.10.2" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b5a2f4ac4969822c62224815d069952656cadc7084fdca9751e6d959189b72" +checksum = "72c41b3b7352feb3211a0d743dc5700a4e3b60f51bd2b368892d1e0f9a95f44b" dependencies = [ "darling_core", "quote", @@ -245,9 +206,9 @@ dependencies = [ [[package]] name = "directories" -version = "3.0.2" +version = "4.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e69600ff1703123957937708eb27f7a564e48885c537782722ed0ba3189ce1d7" +checksum = "f51c5d4ddabd36886dd3e1438cb358cdcb0d7c499cb99cb4ac2e38e18b5cb210" dependencies = [ "dirs-sys", ] @@ -263,33 +224,56 @@ dependencies = [ "winapi", ] -[[package]] -name = "discard" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "212d0f5754cb6769937f4501cc0e67f4f4483c8d2c3e1e922ee9edbe4ab4c7c0" - [[package]] name = "enum-map" -version = "0.6.4" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4187999839f4ae8be35cf185d1381aa8dc32d2f5951349cc37ae49ebc4781855" +checksum = "9ec3484df47a85c121b9d8fbf265ca7eedc26a5c4c341db7cf800876201c766f" dependencies = [ - "array-macro", "enum-map-derive", ] [[package]] name = "enum-map-derive" -version = "0.4.6" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8182c0d26a908f001a23adc388fcef7fde884fbaf668874126cd5a3c13ca299e" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "enumset" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6216d2c19a6fb5f29d1ada1dc7bc4367a8cbf0fa4af5cf12e07b5bbdde6b5b2c" +dependencies = [ + "enumset_derive", +] + +[[package]] +name = "enumset_derive" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5c450cf304c9e18d45db562025a14fb1ca0f5c769b6f609309f81d4c31de455" +checksum = "6451128aa6655d880755345d085494cf7561a6bee7c8dc821e5d77e6d267ecd4" dependencies = [ + "darling", "proc-macro2", "quote", "syn", ] +[[package]] +name = "fastrand" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "779d043b6a0b90cc4c0ed7ee380a6504394cee7efd7db050e3774eee387324b2" +dependencies = [ + "instant", +] + [[package]] name = "fnv" version = "1.0.7" @@ -298,9 +282,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "getrandom" -version = "0.2.2" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9495705279e7140bf035dde1f6e750c162df8b625267cd52cc44e0b156732c8" +checksum = "418d37c8b1d42553c93648be529cb70f920d3baf8ef469b74b9638df426e0b4c" dependencies = [ "cfg-if", "libc", @@ -309,9 +293,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.23.0" +version = "0.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6503fe142514ca4799d4c26297c4248239fe8838d827db6bd6065c6ed29a6ce" +checksum = "78cc372d058dcf6d5ecd98510e7fbc9e5aec4d21de70f65fea8fecebcd881bd4" [[package]] name = "ident_case" @@ -321,18 +305,18 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "instant" -version = "0.1.9" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61124eeebbd69b8190558df225adf7e4caafce0d743919e5d6b19652314ec5ec" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" dependencies = [ "cfg-if", ] [[package]] name = "itoa" -version = "0.4.7" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" +checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" [[package]] name = "lazy_static" @@ -342,15 +326,15 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.94" +version = "0.2.113" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18794a8ad5b29321f790b55d93dfba91e125cb1a9edbd4f8e3150acc771c1a5e" +checksum = "eef78b64d87775463c549fbd80e19249ef436ea3bf1de2a1eb7e717ec7fab1e9" [[package]] name = "lock_api" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0382880606dff6d15c9476c416d18690b72742aa7b605bb6dd6ec9030fbf07eb" +checksum = "712a4d093c9976e24e7dbca41db895dabcbac38eb5f4045393d17a95bdfb1109" dependencies = [ "scopeguard", ] @@ -372,9 +356,9 @@ checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" [[package]] name = "memchr" -version = "2.4.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b16bd47d9e329435e309c58469fe0791c2d0d1ba96ec0954152a5ae2b04387dc" +checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" [[package]] name = "miniz_oxide" @@ -388,9 +372,9 @@ dependencies = [ [[package]] name = "mio" -version = "0.7.11" +version = "0.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf80d3e903b34e0bd7282b218398aec54e082c840d9baf8339e0080a0c542956" +checksum = "8067b404fe97c70829f082dec8bcf4f71225d7eaea1d8645349cb76fa06205cc" dependencies = [ "libc", "log", @@ -430,9 +414,9 @@ dependencies = [ [[package]] name = "num" -version = "0.3.1" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b7a8e9be5e039e2ff869df49155f1c06bd01ade2117ec783e56ab0932b67a8f" +checksum = "43db66d1170d347f9a065114077f7dccb00c1b9478c89384490a3425279a4606" dependencies = [ "num-complex", "num-integer", @@ -443,9 +427,9 @@ dependencies = [ [[package]] name = "num-complex" -version = "0.3.1" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "747d632c0c558b87dbabbe6a82f3b4ae03720d0646ac5b7b4dae89394be5f2c5" +checksum = "26873667bbbb7c5182d4a37c1add32cdf09f841af72da53318fdb81543c15085" dependencies = [ "num-traits", ] @@ -473,9 +457,9 @@ dependencies = [ [[package]] name = "num-rational" -version = "0.3.2" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12ac428b1cb17fce6f731001d307d351ec70a6d202fc2e60f7d4c5e42d8f4f07" +checksum = "d41702bd167c2df5520b384281bc111a4b5efcf7fbc4c9c222c815b07e0a6a6a" dependencies = [ "autocfg", "num-integer", @@ -493,15 +477,18 @@ dependencies = [ [[package]] name = "object" -version = "0.23.0" +version = "0.27.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9a7ab5d64814df0fe4a4b5ead45ed6c5f181ee3ff04ba344313a6c80446c5d4" +checksum = "67ac1d3f9a1d3616fd9a60c8d74296f22406a238b6a72f5cc1e6f314df4ffbf9" +dependencies = [ + "memchr", +] [[package]] name = "once_cell" -version = "1.7.2" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af8b08b04175473088b46763e51ee54da5f9a164bc162f615b91bc179dbf15a3" +checksum = "da32515d9f6e6e489d7bc9d84c71b060db7247dc035bbe44eac88cf87486d8d5" [[package]] name = "owning_ref" @@ -514,9 +501,9 @@ dependencies = [ [[package]] name = "parking_lot" -version = "0.11.1" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d7744ac029df22dca6284efe4e898991d28e3085c706c972bcd7da4a27a15eb" +checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" dependencies = [ "instant", "lock_api", @@ -525,9 +512,9 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7a782938e745763fe6907fc6ba86946d72f49fe7e21de074e08128a99fb018" +checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216" dependencies = [ "cfg-if", "instant", @@ -539,85 +526,33 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3831453b3449ceb48b6d9c7ad7c96d5ea673e9b470a1dc578c2ce6521230884c" - -[[package]] -name = "ppv-lite86" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" - -[[package]] -name = "proc-macro-hack" -version = "0.5.19" +version = "0.3.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" +checksum = "58893f751c9b0412871a09abd62ecd2a00298c6c83befa223ef98c52aef40cbe" [[package]] name = "proc-macro2" -version = "1.0.26" +version = "1.0.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a152013215dca273577e18d2bf00fa862b89b24169fb78c4c95aeb07992c9cec" +checksum = "c7342d5883fbccae1cc37a2353b09c87c9b0f3afd73f5fb9bba687a1f733b029" dependencies = [ "unicode-xid", ] [[package]] name = "quote" -version = "1.0.9" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" +checksum = "47aa80447ce4daf1717500037052af176af5d38cc3e571d9ec1c7353fc10c87d" dependencies = [ "proc-macro2", ] -[[package]] -name = "rand" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e" -dependencies = [ - "libc", - "rand_chacha", - "rand_core", - "rand_hc", -] - -[[package]] -name = "rand_chacha" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34cf66eb183df1c5876e2dcf6b13d57340741e8dc255b48e40a26de954d06ae7" -dependencies = [ - "getrandom", -] - -[[package]] -name = "rand_hc" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3190ef7066a446f2e7f42e239d161e905420ccab01eb967c9eb27d21b2322a73" -dependencies = [ - "rand_core", -] - [[package]] name = "redox_syscall" -version = "0.2.7" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85dd92e586f7355c633911e11f77f3d12f04b1b1bd76a198bd34ae3af8341ef2" +checksum = "8383f39639269cde97d255a32bdb68c047337295414940c68bdd30c2e13203ff" dependencies = [ "bitflags", ] @@ -662,9 +597,9 @@ dependencies = [ [[package]] name = "rmp-serde" -version = "0.15.4" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "839395ef53057db96b84c9238ab29e1a13f2e5c8ec9f66bef853ab4197303924" +checksum = "f3eedffbfcc6a428f230c04baf8f59bd73c1781361e4286111fe900849aaddaf" dependencies = [ "byteorder", "rmp", @@ -673,24 +608,9 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e3bad0ee36814ca07d7968269dd4b7ec89ec2da10c4bb613928d3077083c232" - -[[package]] -name = "rustc_version" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" -dependencies = [ - "semver", -] - -[[package]] -name = "ryu" -version = "1.0.5" +version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" +checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342" [[package]] name = "scopeguard" @@ -698,90 +618,58 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" -[[package]] -name = "semver" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" -dependencies = [ - "semver-parser", -] - -[[package]] -name = "semver-parser" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" - [[package]] name = "serde" -version = "1.0.125" +version = "1.0.133" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "558dc50e1a5a5fa7112ca2ce4effcb321b0300c0d4ccf0776a9f60cd89031171" +checksum = "97565067517b60e2d1ea8b268e59ce036de907ac523ad83a0475da04e818989a" [[package]] name = "serde_derive" -version = "1.0.125" +version = "1.0.133" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b093b7a2bb58203b5da3056c05b4ec1fed827dcfdb37347a8841695263b3d06d" +checksum = "ed201699328568d8d08208fdd080e3ff594e6c422e438b6705905da01005d537" dependencies = [ "proc-macro2", "quote", "syn", ] -[[package]] -name = "serde_json" -version = "1.0.64" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "799e97dc9fdae36a5c8b8f2cae9ce2ee9fdce2058c57a93e6099d919fd982f79" -dependencies = [ - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "sha1" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" - [[package]] name = "signal-hook" -version = "0.1.17" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e31d442c16f047a671b5a71e2161d6e68814012b7f5379d269ebd915fac2729" +checksum = "647c97df271007dcea485bb74ffdb57f2e683f1306c854f468a0c244badabf2d" dependencies = [ "libc", - "mio", "signal-hook-registry", ] [[package]] -name = "signal-hook" -version = "0.3.8" +name = "signal-hook-mio" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef33d6d0cd06e0840fba9985aab098c147e67e05cee14d412d3345ed14ff30ac" +checksum = "29fd5867f1c4f2c5be079aee7a2adf1152ebb04a4bc4d341f504b7dece607ed4" dependencies = [ "libc", - "signal-hook-registry", + "mio", + "signal-hook", ] [[package]] name = "signal-hook-registry" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16f1d0fef1604ba8f7a073c7e701f213e056707210e9020af4528e0101ce11a6" +checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" dependencies = [ "libc", ] [[package]] name = "smallvec" -version = "1.6.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" +checksum = "f2dd574626839106c320a323308629dcb1acfc96e32a8cba364ddc61ac23ee83" [[package]] name = "stable_deref_trait" @@ -789,75 +677,17 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" -[[package]] -name = "standback" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e113fb6f3de07a243d434a56ec6f186dfd51cb08448239fe7bcae73f87ff28ff" -dependencies = [ - "version_check", -] - -[[package]] -name = "stdweb" -version = "0.4.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d022496b16281348b52d0e30ae99e01a73d737b2f45d38fed4edf79f9325a1d5" -dependencies = [ - "discard", - "rustc_version", - "stdweb-derive", - "stdweb-internal-macros", - "stdweb-internal-runtime", - "wasm-bindgen", -] - -[[package]] -name = "stdweb-derive" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c87a60a40fccc84bef0652345bbbbbe20a605bf5d0ce81719fc476f5c03b50ef" -dependencies = [ - "proc-macro2", - "quote", - "serde", - "serde_derive", - "syn", -] - -[[package]] -name = "stdweb-internal-macros" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58fa5ff6ad0d98d1ffa8cb115892b6e69d67799f6763e162a1c9db421dc22e11" -dependencies = [ - "base-x", - "proc-macro2", - "quote", - "serde", - "serde_derive", - "serde_json", - "sha1", - "syn", -] - -[[package]] -name = "stdweb-internal-runtime" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "213701ba3370744dcd1a12960caa4843b3d68b4d1c0a5d575e0d65b2ee9d16c0" - [[package]] name = "strsim" -version = "0.9.3" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6446ced80d6c486436db5c078dde11a9f73d42b57fb273121e160b84f63d894c" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] name = "syn" -version = "1.0.71" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad184cc9470f9117b2ac6817bfe297307418819ba40552f9b3846f05c33d5373" +checksum = "8a65b3f4ffa0092e9887669db0eae07941f023991ab58ea44da8fe8e2d511c6b" dependencies = [ "proc-macro2", "quote", @@ -866,13 +696,13 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.2.0" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22" +checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" dependencies = [ "cfg-if", + "fastrand", "libc", - "rand", "redox_syscall", "remove_dir_all", "winapi", @@ -890,63 +720,25 @@ dependencies = [ [[package]] name = "time" -version = "0.1.43" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438" +checksum = "41effe7cfa8af36f439fac33861b66b049edc6f9a32331e2312660529c1c24ad" dependencies = [ + "itoa", "libc", - "winapi", -] - -[[package]] -name = "time" -version = "0.2.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08a8cbfbf47955132d0202d1662f49b2423ae35862aee471f3ba4b133358f372" -dependencies = [ - "const_fn", - "libc", - "standback", - "stdweb", - "time-macros", - "version_check", - "winapi", -] - -[[package]] -name = "time-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "957e9c6e26f12cb6d0dd7fc776bb67a706312e7299aed74c8dd5b17ebb27e2f1" -dependencies = [ - "proc-macro-hack", - "time-macros-impl", -] - -[[package]] -name = "time-macros-impl" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5c3be1edfad6027c69f5491cf4cb310d1a71ecd6af742788c6ff8bced86b8fa" -dependencies = [ - "proc-macro-hack", - "proc-macro2", - "quote", - "standback", - "syn", ] [[package]] name = "unicode-segmentation" -version = "1.7.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb0d2e7be6ae3a5fa87eed5fb451aff96f2573d2694942e40543ae0bbe19c796" +checksum = "8895849a949e7845e06bd6dc1aa51731a103c42707010a5b591c0038fb73385b" [[package]] name = "unicode-width" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3" +checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" [[package]] name = "unicode-xid" @@ -956,9 +748,9 @@ checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" [[package]] name = "version_check" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "wasi" @@ -966,82 +758,6 @@ version = "0.10.2+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" -[[package]] -name = "wasm-bindgen" -version = "0.2.73" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83240549659d187488f91f33c0f8547cbfef0b2088bc470c116d1d260ef623d9" -dependencies = [ - "cfg-if", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.73" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae70622411ca953215ca6d06d3ebeb1e915f0f6613e3b495122878d7ebec7dae" -dependencies = [ - "bumpalo", - "lazy_static", - "log", - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.73" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e734d91443f177bfdb41969de821e15c516931c3c3db3d318fa1b68975d0f6f" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.73" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d53739ff08c8a68b0fdbcd54c372b8ab800b1449ab3c9d706503bc7dd1621b2c" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.73" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9a543ae66aa233d14bb765ed9af4a33e81b8b58d1584cf1b47ff8cd0b9e4489" - -[[package]] -name = "wasmer_enumset" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf088cc1f7d247fd96dff0df46fb1bbb747d8a69ae1ecd71aed55c55e354b2d8" -dependencies = [ - "num-traits", - "wasmer_enumset_derive", -] - -[[package]] -name = "wasmer_enumset_derive" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8d1b32d98e11194200baf6d3f85eb2d6cfe56f6d9af0dd617f90ca48f958a88" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "winapi" version = "0.3.9" @@ -1083,6 +799,6 @@ dependencies = [ "serde", "serde_derive", "tempfile", - "time 0.2.26", + "time", "unicode-width", ] diff --git a/Cargo.toml b/Cargo.toml index e740232..d8e65e1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -27,22 +27,22 @@ opt-level = 's' panic = "abort" [dependencies] -cursive = { version = "0.16.3", default-features = false } -unicode-width = "0.1.8" -directories = "3.0.2" -rmp-serde = "0.15.4" -serde = "1.0.125" -serde_derive = "1.0.125" -backtrace = "0.3.58" -time = "0.2.26" -bstr = { version = "0.2.16", default-features = false, features = ["std"] } +cursive = { version = "0.17", default-features = false } +unicode-width = "0.1" +directories = "4.0" +rmp-serde = "1.0" +serde = "1.0" +serde_derive = "1.0" +backtrace = "0.3" +time = "0.3" +bstr = { version = "0.2", default-features = false, features = ["std"] } [target.'cfg(target_os = "linux")'.dependencies] rio = "0.9.4" #wl-clipboard-rs = "0.2.0" # Wayland clipboard integration. [dev-dependencies] -tempfile = "3.2.0" +tempfile = "3.2" [features] default = ["cursive/ncurses-backend"] From 5225805eb4458ae60b872b312366f56f3e6c09ac Mon Sep 17 00:00:00 2001 From: Adam Lesperance Date: Thu, 20 Jan 2022 18:35:01 -0600 Subject: [PATCH 2/4] Clippy changes --- src/file_search.rs | 8 +++++--- src/search_dialog.rs | 10 +++++----- src/utilities.rs | 6 +++--- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/file_search.rs b/src/file_search.rs index 82be6f0..16d2fdb 100644 --- a/src/file_search.rs +++ b/src/file_search.rs @@ -8,9 +8,11 @@ const BUFFER_SIZE: usize = 1024 * 1024; #[cfg(target_os = "linux")] pub fn search(mut file: File, bytes: &[u8], mut consumer: F) - where F: FnMut(u64) { - if async_io_search(&mut file, &bytes, &mut consumer).is_err() { - sync_io_search(&mut file, &bytes, &mut consumer); +where + F: FnMut(u64), +{ + if async_io_search(&mut file, bytes, &mut consumer).is_err() { + sync_io_search(&mut file, bytes, &mut consumer); } } diff --git a/src/search_dialog.rs b/src/search_dialog.rs index 4508605..ccb7d2d 100644 --- a/src/search_dialog.rs +++ b/src/search_dialog.rs @@ -86,13 +86,13 @@ fn hex_to_bytes(hex_text: &mut String, bytes: &mut Vec) -> bool { }; if let Ok(mut byte_value) = u8::from_str_radix(byte, 16) { if byte.len() == 1 { - byte_value = byte_value << 4; + byte_value <<= 4; } bytes.push(byte_value); i += 2; } else { // Remove characters that cannot be parsed as hexadecimal. - if let Ok(_) = u8::from_str_radix(&byte[0..=0], 16) { + if u8::from_str_radix(&byte[0..=0], 16).is_ok() { hex_text.remove(i + 1); } else { hex_text.remove(i); @@ -100,13 +100,13 @@ fn hex_to_bytes(hex_text: &mut String, bytes: &mut Vec) -> bool { modified = true; } } - return modified; + modified } fn update_companion_accessibility(text: &str, v: &mut EditView) { - if text.len() > 0 && v.is_enabled() { + if !text.is_empty() && v.is_enabled() { v.disable(); - } else if text.len() == 0 && !v.is_enabled() { + } else if text.is_empty() && !v.is_enabled() { v.enable(); } } diff --git a/src/utilities.rs b/src/utilities.rs index c4badfd..32327e4 100644 --- a/src/utilities.rs +++ b/src/utilities.rs @@ -14,12 +14,12 @@ pub const PKG_DESCRIPTION: &str = env!("CARGO_PKG_DESCRIPTION"); pub const PKG_REPOSITORY: &str = env!("CARGO_PKG_REPOSITORY"); pub fn parse_number(number_str: &str) -> Result { - if number_str.starts_with("0x") { - u64::from_str_radix(&number_str[2..], 16) + if let Some(stripped) = number_str.strip_prefix("0x") { + u64::from_str_radix(stripped, 16) } else if number_str.starts_with('0') { u64::from_str_radix(number_str, 8) } else { - u64::from_str_radix(number_str, 10) + number_str.parse::() } } From 248430c37e0a99cda49e23731ec20bc757403f77 Mon Sep 17 00:00:00 2001 From: Adam Lesperance Date: Thu, 20 Jan 2022 18:40:09 -0600 Subject: [PATCH 3/4] Rust fmt --- src/byte_reader.rs | 41 +++++++----- src/file_search.rs | 29 +++++---- src/goto_dialog.rs | 11 +++- src/help_text.rs | 14 ++-- src/hex_reader.rs | 133 ++++++++++++++++++++------------------ src/hex_view.rs | 131 ++++++++++++++++++++----------------- src/hex_view_printers.rs | 34 ++++++---- src/main.rs | 36 +++++------ src/open_file_dialog.rs | 10 ++- src/panic_hook.rs | 40 +++++++++--- src/search_dialog.rs | 38 ++++++----- src/set_width_dialog.rs | 4 +- src/switch_file_dialog.rs | 12 ++-- src/xxv_state.rs | 58 +++++++++-------- src/xxv_tui.rs | 8 +-- 15 files changed, 333 insertions(+), 266 deletions(-) diff --git a/src/byte_reader.rs b/src/byte_reader.rs index 2d36566..8a4b260 100644 --- a/src/byte_reader.rs +++ b/src/byte_reader.rs @@ -11,7 +11,7 @@ pub struct TilingByteReader { path: PathBuf, length: u64, use_large_addresses: bool, - display_name: String + display_name: String, } pub type Window = (u64, u64, u16, u16); @@ -28,10 +28,10 @@ impl TilingByteReader { path: path_buf, length: file_len, use_large_addresses: file_len > u64::from(std::u32::MAX), - display_name + display_name, }) } - + pub fn reopen(&mut self) -> Result<()> { self.file = self.open_file()?; self.length = self.file.metadata()?.len(); @@ -45,12 +45,17 @@ impl TilingByteReader { pub fn file_name(&self) -> &str { &self.display_name } - + pub fn get_path_clone(&self) -> PathBuf { self.path.clone() } - pub fn get_window(&mut self, window: Window, line_length: u64, buf: &mut Vec) -> Result<()> { + pub fn get_window( + &mut self, + window: Window, + line_length: u64, + buf: &mut Vec, + ) -> Result<()> { // The binary file is viewed in terms of lines. // The lines turn the linear byte sequence into a 2D byte grid. // Each line may be significantly longer than what can fit in the window. @@ -71,11 +76,11 @@ impl TilingByteReader { } Ok(()) } - + pub fn get_length(&self) -> u64 { self.length } - + pub fn use_large_addresses(&self) -> bool { self.use_large_addresses } @@ -96,40 +101,42 @@ mod tests { let mut reader = TilingByteReader::new(tmpf.path()).unwrap(); let mut buf = Vec::new(); - reader.get_window((0,0,16,16).into(), 16, &mut buf).unwrap(); + reader + .get_window((0, 0, 16, 16).into(), 16, &mut buf) + .unwrap(); assert_eq!(buf, b"01234567") } - + #[test] fn getting_multi_line_string_top_left() { let mut tmpf = tempfile::NamedTempFile::new().unwrap(); tmpf.write(b"0123456789abcdef").unwrap(); - + let mut reader = TilingByteReader::new(tmpf.path()).unwrap(); let mut buf = Vec::new(); - reader.get_window((0,0,4,2), 8, &mut buf).unwrap(); + reader.get_window((0, 0, 4, 2), 8, &mut buf).unwrap(); assert_eq!(buf, b"012389ab") } - + #[test] fn getting_multi_line_string_top_right() { let mut tmpf = tempfile::NamedTempFile::new().unwrap(); tmpf.write(b"0123456789abcdef").unwrap(); - + let mut reader = TilingByteReader::new(tmpf.path()).unwrap(); let mut buf = Vec::new(); - reader.get_window((4,0,4,2), 8, &mut buf).unwrap(); + reader.get_window((4, 0, 4, 2), 8, &mut buf).unwrap(); assert_eq!(buf, b"4567cdef") } - + #[test] fn getting_multi_line_string_bottom_left() { let mut tmpf = tempfile::NamedTempFile::new().unwrap(); tmpf.write(b"0123456789abcdef").unwrap(); - + let mut reader = TilingByteReader::new(tmpf.path()).unwrap(); let mut buf = Vec::new(); - reader.get_window((0,1,4,2), 8, &mut buf).unwrap(); + reader.get_window((0, 1, 4, 2), 8, &mut buf).unwrap(); assert_eq!(buf, b"89ab") } } diff --git a/src/file_search.rs b/src/file_search.rs index 16d2fdb..e585e5d 100644 --- a/src/file_search.rs +++ b/src/file_search.rs @@ -18,21 +18,25 @@ where #[cfg(not(target_os = "linux"))] pub fn search(mut file: File, bytes: &[u8], mut consumer: F) - where F: FnMut(u64) { +where + F: FnMut(u64), +{ sync_io_search(&mut file, &bytes, &mut consumer); } #[cfg(target_os = "linux")] fn async_io_search(file: &mut File, bytes: &[u8], consumer: &mut F) -> Result<()> - where F: FnMut(u64) { +where + F: FnMut(u64), +{ use std::collections::VecDeque; - + let file_len = file.metadata()?.len(); if file_len <= u64::try_from(BUFFER_SIZE).unwrap() { sync_io_search(file, bytes, consumer); return Ok(()); } - + let finder = Finder::new(bytes); let needle_size = bytes.len(); let queue_depth = 32; @@ -40,7 +44,7 @@ fn async_io_search(file: &mut File, bytes: &[u8], consumer: &mut F) -> Result let config = rio::Config::default(); let io = config.start()?; let buffers = vec![vec![0; BUFFER_SIZE]; queue_depth]; - + let mut queue = VecDeque::with_capacity(queue_depth); for buf in &buffers { let cqe = io.read_at(file, buf, read_pos); @@ -61,18 +65,20 @@ fn async_io_search(file: &mut File, bytes: &[u8], consumer: &mut F) -> Result read_pos += u64::try_from(BUFFER_SIZE - needle_size + 1).unwrap(); } } - + Ok(()) } fn sync_io_search(file: &mut File, bytes: &[u8], consumer: &mut F) - where F: FnMut(u64) { +where + F: FnMut(u64), +{ let finder = Finder::new(bytes); let needle_size = bytes.len(); let mut buf = vec![0; BUFFER_SIZE]; let mut num_bytes = file.read(&mut buf).unwrap(); let mut pos = 0; - + while num_bytes > needle_size { let mut offset = 0; while let Some(p) = finder.find(&buf[offset..num_bytes]) { @@ -101,7 +107,7 @@ mod tests { search(file, b"aba", |hit| output.push(hit)); assert_eq!(output, vec![0, 2]); } - + #[test] fn sync_io_search_in_big_file() { let mut file = tempfile::tempfile().unwrap(); @@ -112,7 +118,7 @@ mod tests { assert_eq!(counter, 3); } - + #[cfg(target_os = "linux")] #[test] fn async_io_search_in_big_file() { @@ -130,7 +136,8 @@ mod tests { fn prepare_big_file(file: &mut File) { let file_len = u64::try_from(BUFFER_SIZE * 2 + (BUFFER_SIZE >> 1)).unwrap(); file.set_len(file_len).unwrap(); - file.seek(SeekFrom::Start(u64::try_from(BUFFER_SIZE - 3).unwrap())).unwrap(); + file.seek(SeekFrom::Start(u64::try_from(BUFFER_SIZE - 3).unwrap())) + .unwrap(); file.write(b"Pokemon PokPokemon").unwrap(); file.seek(SeekFrom::Start(file_len - 7)).unwrap(); file.write(b"Pokemon").unwrap(); diff --git a/src/goto_dialog.rs b/src/goto_dialog.rs index d8b5361..612d77d 100644 --- a/src/goto_dialog.rs +++ b/src/goto_dialog.rs @@ -1,11 +1,11 @@ use cursive::event::Key; -use cursive::traits::{Resizable, Nameable}; +use cursive::traits::{Nameable, Resizable}; use cursive::views::{Dialog, DummyView, EditView, LinearLayout, OnEventView, TextView}; use cursive::Cursive; use crate::hex_view::HexView; use crate::utilities::{get_content, parse_number_or_zero}; -use crate::xxv_tui::{OBJ_HEX_VIEW, OBJ_GOTO_OFFSET, OBJ_GOTO_MUL1, OBJ_GOTO_MUL2}; +use crate::xxv_tui::{OBJ_GOTO_MUL1, OBJ_GOTO_MUL2, OBJ_GOTO_OFFSET, OBJ_HEX_VIEW}; pub fn open_goto_dialog(s: &mut Cursive) { let (line_width, length) = s @@ -23,7 +23,12 @@ pub fn open_goto_dialog(s: &mut Cursive) { .min_width(18), ) .child(TextView::new(" + ")) - .child(EditView::new().content("0").with_name(OBJ_GOTO_MUL1).min_width(18)) + .child( + EditView::new() + .content("0") + .with_name(OBJ_GOTO_MUL1) + .min_width(18), + ) .child(TextView::new(" * ")) .child( EditView::new() diff --git a/src/help_text.rs b/src/help_text.rs index 5201842..41a45dc 100644 --- a/src/help_text.rs +++ b/src/help_text.rs @@ -1,16 +1,14 @@ -use cursive::Cursive; -use cursive::views::{TextView, Dialog, ScrollView, OnEventView}; use cursive::event::Key; +use cursive::views::{Dialog, OnEventView, ScrollView, TextView}; +use cursive::Cursive; const HELP_TEXT: &str = include_str!("help_text.md"); pub fn show_help(s: &mut Cursive) { let text_view = TextView::new(HELP_TEXT); - let dialog = Dialog::around(ScrollView::new(text_view)) - .dismiss_button("Ok"); - let esc_view = OnEventView::new(dialog) - .on_event(Key::Esc, |s| { - s.pop_layer(); - }); + let dialog = Dialog::around(ScrollView::new(text_view)).dismiss_button("Ok"); + let esc_view = OnEventView::new(dialog).on_event(Key::Esc, |s| { + s.pop_layer(); + }); s.add_layer(esc_view); } diff --git a/src/hex_reader.rs b/src/hex_reader.rs index d9c2f92..60d7b2e 100644 --- a/src/hex_reader.rs +++ b/src/hex_reader.rs @@ -3,10 +3,10 @@ use std::io::Result; use std::path::PathBuf; use crate::byte_reader::TilingByteReader; +use crate::file_search; use crate::hex_tables::*; -use std::collections::btree_map::{BTreeMap, Range}; use crate::hex_view_printers::TableSet; -use crate::file_search; +use std::collections::btree_map::{BTreeMap, Range}; #[derive(Copy, Clone, Debug)] pub enum VisualMode { @@ -24,23 +24,23 @@ pub enum Highlight { pub trait OffsetsVisitor { fn offset(&mut self, offset: &str); - + fn end(&mut self); } pub trait HexVisitor { fn byte(&mut self, index: usize, highlight: Highlight); - + fn group(&mut self); - + fn next_line(&mut self); - + fn end(&mut self); } #[derive(Debug)] struct Highlights { - highlight: BTreeMap, + highlight: BTreeMap, highlight_width: u64, } @@ -51,19 +51,19 @@ impl Highlights { highlight_width: 0, } } - + fn clear(&mut self) { self.highlight.clear(); self.highlight_width = 0; } - + fn insert(&mut self, offset: u64, width: u64, highlight: Highlight) { self.highlight.insert(offset, (width, highlight)); if self.highlight_width < width { self.highlight_width = width; } } - + fn iter_from(&self, offset: u64) -> Range { let start = if offset > self.highlight_width { offset - self.highlight_width @@ -79,8 +79,8 @@ pub struct HexReader { reader: TilingByteReader, pub line_width: u64, pub group: u16, - pub window_pos: (u64,u64), - pub window_size: (u16,u16), + pub window_pos: (u64, u64), + pub window_size: (u16, u16), capture: Vec, before_image: Vec, highlight: Highlights, @@ -93,44 +93,49 @@ impl HexReader { reader, line_width: 16, group: 8, - window_pos: (0,0), - window_size: (16,32), + window_pos: (0, 0), + window_size: (16, 32), capture: Vec::new(), before_image: Vec::new(), highlight: Highlights::new(), - vis_mode: VisualMode::Unicode + vis_mode: VisualMode::Unicode, }) } - + pub fn reopen(&mut self) -> Result<()> { self.reader.reopen() } - + pub fn file_name(&self) -> &str { self.reader.file_name() } - + pub fn get_path(&self) -> PathBuf { self.reader.get_path_clone() } - + pub fn get_length(&self) -> u64 { self.reader.get_length() } pub fn get_row_offsets_width(&self) -> usize { - if self.reader.use_large_addresses() { 16 + 2 } else { 8 + 2 } + if self.reader.use_large_addresses() { + 16 + 2 + } else { + 8 + 2 + } } pub fn get_lines_in_file(&self) -> u64 { self.reader.get_length() / self.line_width } - + pub fn capture(&mut self) -> Result<()> { let (x, y) = self.window_pos; let (w, h) = self.window_size; self.capture.clear(); - self.reader.get_window((x, y, w, h), self.line_width, &mut self.capture)?; + self.reader + .get_window((x, y, w, h), self.line_width, &mut self.capture)?; if !self.before_image.is_empty() { self.compute_window_diff(); @@ -139,32 +144,34 @@ impl HexReader { Ok(()) } - + fn compute_window_diff(&mut self) { let line_cap = u64::from(self.window_size.0); let line_width = self.line_width; let mut line_offset = line_width * self.window_pos.1 + self.window_pos.0; - + let mut before_itr = self.before_image.iter(); - let mut after_itr = self.capture.iter(); + let after_itr = self.capture.iter(); let mut i = 0; let mut begin_offset: Option = None; - while let Some(a) = after_itr.next() { + for a in after_itr { let offset = line_offset + i; - + if let Some(b) = before_itr.next() { if a != b && begin_offset.is_none() { begin_offset = Some(offset); } else if let Some(begin) = begin_offset { - self.highlight.insert(begin, offset - begin, Highlight::Negative); + self.highlight + .insert(begin, offset - begin, Highlight::Negative); } } else { if let Some(begin) = begin_offset { - self.highlight.insert(begin, offset - begin, Highlight::Negative); + self.highlight + .insert(begin, offset - begin, Highlight::Negative); } break; } - + i += 1; if i == line_cap { i = 0; @@ -172,20 +179,20 @@ impl HexReader { } } } - + pub fn capture_before_image(&mut self) { self.before_image.clear(); self.before_image.clone_from(&self.capture); } - + pub fn clear_highlights(&mut self) { self.highlight.clear(); } - + pub fn highlight(&mut self, offset: u64, width: u64, highlight: Highlight) { self.highlight.insert(offset, width, highlight); } - + pub fn visit_row_offsets(&self, visitor: &mut dyn OffsetsVisitor) { let w = usize::from(self.window_size.0); let h = usize::from(self.window_size.1); @@ -195,7 +202,7 @@ impl HexReader { capture_height += 1; } let height = u64::try_from(h.min(capture_height)).unwrap(); - + if self.reader.use_large_addresses() { for i in 0..height { let offset = base_offset + i * self.line_width; @@ -209,7 +216,7 @@ impl HexReader { } visitor.end(); } - + #[inline] pub fn visit_hex(&self, visitor: &mut dyn HexVisitor) { let capture = self.capture.as_slice(); @@ -227,7 +234,7 @@ impl HexReader { for b in capture { let offset = line_offset + i; - while let Some((&start, &(w,h))) = hl { + while let Some((&start, &(w, h))) = hl { if start + w <= offset { hl = hl_iter.next(); } else if start <= offset && offset < start + w { @@ -259,12 +266,12 @@ impl HexReader { visitor.end(); } - + fn vis_table(&self) -> &'static [&'static str; 256] { match self.vis_mode { VisualMode::Unicode => UNICODE_TEXT_TABLE, VisualMode::Ascii => ASCII_TEXT_TABLE, - VisualMode::Off => ASCII_TEXT_TABLE + VisualMode::Off => ASCII_TEXT_TABLE, } } @@ -280,15 +287,15 @@ impl HexReader { table_set.push_byte(&BYTE_CATEGORY[i], table[i]); } } - + pub fn set_visual_mode(&mut self, mode: VisualMode) { self.vis_mode = mode; } - + pub fn get_visual_mode(&self) -> &VisualMode { &self.vis_mode } - + pub fn search(&mut self, bytes: &[u8]) { let file = self.reader.open_file().unwrap(); let len = u64::try_from(bytes.len()).unwrap(); @@ -316,13 +323,13 @@ mod tests { self.pop(); } } - + impl HexVisitor for String { fn byte(&mut self, index: usize, highlight: Highlight) { self.push_str(BYTE_RENDER[index]); match highlight { - Highlight::Positive => self.push( '+' ), - Highlight::Negative => self.push( '-' ), + Highlight::Positive => self.push('+'), + Highlight::Negative => self.push('-'), _ => (), } self.push(' '); @@ -346,15 +353,15 @@ mod tests { self.pop(); } } - + #[test] fn getting_hex_of_file_top_left_window() { let mut tmpf = tempfile::NamedTempFile::new().unwrap(); tmpf.write(b"0123456789abcdef").unwrap(); - + let mut reader = HexReader::new(TilingByteReader::new(tmpf.path()).unwrap()).unwrap(); - reader.window_pos = (0,0); - reader.window_size = (2,2); + reader.window_pos = (0, 0); + reader.window_size = (2, 2); reader.line_width = 4; reader.capture().unwrap(); let mut hex = String::new(); @@ -364,19 +371,19 @@ mod tests { // 45 34 35 assert_eq!(hex, "30 31\n34 35") } - + #[test] fn getting_hex_of_file_with_highlight() { let mut tmpf = tempfile::NamedTempFile::new().unwrap(); tmpf.write(b"0123456789abcdef").unwrap(); - + let mut reader = HexReader::new(TilingByteReader::new(tmpf.path()).unwrap()).unwrap(); reader.highlight(1, 1, Highlight::Positive); reader.highlight(3, 1, Highlight::Positive); reader.highlight(4, 1, Highlight::Negative); reader.highlight(5, 1, Highlight::Negative); - reader.window_pos = (0,0); - reader.window_size = (2,2); + reader.window_pos = (0, 0); + reader.window_size = (2, 2); reader.line_width = 4; reader.capture().unwrap(); let mut hex = String::new(); @@ -386,31 +393,31 @@ mod tests { // 45 34 35 assert_eq!(hex, "30 31+\n34- 35-") } - + #[test] fn highlight_to_left_of_window_must_not_bleed_in() { let mut tmpf = tempfile::NamedTempFile::new().unwrap(); tmpf.write(b"0123456789abcdef").unwrap(); - + let mut reader = HexReader::new(TilingByteReader::new(tmpf.path()).unwrap()).unwrap(); reader.highlight(0, 2, Highlight::Positive); - reader.window_pos = (2,0); - reader.window_size = (2,2); + reader.window_pos = (2, 0); + reader.window_size = (2, 2); reader.line_width = 4; reader.capture().unwrap(); let mut hex = String::new(); reader.visit_hex(&mut hex); assert_eq!(hex, "32 33\n36 37") } - + #[test] fn hex_view_bigger_than_file() { let mut tmpf = tempfile::NamedTempFile::new().unwrap(); tmpf.write(b"0123456789abcdef").unwrap(); let mut reader = HexReader::new(TilingByteReader::new(tmpf.path()).unwrap()).unwrap(); - reader.window_pos = (0,0); - reader.window_size = (4,16); + reader.window_pos = (0, 0); + reader.window_size = (4, 16); reader.line_width = 4; reader.capture().unwrap(); let mut hex = String::new(); @@ -425,15 +432,15 @@ mod tests { reader.visit_row_offsets(&mut offsets); assert_eq!(offsets, "0x00000000\n0x00000004\n0x00000008\n0x0000000C"); } - + #[test] fn hex_view_bigger_than_unaligned_file() { let mut tmpf = tempfile::NamedTempFile::new().unwrap(); tmpf.write(b"0123456789abcde").unwrap(); let mut reader = HexReader::new(TilingByteReader::new(tmpf.path()).unwrap()).unwrap(); - reader.window_pos = (0,0); - reader.window_size = (4,16); + reader.window_pos = (0, 0); + reader.window_size = (4, 16); reader.line_width = 4; reader.capture().unwrap(); let mut hex = String::new(); diff --git a/src/hex_view.rs b/src/hex_view.rs index 9fac91e..d81dd4d 100644 --- a/src/hex_view.rs +++ b/src/hex_view.rs @@ -1,17 +1,17 @@ use std::convert::TryFrom; use cursive::align::HAlign; -use cursive::event::{Event, Key, MouseEvent}; use cursive::event::EventResult; -use cursive::Printer; +use cursive::event::{Event, Key, MouseEvent}; use cursive::theme::ColorStyle; use cursive::traits::View; +use cursive::Printer; use cursive::Vec2; use unicode_width::UnicodeWidthStr; -use crate::hex_reader::{HexReader, VisualMode, Highlight}; +use crate::hex_reader::{HexReader, Highlight, VisualMode}; +use crate::hex_view_printers::{HexPrinter, OffsetPrinter, TableSet, VisualPrinter}; use crate::xxv_state::ReaderState; -use crate::hex_view_printers::{OffsetPrinter, HexPrinter, VisualPrinter, TableSet}; pub struct HexView { reader: HexReader, @@ -45,17 +45,17 @@ impl HexView { visual_tables: TableSet::new(), } } - + pub fn switch_reader(&mut self, reader: HexReader) { self.reader = reader; self.invalidated_data_changed = true; self.invalidated_resize = true; } - + pub fn get_reader_state(&self) -> ReaderState { ReaderState::new(&self.reader) } - + pub fn go_to_offset(&mut self, offset: u64) { self.reader.clear_highlights(); @@ -67,26 +67,28 @@ impl HexView { let line = offset / line_width; let line_offset = offset % line_width; let lines_in_file = self.reader.get_lines_in_file(); - + let target_pos = if line <= lines_in_file { self.reader.highlight(offset, 1, Highlight::Positive); (line_offset, line) } else { (0, lines_in_file) }; - + // Only adjust the window position if the target position is not within the window bounds. - if target_pos.0 < current_pos.0 || target_pos.1 < current_pos.1 || - target_pos.0 > current_pos.0 + current_size.0 - 1|| - target_pos.1 > current_pos.1 + current_size.1 - 1 { + if target_pos.0 < current_pos.0 + || target_pos.1 < current_pos.1 + || target_pos.0 > current_pos.0 + current_size.0 - 1 + || target_pos.1 > current_pos.1 + current_size.1 - 1 + { self.reader.window_pos = target_pos; let max_line_offset = line_width - current_size.0; self.reader.window_pos.0 = u64::min(max_line_offset, self.reader.window_pos.0); } - + self.invalidated_data_changed = true; } - + pub fn set_line_width(&mut self, length: u64) { self.reader.line_width = length; let lines_in_file = self.reader.get_lines_in_file(); @@ -96,11 +98,11 @@ impl HexView { self.invalidated_resize = true; self.invalidated_data_changed = true; } - + pub fn get_line_width(&self) -> u64 { self.reader.line_width } - + pub fn set_group(&mut self, group: u16) { self.reader.group = group; self.invalidated_resize = true; @@ -110,27 +112,27 @@ impl HexView { pub fn get_group(&self) -> u16 { self.reader.group } - + pub fn get_length(&self) -> u64 { self.reader.get_length() } - + pub fn search(&mut self, bytes: &[u8]) { self.reader.clear_highlights(); self.reader.search(bytes); } - + fn toggle_visual(&mut self) -> EventResult { self.visual_tables.clear(); match self.reader.get_visual_mode() { VisualMode::Unicode => { self.reader.set_visual_mode(VisualMode::Ascii); - }, + } VisualMode::Ascii => { self.reader.set_visual_mode(VisualMode::Off); self.show_visual_view = false; self.invalidated_resize = true; - }, + } VisualMode::Off => { self.reader.set_visual_mode(VisualMode::Unicode); self.show_visual_view = true; @@ -139,19 +141,19 @@ impl HexView { } EventResult::Consumed(None) } - + fn reload_data(&mut self) -> EventResult { self.reader.clear_highlights(); self.reader.capture_before_image(); self.invalidated_data_changed = true; EventResult::Consumed(None) } - + fn reopen_and_reload_data(&mut self) -> EventResult { self.reader.reopen().unwrap(); self.reload_data() } - + fn on_char_event(&mut self, c: char) -> EventResult { match c { 'j' => self.on_key_event(Key::Down), @@ -165,18 +167,18 @@ impl HexView { 'v' => self.toggle_visual(), 'r' => self.reload_data(), 'R' => self.reopen_and_reload_data(), - _ => EventResult::Ignored + _ => EventResult::Ignored, } } - + fn on_mouse_event(&mut self, _offset: Vec2, _position: Vec2, event: MouseEvent) -> EventResult { match event { MouseEvent::WheelUp => self.on_key_event(Key::Up), MouseEvent::WheelDown => self.on_key_event(Key::Down), - _ => EventResult::Ignored + _ => EventResult::Ignored, } } - + fn on_key_event(&mut self, k: Key) -> EventResult { let inner_height = i64::try_from(self.offsets_column_size.y).unwrap(); let line_width = i64::try_from(self.reader.line_width).unwrap(); @@ -191,11 +193,11 @@ impl HexView { Key::PageUp => (0, -inner_height), Key::Home => (-pos_x, 0), Key::End => (line_width - size_x - pos_x, 0), - _ => (0, 0) + _ => (0, 0), }; self.navigate(offset) } - + fn navigate(&mut self, offset: (i64, i64)) -> EventResult { if offset != (0, 0) { let (x, y) = offset; @@ -228,13 +230,13 @@ impl HexView { EventResult::Ignored } } - + fn draw_bg(&self, printer: &Printer) { for y in 0..printer.size.y { printer.print_hline((0, y), printer.size.x, " "); } } - + fn draw_title(&self, printer: &Printer) { let title = self.reader.file_name(); let mut len = title.width(); @@ -259,11 +261,11 @@ impl HexView { } }); } - + fn build_prestyled_hex_table(&mut self) { self.reader.generate_hex_tables(&mut self.hex_tables); } - + fn build_prestyled_visual_table(&mut self) { self.reader.generate_visual_tables(&mut self.visual_tables); } @@ -274,22 +276,26 @@ impl View for HexView { self.draw_bg(printer); printer.print_box((0, 0), printer.size, true); self.draw_title(printer); - + let mut offset_printer = OffsetPrinter { pos: Vec2::new(0, 0), - printer: &printer.offset(self.offsets_column_pos).cropped(self.offsets_column_size), - spans: Vec::with_capacity(1) + printer: &printer + .offset(self.offsets_column_pos) + .cropped(self.offsets_column_size), + spans: Vec::with_capacity(1), }; self.reader.visit_row_offsets(&mut offset_printer); - + let inner_height = self.offsets_column_size.y; let border_offset = self.offsets_column_size.x + self.offsets_column_pos.x; printer.print_vline(Vec2::new(border_offset, 1), inner_height, "│"); - + let mut hex_printer = HexPrinter { max_width: 0, pos: Vec2::new(0, 0), - printer: &printer.offset(self.hex_column_pos).cropped(self.hex_column_size), + printer: &printer + .offset(self.hex_column_pos) + .cropped(self.hex_column_size), tables: &self.hex_tables, }; self.reader.visit_hex(&mut hex_printer); @@ -297,10 +303,12 @@ impl View for HexView { if self.show_visual_view { let border_offset = self.hex_column_pos.x + self.hex_column_size.x; printer.print_vline(Vec2::new(border_offset, 1), inner_height, "│"); - + let mut visual_printer = VisualPrinter { - pos: Vec2::new(0,0), - printer: &printer.offset(self.visual_column_pos).cropped(self.visual_column_size), + pos: Vec2::new(0, 0), + printer: &printer + .offset(self.visual_column_pos) + .cropped(self.visual_column_size), tables: &self.visual_tables, }; self.reader.visit_hex(&mut visual_printer); @@ -328,7 +336,7 @@ impl View for HexView { let colw_offsets = self.reader.get_row_offsets_width(); self.offsets_column_pos = Vec2::new(1, 1); self.offsets_column_size = Vec2::new(colw_offsets, inner_height); - + // Box-border, offsets column, separator line + space line: let hex_col_start = 1 + colw_offsets + 2; self.hex_column_pos = Vec2::new(hex_col_start, 1); @@ -338,7 +346,7 @@ impl View for HexView { let reader_pos_x = group - 1; let vis_group_spacer: isize = if self.show_visual_view { 1 } else { 0 }; let vis_byte_width: isize = if self.show_visual_view { 1 } else { 0 }; - + let avail_width = self.hex_column_size.x; let avail_width_isize = isize::try_from(avail_width).unwrap(); let mut space_left = avail_width_isize; @@ -355,7 +363,7 @@ impl View for HexView { hex_width += 2 + byte_pair_spacer; vis_width += vis_byte_width; bytes_consumed += 1; - + if ((reader_pos_x + i) % group) == 0 && i != 0 { // The hex column group spacer replaces the byte pair spacer automatically. if space_left - vis_group_spacer > 0 { @@ -369,7 +377,7 @@ impl View for HexView { break; } } - + if hex_width + vis_width + 1 < avail_width_isize { // Add right padding to hex column. hex_width += 1; @@ -377,18 +385,18 @@ impl View for HexView { // Remove the left hex column padding to squeeze in the last byte. self.hex_column_pos.x -= 1; } - + let hex_uw = usize::try_from(hex_width).unwrap(); let vis_uw = usize::try_from(vis_width).unwrap(); self.hex_column_size = Vec2::new(hex_uw, inner_height); self.visual_column_pos = Vec2::new(self.hex_column_pos.x + hex_uw + 1, 1); self.visual_column_size = Vec2::new(vis_uw, inner_height); - + if bytes_consumed != self.reader.window_size.0 { self.reader.window_size.0 = bytes_consumed; self.invalidated_data_changed = true; } - + self.invalidated_resize = false; } @@ -412,11 +420,15 @@ impl View for HexView { Event::WindowResize => { self.invalidated_resize = true; EventResult::Consumed(None) - }, + } Event::Char(c) => self.on_char_event(c), Event::Key(k) => self.on_key_event(k), - Event::Mouse { offset, position, event } => self.on_mouse_event(offset, position, event), - _ => EventResult::Ignored + Event::Mouse { + offset, + position, + event, + } => self.on_mouse_event(offset, position, event), + _ => EventResult::Ignored, } } } @@ -451,7 +463,7 @@ mod tests { assert_eq!(view.hex_column_pos, Vec2::new(13, 1)); assert_eq!(view.hex_column_size, Vec2::new(47, 21)); - + assert_eq!(view.visual_column_pos, Vec2::new(61, 1)); assert_eq!(view.visual_column_size, Vec2::new(18, 21)); } @@ -504,7 +516,7 @@ mod tests { assert_eq!(view.hex_column_pos, Vec2::new(12, 1)); assert_eq!(view.hex_column_size, Vec2::new(47, 21)); - + assert_eq!(view.visual_column_pos, Vec2::new(60, 1)); assert_eq!(view.visual_column_size, Vec2::new(18, 21)); } @@ -530,7 +542,7 @@ mod tests { assert_eq!(view.hex_column_pos, Vec2::new(13, 1)); assert_eq!(view.hex_column_size, Vec2::new(45, 21)); - + assert_eq!(view.visual_column_pos, Vec2::new(59, 1)); assert_eq!(view.visual_column_size, Vec2::new(17, 21)); } @@ -556,7 +568,7 @@ mod tests { assert_eq!(view.hex_column_pos, Vec2::new(13, 1)); assert_eq!(view.hex_column_size, Vec2::new(45, 21)); - + assert_eq!(view.visual_column_pos, Vec2::new(59, 1)); assert_eq!(view.visual_column_size, Vec2::new(17, 21)); } @@ -583,7 +595,7 @@ mod tests { assert_eq!(view.hex_column_pos, Vec2::new(13, 1)); assert_eq!(view.hex_column_size, Vec2::new(45, 21)); - + assert_eq!(view.visual_column_pos, Vec2::new(59, 1)); assert_eq!(view.visual_column_size, Vec2::new(17, 21)); } @@ -591,7 +603,8 @@ mod tests { #[test] fn layout_w82_h24_ll32() { let mut tmpf = tempfile::NamedTempFile::new().unwrap(); - tmpf.write(b"0123456789abcdef0123456789abcdef0123456789abcdef").unwrap(); + tmpf.write(b"0123456789abcdef0123456789abcdef0123456789abcdef") + .unwrap(); let byte_reader = TilingByteReader::new(tmpf.path()).unwrap(); let hex_reader = HexReader::new(byte_reader).unwrap(); diff --git a/src/hex_view_printers.rs b/src/hex_view_printers.rs index 847dc99..5ea9dcd 100644 --- a/src/hex_view_printers.rs +++ b/src/hex_view_printers.rs @@ -1,7 +1,7 @@ -use cursive::{Printer, Vec2}; use cursive::theme::{ColorStyle, Style}; use cursive::utils::markup::StyledString; use cursive::utils::span::{IndexedCow, IndexedSpan, SpannedStr}; +use cursive::{Printer, Vec2}; use unicode_width::UnicodeWidthStr; use crate::hex_reader::{HexVisitor, Highlight, OffsetsVisitor}; @@ -12,16 +12,19 @@ const GROUP_SEP: &str = "\u{00A6}"; pub struct OffsetPrinter<'a, 'b, 'x> { pub pos: Vec2, pub printer: &'x Printer<'a, 'b>, - pub spans: Vec> + pub spans: Vec>, } impl<'a, 'b, 'x> OffsetsVisitor for OffsetPrinter<'a, 'b, 'x> { fn offset(&mut self, offset: &str) { if self.spans.is_empty() { self.spans.push(IndexedSpan { - content: IndexedCow::Borrowed {start: 0, end: offset.len()}, + content: IndexedCow::Borrowed { + start: 0, + end: offset.len(), + }, attr: Style::from(ColorStyle::secondary()), - width: offset.width() + width: offset.width(), }); } let styled_offset = SpannedStr::new(offset, &self.spans); @@ -45,22 +48,25 @@ impl TableSet { TableSet { neu: Vec::new(), pos: Vec::new(), - neg: Vec::new() + neg: Vec::new(), } } - + pub fn push_byte(&mut self, category: &ByteCategory, s: &'static str) { - self.neu.push(StyledString::styled(s, category_to_color(category))); - self.pos.push(StyledString::styled(s, ColorStyle::highlight_inactive())); - self.neg.push(StyledString::styled(s, ColorStyle::highlight())); + self.neu + .push(StyledString::styled(s, category_to_color(category))); + self.pos + .push(StyledString::styled(s, ColorStyle::highlight_inactive())); + self.neg + .push(StyledString::styled(s, ColorStyle::highlight())); } - + pub fn clear(&mut self) { self.neu.clear(); self.pos.clear(); self.neg.clear(); } - + pub fn is_empty(&self) -> bool { self.neu.is_empty() } @@ -71,7 +77,7 @@ fn category_to_color(category: &ByteCategory) -> ColorStyle { ByteCategory::AsciiControl => ColorStyle::title_primary(), ByteCategory::AsciiPrintable => ColorStyle::primary(), ByteCategory::AsciiWhitespace => ColorStyle::secondary(), - ByteCategory::Other => ColorStyle::title_secondary() + ByteCategory::Other => ColorStyle::title_secondary(), } } @@ -79,7 +85,7 @@ pub struct HexPrinter<'a, 'b, 'x> { pub max_width: usize, pub pos: Vec2, pub printer: &'x Printer<'a, 'b>, - pub tables: &'x TableSet + pub tables: &'x TableSet, } impl<'a, 'b, 'x> HexVisitor for HexPrinter<'a, 'b, 'x> { @@ -115,7 +121,7 @@ impl<'a, 'b, 'x> HexVisitor for HexPrinter<'a, 'b, 'x> { pub struct VisualPrinter<'a, 'b, 'x> { pub pos: Vec2, pub printer: &'x Printer<'a, 'b>, - pub tables: &'x TableSet + pub tables: &'x TableSet, } impl<'a, 'b, 'x> HexVisitor for VisualPrinter<'a, 'b, 'x> { diff --git a/src/main.rs b/src/main.rs index 84989d5..8f3aa61 100644 --- a/src/main.rs +++ b/src/main.rs @@ -23,22 +23,22 @@ use std::process::exit; use crate::utilities::{exit_reader_open_error, PKG_DESCRIPTION, PKG_NAME, PKG_VERSION}; use crate::xxv_state::XxvState; -mod utilities; -mod panic_hook; -mod file_search; -mod xxv_state; mod byte_reader; -mod hex_tables; +mod file_search; +mod goto_dialog; +mod help_text; mod hex_reader; +mod hex_tables; mod hex_view; mod hex_view_printers; -mod set_width_dialog; -mod goto_dialog; mod open_file_dialog; -mod switch_file_dialog; +mod panic_hook; mod search_dialog; +mod set_width_dialog; mod status_bar; -mod help_text; +mod switch_file_dialog; +mod utilities; +mod xxv_state; mod xxv_tui; fn main() { @@ -47,7 +47,7 @@ fn main() { let mut args = std::env::args_os(); args.next(); // The first argument is (most likely) the path to our executable. let file_arg = args.next(); - + if let Some(option) = &file_arg { if option.eq("-h") || option.eq("--help") { eprintln!("{} {}", PKG_NAME, PKG_VERSION); @@ -65,22 +65,18 @@ fn main() { let mut state = XxvState::load(); let recent_files = state.recent_files(); - + match file_arg { None if recent_files.is_empty() => { eprintln!("Error: The 'file' argument is required."); eprintln!(); eprintln!("For more information, try --help."); exit(64); // EX_USAGE from sysexits.h - }, - None => { - xxv_tui::run_tui(None, state) - }, - Some(file_name) => { - match state.open_reader(&file_name) { - Ok(h_reader) => xxv_tui::run_tui(Some(h_reader), state), - Err(e) => exit_reader_open_error(e, file_name) - } } + None => xxv_tui::run_tui(None, state), + Some(file_name) => match state.open_reader(&file_name) { + Ok(h_reader) => xxv_tui::run_tui(Some(h_reader), state), + Err(e) => exit_reader_open_error(e, file_name), + }, } } diff --git a/src/open_file_dialog.rs b/src/open_file_dialog.rs index 8b00f60..8ccc417 100644 --- a/src/open_file_dialog.rs +++ b/src/open_file_dialog.rs @@ -1,9 +1,11 @@ use crate::hex_view::HexView; use crate::xxv_state::XxvState; -use crate::xxv_tui::{ShowError, OBJ_CURRENT_DIR, OBJ_DIR_SELECTOR, OBJ_FILE_SELECTOR, OBJ_HEX_VIEW}; +use crate::xxv_tui::{ + ShowError, OBJ_CURRENT_DIR, OBJ_DIR_SELECTOR, OBJ_FILE_SELECTOR, OBJ_HEX_VIEW, +}; use cursive::event::Key; use cursive::theme::Effect; -use cursive::traits::{Resizable, Nameable}; +use cursive::traits::{Nameable, Resizable}; use cursive::views::{ Dialog, DummyView, LinearLayout, OnEventView, ScrollView, SelectView, TextView, }; @@ -53,7 +55,9 @@ pub fn open_file_dialog(s: &mut Cursive) { fn select_directory(s: &mut Cursive, dir: &OsStr) { let mut current_dir = s.find_name::(OBJ_CURRENT_DIR).unwrap(); - let mut dir_selector = s.find_name::>(OBJ_DIR_SELECTOR).unwrap(); + let mut dir_selector = s + .find_name::>(OBJ_DIR_SELECTOR) + .unwrap(); let mut file_selector = s .find_name::>(OBJ_FILE_SELECTOR) .unwrap(); diff --git a/src/panic_hook.rs b/src/panic_hook.rs index dff9def..afc95ef 100644 --- a/src/panic_hook.rs +++ b/src/panic_hook.rs @@ -1,17 +1,17 @@ use std::env::consts::{ARCH, FAMILY, OS}; use std::fmt::Write as StrWrite; -use std::fs::{create_dir_all, OpenOptions, rename}; +use std::fs::{create_dir_all, rename, OpenOptions}; use std::io::{stderr, Write as IoWrite}; use std::panic; use std::panic::PanicInfo; use std::path::PathBuf; use backtrace::Backtrace; +use time::format_description::well_known::Rfc3339; use time::OffsetDateTime; -use time::Format::Rfc3339; -use crate::utilities::{PKG_NAME, PKG_VERSION}; use crate::utilities; +use crate::utilities::{PKG_NAME, PKG_VERSION}; pub const CRASH_LOG_FILE_NAME: &str = "crash.log"; @@ -28,7 +28,11 @@ pub fn archive_last_crash() -> Option { let mut path = dirs.data_local_dir().to_path_buf(); path.push(CRASH_LOG_FILE_NAME); if path.exists() { - let archive_name = format!("{}.{}", CRASH_LOG_FILE_NAME, OffsetDateTime::now_utc().lazy_format(Rfc3339)); + let archive_name = format!( + "{}.{}", + CRASH_LOG_FILE_NAME, + OffsetDateTime::now_utc().format(&Rfc3339).ok()? + ); let log_path = path.clone(); path.pop(); path.push(archive_name); @@ -44,7 +48,13 @@ fn report_crash(info: &PanicInfo) -> std::fmt::Result { writeln!(msg)?; writeln!(msg)?; - writeln!(msg, "Panic in {} {}, {}.", PKG_NAME, PKG_VERSION, OffsetDateTime::now_utc().lazy_format(Rfc3339))?; + writeln!( + msg, + "Panic in {} {}, {}.", + PKG_NAME, + PKG_VERSION, + OffsetDateTime::now_utc() + )?; writeln!(msg, "System: {} ({}), {}.", OS, FAMILY, ARCH)?; if let Some(payload) = info.payload().downcast_ref::<&str>() { @@ -61,15 +71,25 @@ fn report_crash(info: &PanicInfo) -> std::fmt::Result { if let Some(dirs) = utilities::project_dirs() { let mut path = dirs.data_local_dir().to_path_buf(); if let Err(e) = create_dir_all(&path) { - writeln!(msg, "[PANIC] Failed to create crash report directory {:?}: {}.", path, e)?; + writeln!( + msg, + "[PANIC] Failed to create crash report directory {:?}: {}.", + path, e + )?; } path.push(CRASH_LOG_FILE_NAME); let open_result = OpenOptions::new().create(true).append(true).open(path); match open_result { - Ok(mut log_writer) => if let Err(e) = log_writer.write(msg.as_bytes()) { - writeln!(msg, "[PANIC] Failed to write panic message to crash.log: {}.", e)?; - }, - Err(e) => writeln!(msg, "[PANIC] Failed to open crash.log for writing: {}.", e)? + Ok(mut log_writer) => { + if let Err(e) = log_writer.write(msg.as_bytes()) { + writeln!( + msg, + "[PANIC] Failed to write panic message to crash.log: {}.", + e + )?; + } + } + Err(e) => writeln!(msg, "[PANIC] Failed to open crash.log for writing: {}.", e)?, } } diff --git a/src/search_dialog.rs b/src/search_dialog.rs index ccb7d2d..d4222ce 100644 --- a/src/search_dialog.rs +++ b/src/search_dialog.rs @@ -1,10 +1,10 @@ -use cursive::Cursive; -use cursive::views::{LinearLayout, TextView, EditView, OnEventView, Dialog}; -use cursive::traits::{Nameable, Resizable}; -use crate::xxv_tui::{OBJ_FIND_ASCII, OBJ_FIND_HEX, OBJ_HEX_VIEW}; use crate::hex_tables::{BYTE_RENDER, UNICODE_TEXT_TABLE}; -use cursive::event::Key; use crate::hex_view::HexView; +use crate::xxv_tui::{OBJ_FIND_ASCII, OBJ_FIND_HEX, OBJ_HEX_VIEW}; +use cursive::event::Key; +use cursive::traits::{Nameable, Resizable}; +use cursive::views::{Dialog, EditView, LinearLayout, OnEventView, TextView}; +use cursive::Cursive; pub fn search_dialog(s: &mut Cursive) { let ascii_field = EditView::new() @@ -13,33 +13,37 @@ pub fn search_dialog(s: &mut Cursive) { .on_submit(on_find) .with_name(OBJ_FIND_ASCII) .min_width(48); - + let hex_field = EditView::new() .content("") .on_edit(edit_hex) .on_submit(on_find) .with_name(OBJ_FIND_HEX) .min_width(48); - + let layout = LinearLayout::vertical() - .child(LinearLayout::horizontal() - .child(TextView::new("ASCII: ")) - .child(ascii_field)) - .child(LinearLayout::horizontal() - .child(TextView::new("HEX: ")) - .child(hex_field)); - + .child( + LinearLayout::horizontal() + .child(TextView::new("ASCII: ")) + .child(ascii_field), + ) + .child( + LinearLayout::horizontal() + .child(TextView::new("HEX: ")) + .child(hex_field), + ); + let dialog = Dialog::around(layout) .dismiss_button("Cancel") .button("Search", do_find) .title("Search"); - + let esc_view = OnEventView::new(dialog) .on_event(Key::Esc, |s| { s.pop_layer(); }) .on_event(Key::Enter, do_find); - + s.add_layer(esc_view); } @@ -80,7 +84,7 @@ fn hex_to_bytes(hex_text: &mut String, bytes: &mut Vec) -> bool { let mut i = 0; while i < hex_text.len() { let byte = if hex_text.len() > i + 1 { - &hex_text[i..=i+1] + &hex_text[i..=i + 1] } else { &hex_text[i..=i] }; diff --git a/src/set_width_dialog.rs b/src/set_width_dialog.rs index 57babb8..4a5883d 100644 --- a/src/set_width_dialog.rs +++ b/src/set_width_dialog.rs @@ -1,13 +1,13 @@ use std::convert::TryFrom; use cursive::event::Key; -use cursive::traits::{Resizable, Nameable}; +use cursive::traits::{Nameable, Resizable}; use cursive::views::{Dialog, EditView, LinearLayout, OnEventView, TextView}; use cursive::Cursive; use crate::hex_view::HexView; use crate::utilities::{get_content, parse_number}; -use crate::xxv_tui::{OBJ_HEX_VIEW, OBJ_LINE_WIDTH, OBJ_GROUP}; +use crate::xxv_tui::{OBJ_GROUP, OBJ_HEX_VIEW, OBJ_LINE_WIDTH}; pub fn open_set_width_dialog(s: &mut Cursive) { let (current_width, current_group) = get_current_width_and_group(s); diff --git a/src/switch_file_dialog.rs b/src/switch_file_dialog.rs index b4f850a..846f942 100644 --- a/src/switch_file_dialog.rs +++ b/src/switch_file_dialog.rs @@ -2,13 +2,13 @@ use std::ffi::OsString; use std::path::PathBuf; use cursive::event::Key; -use cursive::traits::{Resizable, Nameable}; +use cursive::traits::{Nameable, Resizable}; use cursive::views::{Dialog, LinearLayout, OnEventView, ScrollView, SelectView}; use cursive::Cursive; use crate::hex_view::HexView; use crate::xxv_state::XxvState; -use crate::xxv_tui::{ShowError, OBJ_SWITCHER, OBJ_HEX_VIEW}; +use crate::xxv_tui::{ShowError, OBJ_HEX_VIEW, OBJ_SWITCHER}; pub fn switch_file_dialog(s: &mut Cursive) { let mut file_selector: SelectView = SelectView::new().autojump(); @@ -43,9 +43,7 @@ pub fn switch_file_dialog(s: &mut Cursive) { } fn do_switch_file(s: &mut Cursive) { - let file_selector = s - .find_name::>(OBJ_SWITCHER) - .unwrap(); + let file_selector = s.find_name::>(OBJ_SWITCHER).unwrap(); s.pop_layer(); if let Some(rc_file) = file_selector.selection() { let file_name = rc_file.as_ref(); @@ -74,9 +72,7 @@ fn do_switch_file(s: &mut Cursive) { } fn remove_selected_file(s: &mut Cursive) { - let mut file_selector = s - .find_name::>(OBJ_SWITCHER) - .unwrap(); + let mut file_selector = s.find_name::>(OBJ_SWITCHER).unwrap(); if let Some(id) = file_selector.selected_id() { file_selector.remove_item(id)(s); s.with_user_data(|state: &mut XxvState| { diff --git a/src/xxv_state.rs b/src/xxv_state.rs index 9e6f6e6..0c281fb 100644 --- a/src/xxv_state.rs +++ b/src/xxv_state.rs @@ -5,9 +5,9 @@ use std::fs::{create_dir_all, File, OpenOptions}; use std::io::Result; use std::path::{Path, PathBuf}; -use cursive::theme::{Palette, Theme}; use cursive::theme::BaseColor::*; use cursive::theme::Color::*; +use cursive::theme::{Palette, Theme}; use directories::BaseDirs; use rmp_serde::Serializer; use serde::ser::Serialize; @@ -22,9 +22,9 @@ pub struct ReaderState { path: PathBuf, line_width: u64, group: u16, - window_pos: (u64,u64), - window_size: (u16,u16), - vis_mode: String + window_pos: (u64, u64), + window_size: (u16, u16), + vis_mode: String, } impl ReaderState { @@ -38,7 +38,7 @@ impl ReaderState { vis_mode: reader.vis_mode.into(), } } - + pub fn path(&self) -> &Path { self.path.as_path() } @@ -66,7 +66,7 @@ impl From for VisualMode { "Unicode" => VisualMode::Unicode, "Ascii" => VisualMode::Ascii, "Off" => VisualMode::Off, - _ => VisualMode::Unicode + _ => VisualMode::Unicode, } } } @@ -84,7 +84,7 @@ impl XxvState { if let Some(project_dirs) = utilities::project_dirs() { let mut state_path = project_dirs.config_dir().to_owned(); state_path.push("xv.state"); - + if let Ok(state_file) = File::open(state_path) { let result = rmp_serde::from_read(state_file); if let Ok(state) = result { @@ -92,7 +92,7 @@ impl XxvState { } } } - + let current_dir = env::current_dir().unwrap_or_else(|_e| { let user_dirs = BaseDirs::new(); if let Some(ud) = user_dirs { @@ -101,15 +101,15 @@ impl XxvState { PathBuf::default() } }); - + XxvState { theme: true, current_dir, max_recent_files: 50, - recent_files: Vec::new() + recent_files: Vec::new(), } } - + pub fn store(&mut self) { if let Some(project_dirs) = utilities::project_dirs() { let mut state_path = project_dirs.config_dir().to_owned(); @@ -124,7 +124,7 @@ impl XxvState { } } } - + pub fn open_reader>(&mut self, file_name: P) -> Result { let b_reader = TilingByteReader::new(file_name)?; match HexReader::new(b_reader) { @@ -139,11 +139,11 @@ impl XxvState { self.recent_files.remove(index); }; Ok(reader) - }, - err => err + } + err => err, } } - + pub fn close_reader(&mut self, reader: ReaderState) { if let Some(index) = self.index_of(&reader) { self.recent_files.remove(index); @@ -155,7 +155,7 @@ impl XxvState { self.recent_files.insert(0, reader); } } - + fn index_of(&self, reader: &ReaderState) -> Option { for i in 0..self.recent_files.len() { if self.recent_files[i].eq(reader) { @@ -164,11 +164,11 @@ impl XxvState { } None } - + pub fn remove_recent_file(&mut self, index: usize) { self.recent_files.remove(index); } - + pub fn recent_files(&mut self) -> &[ReaderState] { let mut outdated = Vec::new(); for (i, file) in (&self.recent_files).iter().enumerate() { @@ -184,7 +184,7 @@ impl XxvState { } &self.recent_files } - + pub fn change_directory(&mut self, cd: &OsStr) { if cd == ".." { self.current_dir.pop(); @@ -192,34 +192,34 @@ impl XxvState { self.current_dir.push(cd); } } - + pub fn set_directory(&mut self, path: PathBuf) { self.current_dir = path; } - + pub fn list_directory(&mut self) -> Result { fs::read_dir(&self.current_dir) } - + pub fn reset_current_directory(&mut self) -> Result<()> { self.current_dir = env::current_dir()?; Ok(()) } - + pub fn current_directory(&self) -> &Path { &self.current_dir } - + pub fn resolve_path(&self, file_name: &OsStr) -> PathBuf { let mut cloned_buf = self.current_dir.clone(); cloned_buf.push(file_name); cloned_buf } - + pub fn toggle_theme(&mut self) { self.theme = !self.theme; } - + pub fn current_theme(&self) -> Theme { if self.theme { Theme::default() @@ -235,7 +235,11 @@ impl XxvState { palette.set_color("title_secondary", Dark(Yellow)); palette.set_color("highlight", Dark(Red)); palette.set_color("highlight_inactive", Dark(Blue)); - Theme { shadow: false, palette, ..Theme::default() } + Theme { + shadow: false, + palette, + ..Theme::default() + } } } } diff --git a/src/xxv_tui.rs b/src/xxv_tui.rs index 92467e7..1c3c6d4 100644 --- a/src/xxv_tui.rs +++ b/src/xxv_tui.rs @@ -1,19 +1,19 @@ use std::io::Error; use std::path::PathBuf; -use cursive::Cursive; -use cursive::CursiveExt; use cursive::event::Key; -use cursive::traits::{Resizable, Nameable}; +use cursive::traits::{Nameable, Resizable}; use cursive::views::{Dialog, LinearLayout, TextView}; +use cursive::Cursive; +use cursive::CursiveExt; -use crate::search_dialog::search_dialog; use crate::goto_dialog::open_goto_dialog; use crate::help_text::show_help; use crate::hex_reader::HexReader; use crate::hex_view::HexView; use crate::open_file_dialog::open_file_dialog; use crate::panic_hook::archive_last_crash; +use crate::search_dialog::search_dialog; use crate::set_width_dialog::open_set_width_dialog; use crate::status_bar::new_status_bar; use crate::switch_file_dialog::switch_file_dialog; From 02b33309a52cd3f59fbccbd73367374c7a856624 Mon Sep 17 00:00:00 2001 From: Adam Lesperance Date: Thu, 20 Jan 2022 18:43:29 -0600 Subject: [PATCH 4/4] 2021 Edition --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index d8e65e1..a8af050 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,7 +2,7 @@ name = "xxv" version = "0.1.3" authors = ["Chris Vest "] -edition = "2018" +edition = "2021" description = "A hex viewer for the terminal, with a visual text user interface." keywords = ["hex", "binary", "ncurses"] categories = ["command-line-utilities", "development-tools"]