Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
501 changes: 438 additions & 63 deletions Cargo.lock

Large diffs are not rendered by default.

40 changes: 26 additions & 14 deletions Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,28 +1,40 @@
[package]
name = "vt100"
version = "0.16.2"
authors = ["Jesse Luehrs <doy@tozt.net>"]
name = "vt100-ctt"
version = "0.17.0"
authors = [
"Chris Titus <contact@christitus.com>",
"Jesse Luehrs <doy@tozt.net>",
]
edition = "2021"
rust-version = "1.70"

description = "Library for parsing terminal data"
homepage = "https://github.com/doy/vt100-rust"
repository = "https://github.com/doy/vt100-rust"
description = "Library for parsing terminal data - up-to-date version"
homepage = "https://github.com/ChrisTitusTech/vt100-rust"
repository = "https://github.com/ChrisTitusTech/vt100-rust"
readme = "README.md"
keywords = ["terminal", "vt100"]
categories = ["command-line-interface", "encoding"]
license = "MIT"
include = ["src/**/*", "LICENSE", "README.md", "CHANGELOG.md"]

[dependencies]
itoa = "1.0.15"
unicode-width = "0.2.1"
vte = "0.15.0"
itoa = "1.0.11"
log = "0.4.22"
unicode-width = "0.2.0"
vte = "0.13.0"
ratatui = { version = "0.29.0", default-features = false, optional = true }
ratatui-core = { version = "0.1.0", default-features = false, optional = true }
tui-term = { version = "0.3.1", default-features = false, optional = true }

[features]
default = ["tui-term"]
tui-term = ["dep:tui-term", "dep:ratatui", "dep:ratatui-core"]

[dev-dependencies]
nix = { version = "0.30.1", features = ["term"] }
nix = { version = "0.29.0", features = ["term"] }
quickcheck = "1.0"
rand = "0.9"
serde = { version = "1.0.219", features = ["derive"] }
serde_json = "1.0.140"
terminal_size = "0.4.2"
rand = "0.8"
serde = { version = "1.0.215", features = ["derive"] }
serde_json = "1.0.132"
terminal_size = "0.4.0"
vte = "0.13.0"
3 changes: 2 additions & 1 deletion LICENSE
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
The MIT License (MIT)
MIT License

Copyright (c) 2024 Chris Titus
Copyright (c) 2016 Jesse Luehrs

Permission is hereby granted, free of charge, to any person obtaining a copy of
Expand Down
26 changes: 13 additions & 13 deletions examples/fuzz.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@ use std::io::Read as _;
#[path = "../tests/helpers/mod.rs"]
mod helpers;

fn check_full(vt_base: &vt100::Screen, idx: usize) {
fn check_full(vt_base: &vt100_ctt::Screen, idx: usize) {
let mut input = vec![];
input.extend(vt_base.state_formatted());
let mut vt_full = vt100::Parser::default();
let mut vt_full = vt100_ctt::Parser::default();
vt_full.process(&input);
assert!(
helpers::compare_screens(vt_full.screen(), vt_base),
Expand All @@ -17,13 +17,13 @@ fn check_full(vt_base: &vt100::Screen, idx: usize) {
}

fn check_diff_empty(
vt_base: &vt100::Screen,
empty: &vt100::Screen,
vt_base: &vt100_ctt::Screen,
empty: &vt100_ctt::Screen,
idx: usize,
) {
let mut input = vec![];
input.extend(vt_base.state_diff(empty));
let mut vt_diff_empty = vt100::Parser::default();
let mut vt_diff_empty = vt100_ctt::Parser::default();
vt_diff_empty.process(&input);
assert!(
helpers::compare_screens(vt_diff_empty.screen(), vt_base),
Expand All @@ -34,9 +34,9 @@ fn check_diff_empty(
}

fn check_diff(
vt_base: &vt100::Screen,
vt_diff: &mut vt100::Parser,
prev: &vt100::Screen,
vt_base: &vt100_ctt::Screen,
vt_diff: &mut vt100_ctt::Parser,
prev: &vt100_ctt::Screen,
idx: usize,
) {
let mut input = vec![];
Expand All @@ -50,7 +50,7 @@ fn check_diff(
);
}

fn check_rows(vt_base: &vt100::Screen, idx: usize) {
fn check_rows(vt_base: &vt100_ctt::Screen, idx: usize) {
let mut input = vec![];
let mut wrapped = false;
for (idx, row) in vt_base.rows_formatted(0, 80).enumerate() {
Expand All @@ -65,7 +65,7 @@ fn check_rows(vt_base: &vt100::Screen, idx: usize) {
input.extend(&vt_base.cursor_state_formatted());
input.extend(&vt_base.attributes_formatted());
input.extend(&vt_base.input_mode_formatted());
let mut vt_rows = vt100::Parser::default();
let mut vt_rows = vt100_ctt::Parser::default();
vt_rows.process(&input);
assert!(
helpers::compare_screens(vt_rows.screen(), vt_base),
Expand All @@ -92,10 +92,10 @@ fn read_byte() -> Option<u8> {
}

fn main() {
let mut vt_base = vt100::Parser::default();
let mut vt_diff = vt100::Parser::default();
let mut vt_base = vt100_ctt::Parser::default();
let mut vt_diff = vt100_ctt::Parser::default();
let mut prev_screen = vt_base.screen().clone();
let empty_screen = vt100::Parser::default().screen().clone();
let empty_screen = vt100_ctt::Parser::default().screen().clone();
let mut idx = 0;
while let Some(byte) = read_byte() {
vt_base.process(&[byte]);
Expand Down
2 changes: 1 addition & 1 deletion examples/generate_fixture.rs
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ fn main() {
input_file.write_all(&input).unwrap();

prev_input.extend(input);
let mut term = vt100::Parser::default();
let mut term = vt100_ctt::Parser::default();
term.process(&prev_input);
let screen = helpers::FixtureScreen::from_screen(term.screen());

Expand Down
2 changes: 1 addition & 1 deletion examples/process.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ fn read_frames() -> impl Iterator<Item = Vec<u8>> {
}

fn process_frames(frames: &[Vec<u8>]) {
let mut parser = vt100::Parser::default();
let mut parser = vt100_ctt::Parser::default();
for frame in frames {
parser.process(frame);
}
Expand Down
4 changes: 2 additions & 2 deletions examples/process_cb.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
use std::io::Read as _;

struct Callbacks;
impl vt100::Callbacks for Callbacks {}
impl vt100_ctt::Callbacks for Callbacks {}

fn read_frames() -> impl Iterator<Item = Vec<u8>> {
(1..=7625).map(|i| {
Expand All @@ -15,7 +15,7 @@ fn read_frames() -> impl Iterator<Item = Vec<u8>> {
}

fn process_frames(frames: &[Vec<u8>]) {
let mut parser = vt100::Parser::new_with_callbacks(24, 80, 0, Callbacks);
let mut parser = vt100_ctt::Parser::new_with_callbacks(24, 80, 0, Callbacks);
for frame in frames {
parser.process(frame);
}
Expand Down
24 changes: 12 additions & 12 deletions examples/process_cb_bb.rs
Original file line number Diff line number Diff line change
@@ -1,42 +1,42 @@
use std::io::Read as _;

struct Callbacks;
impl vt100::Callbacks for Callbacks {
fn audible_bell(&mut self, screen: &mut vt100::Screen) {
impl vt100_ctt::Callbacks for Callbacks {
fn audible_bell(&mut self, screen: &mut vt100_ctt::Screen) {
std::hint::black_box(screen);
}

fn visual_bell(&mut self, screen: &mut vt100::Screen) {
fn visual_bell(&mut self, screen: &mut vt100_ctt::Screen) {
std::hint::black_box(screen);
}

fn resize(&mut self, screen: &mut vt100::Screen, request: (u16, u16)) {
fn resize(&mut self, screen: &mut vt100_ctt::Screen, request: (u16, u16)) {
std::hint::black_box((screen, request));
}

fn set_window_icon_name(
&mut self,
screen: &mut vt100::Screen,
screen: &mut vt100_ctt::Screen,
icon_name: &[u8],
) {
std::hint::black_box((screen, icon_name));
}

fn set_window_title(&mut self, screen: &mut vt100::Screen, title: &[u8]) {
fn set_window_title(&mut self, screen: &mut vt100_ctt::Screen, title: &[u8]) {
std::hint::black_box((screen, title));
}

fn unhandled_char(&mut self, screen: &mut vt100::Screen, c: char) {
fn unhandled_char(&mut self, screen: &mut vt100_ctt::Screen, c: char) {
std::hint::black_box((screen, c));
}

fn unhandled_control(&mut self, screen: &mut vt100::Screen, b: u8) {
fn unhandled_control(&mut self, screen: &mut vt100_ctt::Screen, b: u8) {
std::hint::black_box((screen, b));
}

fn unhandled_escape(
&mut self,
screen: &mut vt100::Screen,
screen: &mut vt100_ctt::Screen,
i1: Option<u8>,
i2: Option<u8>,
b: u8,
Expand All @@ -46,7 +46,7 @@ impl vt100::Callbacks for Callbacks {

fn unhandled_csi(
&mut self,
screen: &mut vt100::Screen,
screen: &mut vt100_ctt::Screen,
i1: Option<u8>,
i2: Option<u8>,
params: &[&[u16]],
Expand All @@ -57,7 +57,7 @@ impl vt100::Callbacks for Callbacks {

fn unhandled_osc(
&mut self,
screen: &mut vt100::Screen,
screen: &mut vt100_ctt::Screen,
params: &[&[u8]],
) {
std::hint::black_box((screen, params));
Expand All @@ -76,7 +76,7 @@ fn read_frames() -> impl Iterator<Item = Vec<u8>> {
}

fn process_frames(frames: &[Vec<u8>]) {
let mut parser = vt100::Parser::new_with_callbacks(24, 80, 0, Callbacks);
let mut parser = vt100_ctt::Parser::new_with_callbacks(24, 80, 0, Callbacks);
for frame in frames {
parser.process(frame);
}
Expand Down
14 changes: 7 additions & 7 deletions examples/process_cb_bb_no_unhandled.rs
Original file line number Diff line number Diff line change
@@ -1,28 +1,28 @@
use std::io::Read as _;

struct Callbacks;
impl vt100::Callbacks for Callbacks {
fn audible_bell(&mut self, screen: &mut vt100::Screen) {
impl vt100_ctt::Callbacks for Callbacks {
fn audible_bell(&mut self, screen: &mut vt100_ctt::Screen) {
std::hint::black_box(screen);
}

fn visual_bell(&mut self, screen: &mut vt100::Screen) {
fn visual_bell(&mut self, screen: &mut vt100_ctt::Screen) {
std::hint::black_box(screen);
}

fn resize(&mut self, screen: &mut vt100::Screen, request: (u16, u16)) {
fn resize(&mut self, screen: &mut vt100_ctt::Screen, request: (u16, u16)) {
std::hint::black_box((screen, request));
}

fn set_window_icon_name(
&mut self,
screen: &mut vt100::Screen,
screen: &mut vt100_ctt::Screen,
icon_name: &[u8],
) {
std::hint::black_box((screen, icon_name));
}

fn set_window_title(&mut self, screen: &mut vt100::Screen, title: &[u8]) {
fn set_window_title(&mut self, screen: &mut vt100_ctt::Screen, title: &[u8]) {
std::hint::black_box((screen, title));
}
}
Expand All @@ -39,7 +39,7 @@ fn read_frames() -> impl Iterator<Item = Vec<u8>> {
}

fn process_frames(frames: &[Vec<u8>]) {
let mut parser = vt100::Parser::new_with_callbacks(24, 80, 0, Callbacks);
let mut parser = vt100_ctt::Parser::new_with_callbacks(24, 80, 0, Callbacks);
for frame in frames {
parser.process(frame);
}
Expand Down
2 changes: 1 addition & 1 deletion examples/process_diff.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ fn read_frames() -> impl Iterator<Item = Vec<u8>> {

fn draw_frames(frames: &[Vec<u8>]) {
let mut stdout = std::io::stdout();
let mut parser = vt100::Parser::default();
let mut parser = vt100_ctt::Parser::default();
let mut screen = parser.screen().clone();
for frame in frames {
parser.process(frame);
Expand Down
2 changes: 1 addition & 1 deletion examples/process_full.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ fn read_frames() -> impl Iterator<Item = Vec<u8>> {

fn draw_frames(frames: &[Vec<u8>]) {
let mut stdout = std::io::stdout();
let mut parser = vt100::Parser::default();
let mut parser = vt100_ctt::Parser::default();
for frame in frames {
parser.process(frame);
let contents = parser.screen().contents_formatted();
Expand Down
12 changes: 7 additions & 5 deletions examples/real_terminal_compare.rs
Original file line number Diff line number Diff line change
@@ -1,15 +1,17 @@
use std::io::{Read as _, Write as _};
use std::io::{self, Read, Write};
use std::os::fd::AsFd;

#[path = "../tests/helpers/mod.rs"]
mod helpers;

fn main() {
unsafe { helpers::QUIET = true }

let mut stdin = std::io::stdin();
let mut stdout = std::io::stdout();
let mut stdin = io::stdin();
let mut stdout = io::stdout();

let mut termios = nix::sys::termios::tcgetattr(std::io::stdin()).unwrap();
let stdin_fd = stdin.as_fd();
let mut termios = nix::sys::termios::tcgetattr(stdin_fd).unwrap();
nix::sys::termios::cfmakeraw(&mut termios);
nix::sys::termios::tcsetattr(
std::io::stdin(),
Expand Down Expand Up @@ -37,7 +39,7 @@ fn main() {
stdout.write_all(b"\x1b[H\x1b[J").unwrap();
stdout.flush().unwrap();

let mut parser = vt100::Parser::new(size.0, size.1, 0);
let mut parser = vt100_ctt::Parser::new(size.0, size.1, 0);
let mut buf = [0u8; 4096];
let mut screen = parser.screen().clone();
let mut idx = 0;
Expand Down
4 changes: 3 additions & 1 deletion examples/vte.rs
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,9 @@ fn main() {
match stdin.read(&mut buf) {
Ok(0) => break,
Ok(n) => {
parser.advance(&mut performer, &buf[..n]);
for byte in &buf[..n] {
parser.advance(&mut performer, *byte);
}
}
Err(err) => {
eprintln!("err: {err}");
Expand Down
Loading