|
464 | 464 | <a href="#464" id="464">464</a>
|
465 | 465 | <a href="#465" id="465">465</a>
|
466 | 466 | <a href="#466" id="466">466</a>
|
| 467 | +<a href="#467" id="467">467</a> |
| 468 | +<a href="#468" id="468">468</a> |
| 469 | +<a href="#469" id="469">469</a> |
| 470 | +<a href="#470" id="470">470</a> |
| 471 | +<a href="#471" id="471">471</a> |
| 472 | +<a href="#472" id="472">472</a> |
| 473 | +<a href="#473" id="473">473</a> |
| 474 | +<a href="#474" id="474">474</a> |
| 475 | +<a href="#475" id="475">475</a> |
| 476 | +<a href="#476" id="476">476</a> |
| 477 | +<a href="#477" id="477">477</a> |
| 478 | +<a href="#478" id="478">478</a> |
| 479 | +<a href="#479" id="479">479</a> |
| 480 | +<a href="#480" id="480">480</a> |
| 481 | +<a href="#481" id="481">481</a> |
| 482 | +<a href="#482" id="482">482</a> |
| 483 | +<a href="#483" id="483">483</a> |
| 484 | +<a href="#484" id="484">484</a> |
| 485 | +<a href="#485" id="485">485</a> |
| 486 | +<a href="#486" id="486">486</a> |
| 487 | +<a href="#487" id="487">487</a> |
| 488 | +<a href="#488" id="488">488</a> |
| 489 | +<a href="#489" id="489">489</a> |
| 490 | +<a href="#490" id="490">490</a> |
| 491 | +<a href="#491" id="491">491</a> |
| 492 | +<a href="#492" id="492">492</a> |
| 493 | +<a href="#493" id="493">493</a> |
| 494 | +<a href="#494" id="494">494</a> |
| 495 | +<a href="#495" id="495">495</a> |
| 496 | +<a href="#496" id="496">496</a> |
| 497 | +<a href="#497" id="497">497</a> |
| 498 | +<a href="#498" id="498">498</a> |
| 499 | +<a href="#499" id="499">499</a> |
| 500 | +<a href="#500" id="500">500</a> |
| 501 | +<a href="#501" id="501">501</a> |
| 502 | +<a href="#502" id="502">502</a> |
| 503 | +<a href="#503" id="503">503</a> |
| 504 | +<a href="#504" id="504">504</a> |
| 505 | +<a href="#505" id="505">505</a> |
| 506 | +<a href="#506" id="506">506</a> |
| 507 | +<a href="#507" id="507">507</a> |
| 508 | +<a href="#508" id="508">508</a> |
| 509 | +<a href="#509" id="509">509</a> |
| 510 | +<a href="#510" id="510">510</a> |
| 511 | +<a href="#511" id="511">511</a> |
| 512 | +<a href="#512" id="512">512</a> |
| 513 | +<a href="#513" id="513">513</a> |
467 | 514 | </pre></div><pre class="rust"><code><span class="comment">// * This file is part of the uutils coreutils package.
|
468 | 515 | // *
|
469 | 516 | // * For the full copyright and license information, please view the LICENSE file
|
470 | 517 | // * that was distributed with this source code.
|
471 | 518 |
|
472 |
| -// spell-checker:ignore clocal tcgetattr tcsetattr tcsanow tiocgwinsz tiocswinsz cfgetospeed cfsetospeed ushort |
| 519 | +// spell-checker:ignore clocal erange tcgetattr tcsetattr tcsanow tiocgwinsz tiocswinsz cfgetospeed cfsetospeed ushort vmin vtime |
473 | 520 |
|
474 | 521 | </span><span class="kw">mod </span>flags;
|
475 | 522 |
|
476 | 523 | <span class="kw">use </span>clap::{crate_version, Arg, ArgAction, ArgMatches, Command};
|
477 | 524 | <span class="kw">use </span>nix::libc::{c_ushort, O_NONBLOCK, TIOCGWINSZ, TIOCSWINSZ};
|
478 | 525 | <span class="kw">use </span>nix::sys::termios::{
|
479 | 526 | cfgetospeed, cfsetospeed, tcgetattr, tcsetattr, ControlFlags, InputFlags, LocalFlags,
|
480 |
| - OutputFlags, Termios, |
| 527 | + OutputFlags, SpecialCharacterIndices, Termios, |
481 | 528 | };
|
482 | 529 | <span class="kw">use </span>nix::{ioctl_read_bad, ioctl_write_ptr_bad};
|
483 | 530 | <span class="kw">use </span>std::io::{<span class="self">self</span>, stdout};
|
|
496 | 543 | target_os = <span class="string">"openbsd"
|
497 | 544 | </span>)))]
|
498 | 545 | </span><span class="kw">use </span>flags::BAUD_RATES;
|
499 |
| -<span class="kw">use </span>flags::{CONTROL_FLAGS, INPUT_FLAGS, LOCAL_FLAGS, OUTPUT_FLAGS}; |
| 546 | +<span class="kw">use </span>flags::{CONTROL_CHARS, CONTROL_FLAGS, INPUT_FLAGS, LOCAL_FLAGS, OUTPUT_FLAGS}; |
500 | 547 |
|
501 | 548 | <span class="kw">const </span>USAGE: <span class="kw-2">&</span>str = <span class="macro">help_usage!</span>(<span class="string">"stty.md"</span>);
|
502 | 549 | <span class="kw">const </span>SUMMARY: <span class="kw-2">&</span>str = <span class="macro">help_about!</span>(<span class="string">"stty.md"</span>);
|
|
711 | 758 | <span class="prelude-val">Ok</span>(())
|
712 | 759 | }
|
713 | 760 |
|
| 761 | +<span class="kw">fn </span>control_char_to_string(cc: nix::libc::cc_t) -> nix::Result<String> { |
| 762 | + <span class="kw">if </span>cc == <span class="number">0 </span>{ |
| 763 | + <span class="kw">return </span><span class="prelude-val">Ok</span>(<span class="string">"<undef>"</span>.to_string()); |
| 764 | + } |
| 765 | + |
| 766 | + <span class="kw">let </span>(meta_prefix, code) = <span class="kw">if </span>cc >= <span class="number">0x80 </span>{ |
| 767 | + (<span class="string">"M-"</span>, cc - <span class="number">0x80</span>) |
| 768 | + } <span class="kw">else </span>{ |
| 769 | + (<span class="string">""</span>, cc) |
| 770 | + }; |
| 771 | + |
| 772 | + <span class="comment">// Determine the '^'-prefix if applicable and character based on the code |
| 773 | + </span><span class="kw">let </span>(ctrl_prefix, character) = <span class="kw">match </span>code { |
| 774 | + <span class="comment">// Control characters in ASCII range |
| 775 | + </span><span class="number">0</span>..=<span class="number">0x1f </span>=> <span class="prelude-val">Ok</span>((<span class="string">"^"</span>, (<span class="string">b'@' </span>+ code) <span class="kw">as </span>char)), |
| 776 | + <span class="comment">// Printable ASCII characters |
| 777 | + </span><span class="number">0x20</span>..=<span class="number">0x7e </span>=> <span class="prelude-val">Ok</span>((<span class="string">""</span>, code <span class="kw">as </span>char)), |
| 778 | + <span class="comment">// DEL character |
| 779 | + </span><span class="number">0x7f </span>=> <span class="prelude-val">Ok</span>((<span class="string">"^"</span>, <span class="string">'?'</span>)), |
| 780 | + <span class="comment">// Out of range (above 8 bits) |
| 781 | + </span><span class="kw">_ </span>=> <span class="prelude-val">Err</span>(nix::errno::Errno::ERANGE), |
| 782 | + }<span class="question-mark">?</span>; |
| 783 | + |
| 784 | + <span class="prelude-val">Ok</span>(<span class="macro">format!</span>(<span class="string">"{meta_prefix}{ctrl_prefix}{character}"</span>)) |
| 785 | +} |
| 786 | + |
| 787 | +<span class="kw">fn </span>print_control_chars(termios: <span class="kw-2">&</span>Termios, opts: <span class="kw-2">&</span>Options) -> nix::Result<()> { |
| 788 | + <span class="kw">if </span>!opts.all { |
| 789 | + <span class="comment">// TODO: this branch should print values that differ from defaults |
| 790 | + </span><span class="kw">return </span><span class="prelude-val">Ok</span>(()); |
| 791 | + } |
| 792 | + |
| 793 | + <span class="kw">for </span>(text, cc_index) <span class="kw">in </span>CONTROL_CHARS { |
| 794 | + <span class="macro">print!</span>( |
| 795 | + <span class="string">"{text} = {}; "</span>, |
| 796 | + control_char_to_string(termios.control_chars[<span class="kw-2">*</span>cc_index <span class="kw">as </span>usize])<span class="question-mark">? |
| 797 | + </span>); |
| 798 | + } |
| 799 | + <span class="macro">println!</span>( |
| 800 | + <span class="string">"min = {}; time = {};"</span>, |
| 801 | + termios.control_chars[SpecialCharacterIndices::VMIN <span class="kw">as </span>usize], |
| 802 | + termios.control_chars[SpecialCharacterIndices::VTIME <span class="kw">as </span>usize] |
| 803 | + ); |
| 804 | + <span class="prelude-val">Ok</span>(()) |
| 805 | +} |
| 806 | + |
714 | 807 | <span class="kw">fn </span>print_in_save_format(termios: <span class="kw-2">&</span>Termios) {
|
715 | 808 | <span class="macro">print!</span>(
|
716 | 809 | <span class="string">"{:x}:{:x}:{:x}:{:x}"</span>,
|
|
730 | 823 | print_in_save_format(termios);
|
731 | 824 | } <span class="kw">else </span>{
|
732 | 825 | print_terminal_size(termios, opts)<span class="question-mark">?</span>;
|
| 826 | + print_control_chars(termios, opts)<span class="question-mark">?</span>; |
733 | 827 | print_flags(termios, opts, CONTROL_FLAGS);
|
734 | 828 | print_flags(termios, opts, INPUT_FLAGS);
|
735 | 829 | print_flags(termios, opts, OUTPUT_FLAGS);
|
|
0 commit comments