mirror of
https://github.com/RGBCube/uutils-coreutils
synced 2025-07-29 20:17:45 +00:00
Merge pull request #2087 from pedrohjordao/printf-clap-opts
Changes parameter parsing to clap
This commit is contained in:
commit
b96f7dbaea
9 changed files with 22 additions and 131 deletions
|
@ -18,18 +18,15 @@ pub fn err_msg(msg: &str) {
|
||||||
|
|
||||||
// by default stdout only flushes
|
// by default stdout only flushes
|
||||||
// to console when a newline is passed.
|
// to console when a newline is passed.
|
||||||
#[allow(unused_must_use)]
|
|
||||||
pub fn flush_char(c: char) {
|
pub fn flush_char(c: char) {
|
||||||
print!("{}", c);
|
print!("{}", c);
|
||||||
stdout().flush();
|
let _ = stdout().flush();
|
||||||
}
|
}
|
||||||
#[allow(unused_must_use)]
|
|
||||||
pub fn flush_str(s: &str) {
|
pub fn flush_str(s: &str) {
|
||||||
print!("{}", s);
|
print!("{}", s);
|
||||||
stdout().flush();
|
let _ = stdout().flush();
|
||||||
}
|
}
|
||||||
#[allow(unused_must_use)]
|
|
||||||
pub fn flush_bytes(bslice: &[u8]) {
|
pub fn flush_bytes(bslice: &[u8]) {
|
||||||
stdout().write(bslice);
|
let _ = stdout().write(bslice);
|
||||||
stdout().flush();
|
let _ = stdout().flush();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
#![allow(dead_code)]
|
#![allow(dead_code)]
|
||||||
|
|
||||||
// spell-checker:ignore (change!) each's
|
// spell-checker:ignore (change!) each's
|
||||||
// spell-checker:ignore (ToDO) LONGHELP FORMATSTRING templating parameterizing formatstr
|
// spell-checker:ignore (ToDO) LONGHELP FORMATSTRING templating parameterizing formatstr
|
||||||
|
|
||||||
|
@ -9,7 +8,6 @@ mod tokenize;
|
||||||
|
|
||||||
static NAME: &str = "printf";
|
static NAME: &str = "printf";
|
||||||
static VERSION: &str = env!("CARGO_PKG_VERSION");
|
static VERSION: &str = env!("CARGO_PKG_VERSION");
|
||||||
static SHORT_USAGE: &str = "printf: usage: printf [-v var] format [arguments]";
|
|
||||||
static LONGHELP_LEAD: &str = "printf
|
static LONGHELP_LEAD: &str = "printf
|
||||||
|
|
||||||
USAGE: printf FORMATSTRING [ARGUMENT]...
|
USAGE: printf FORMATSTRING [ARGUMENT]...
|
||||||
|
|
|
@ -28,8 +28,7 @@ pub fn arrnum_int_mult(arr_num: &[u8], basenum: u8, base_ten_int_fact: u8) -> Ve
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#[allow(clippy::map_clone)]
|
let ret: Vec<u8> = ret_rev.into_iter().rev().collect();
|
||||||
let ret: Vec<u8> = ret_rev.iter().rev().map(|x| *x).collect();
|
|
||||||
ret
|
ret
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -102,70 +101,6 @@ pub fn arrnum_int_div_step(
|
||||||
remainder: rem_out,
|
remainder: rem_out,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// pub struct ArrFloat {
|
|
||||||
// pub leading_zeros: u8,
|
|
||||||
// pub values: Vec<u8>,
|
|
||||||
// pub basenum: u8
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// pub struct ArrFloatDivOut {
|
|
||||||
// pub quotient: u8,
|
|
||||||
// pub remainder: ArrFloat
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// pub fn arrfloat_int_div(
|
|
||||||
// arrfloat_in : &ArrFloat,
|
|
||||||
// base_ten_int_divisor : u8,
|
|
||||||
// precision : u16
|
|
||||||
// ) -> DivOut {
|
|
||||||
//
|
|
||||||
// let mut remainder = ArrFloat {
|
|
||||||
// basenum: arrfloat_in.basenum,
|
|
||||||
// leading_zeros: arrfloat_in.leading_zeroes,
|
|
||||||
// values: Vec<u8>::new()
|
|
||||||
// }
|
|
||||||
// let mut quotient = 0;
|
|
||||||
//
|
|
||||||
// let mut bufferval : u16 = 0;
|
|
||||||
// let base : u16 = arrfloat_in.basenum as u16;
|
|
||||||
// let divisor : u16 = base_ten_int_divisor as u16;
|
|
||||||
//
|
|
||||||
// let mut it_f = arrfloat_in.values.iter();
|
|
||||||
// let mut position = 0 + arrfloat_in.leading_zeroes as u16;
|
|
||||||
// let mut at_end = false;
|
|
||||||
// while position< precision {
|
|
||||||
// let next_digit = match it_f.next() {
|
|
||||||
// Some(c) => {}
|
|
||||||
// None => { 0 }
|
|
||||||
// }
|
|
||||||
// match u_cur {
|
|
||||||
// Some(u) => {
|
|
||||||
// bufferval += u.clone() as u16;
|
|
||||||
// if bufferval > divisor {
|
|
||||||
// while bufferval >= divisor {
|
|
||||||
// quotient+=1;
|
|
||||||
// bufferval -= divisor;
|
|
||||||
// }
|
|
||||||
// if bufferval == 0 {
|
|
||||||
// rem_out.position +=1;
|
|
||||||
// } else {
|
|
||||||
// rem_out.replace = Some(bufferval as u8);
|
|
||||||
// }
|
|
||||||
// break;
|
|
||||||
// } else {
|
|
||||||
// bufferval *= base;
|
|
||||||
// }
|
|
||||||
// },
|
|
||||||
// None => {
|
|
||||||
// break;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// u_cur = it_f.next().clone();
|
|
||||||
// rem_out.position+=1;
|
|
||||||
// }
|
|
||||||
// ArrFloatDivOut { quotient: quotient, remainder: remainder }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
pub fn arrnum_int_add(arrnum: &[u8], basenum: u8, base_ten_int_term: u8) -> Vec<u8> {
|
pub fn arrnum_int_add(arrnum: &[u8], basenum: u8, base_ten_int_term: u8) -> Vec<u8> {
|
||||||
let mut carry: u16 = u16::from(base_ten_int_term);
|
let mut carry: u16 = u16::from(base_ten_int_term);
|
||||||
let mut rem: u16;
|
let mut rem: u16;
|
||||||
|
@ -193,8 +128,7 @@ pub fn arrnum_int_add(arrnum: &[u8], basenum: u8, base_ten_int_term: u8) -> Vec<
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#[allow(clippy::map_clone)]
|
let ret: Vec<u8> = ret_rev.into_iter().rev().collect();
|
||||||
let ret: Vec<u8> = ret_rev.iter().rev().map(|x| *x).collect();
|
|
||||||
ret
|
ret
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -219,8 +153,7 @@ pub fn unsigned_to_arrnum(src: u16) -> Vec<u8> {
|
||||||
}
|
}
|
||||||
|
|
||||||
// temporary needs-improvement-function
|
// temporary needs-improvement-function
|
||||||
#[allow(unused_variables)]
|
pub fn base_conv_float(src: &[u8], radix_src: u8, _radix_dest: u8) -> f64 {
|
||||||
pub fn base_conv_float(src: &[u8], radix_src: u8, radix_dest: u8) -> f64 {
|
|
||||||
// it would require a lot of addl code
|
// it would require a lot of addl code
|
||||||
// to implement this for arbitrary string input.
|
// to implement this for arbitrary string input.
|
||||||
// until then, the below operates as an outline
|
// until then, the below operates as an outline
|
||||||
|
@ -267,7 +200,6 @@ pub fn arrnum_to_str(src: &[u8], radix_def_dest: &dyn RadixDef) -> String {
|
||||||
str_out
|
str_out
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(unused_variables)]
|
|
||||||
pub fn base_conv_str(
|
pub fn base_conv_str(
|
||||||
src: &str,
|
src: &str,
|
||||||
radix_def_src: &dyn RadixDef,
|
radix_def_src: &dyn RadixDef,
|
||||||
|
|
|
@ -43,45 +43,15 @@ impl Formatter for CninetyNineHexFloatf {
|
||||||
// c99 hex has unique requirements of all floating point subs in pretty much every part of building a primitive, from prefix and suffix to need for base conversion (in all other cases if you don't have decimal you must have decimal, here it's the other way around)
|
// c99 hex has unique requirements of all floating point subs in pretty much every part of building a primitive, from prefix and suffix to need for base conversion (in all other cases if you don't have decimal you must have decimal, here it's the other way around)
|
||||||
|
|
||||||
// on the todo list is to have a trait for get_primitive that is implemented by each float formatter and can override a default. when that happens we can take the parts of get_primitive_dec specific to dec and spin them out to their own functions that can be overridden.
|
// on the todo list is to have a trait for get_primitive that is implemented by each float formatter and can override a default. when that happens we can take the parts of get_primitive_dec specific to dec and spin them out to their own functions that can be overridden.
|
||||||
#[allow(unused_variables)]
|
|
||||||
#[allow(unused_assignments)]
|
|
||||||
fn get_primitive_hex(
|
fn get_primitive_hex(
|
||||||
inprefix: &InPrefix,
|
inprefix: &InPrefix,
|
||||||
str_in: &str,
|
_str_in: &str,
|
||||||
analysis: &FloatAnalysis,
|
_analysis: &FloatAnalysis,
|
||||||
last_dec_place: usize,
|
_last_dec_place: usize,
|
||||||
capitalized: bool,
|
capitalized: bool,
|
||||||
) -> FormatPrimitive {
|
) -> FormatPrimitive {
|
||||||
let prefix = Some(String::from(if inprefix.sign == -1 { "-0x" } else { "0x" }));
|
let prefix = Some(String::from(if inprefix.sign == -1 { "-0x" } else { "0x" }));
|
||||||
|
|
||||||
// assign the digits before and after the decimal points
|
|
||||||
// to separate slices. If no digits after decimal point,
|
|
||||||
// assign 0
|
|
||||||
let (mut first_segment_raw, second_segment_raw) = match analysis.decimal_pos {
|
|
||||||
Some(pos) => (&str_in[..pos], &str_in[pos + 1..]),
|
|
||||||
None => (str_in, "0"),
|
|
||||||
};
|
|
||||||
if first_segment_raw.is_empty() {
|
|
||||||
first_segment_raw = "0";
|
|
||||||
}
|
|
||||||
// convert to string, hexifying if input is in dec.
|
|
||||||
// let (first_segment, second_segment) =
|
|
||||||
// match inprefix.radix_in {
|
|
||||||
// Base::Ten => {
|
|
||||||
// (to_hex(first_segment_raw, true),
|
|
||||||
// to_hex(second_segment_raw, false))
|
|
||||||
// }
|
|
||||||
// _ => {
|
|
||||||
// (String::from(first_segment_raw),
|
|
||||||
// String::from(second_segment_raw))
|
|
||||||
// }
|
|
||||||
// };
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// f.pre_decimal = Some(first_segment);
|
|
||||||
// f.post_decimal = Some(second_segment);
|
|
||||||
//
|
|
||||||
|
|
||||||
// TODO actual conversion, make sure to get back mantissa.
|
// TODO actual conversion, make sure to get back mantissa.
|
||||||
// for hex to hex, it's really just a matter of moving the
|
// for hex to hex, it's really just a matter of moving the
|
||||||
// decimal point and calculating the mantissa by its initial
|
// decimal point and calculating the mantissa by its initial
|
||||||
|
|
|
@ -22,12 +22,11 @@ fn get_len_fprim(fprim: &FormatPrimitive) -> usize {
|
||||||
len
|
len
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct Decf {
|
pub struct Decf;
|
||||||
as_num: f64,
|
|
||||||
}
|
|
||||||
impl Decf {
|
impl Decf {
|
||||||
pub fn new() -> Decf {
|
pub fn new() -> Decf {
|
||||||
Decf { as_num: 0.0 }
|
Decf
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
impl Formatter for Decf {
|
impl Formatter for Decf {
|
||||||
|
|
|
@ -5,12 +5,10 @@ use super::super::format_field::FormatField;
|
||||||
use super::super::formatter::{FormatPrimitive, Formatter, InPrefix};
|
use super::super::formatter::{FormatPrimitive, Formatter, InPrefix};
|
||||||
use super::float_common::{get_primitive_dec, primitive_to_str_common, FloatAnalysis};
|
use super::float_common::{get_primitive_dec, primitive_to_str_common, FloatAnalysis};
|
||||||
|
|
||||||
pub struct Floatf {
|
pub struct Floatf;
|
||||||
as_num: f64,
|
|
||||||
}
|
|
||||||
impl Floatf {
|
impl Floatf {
|
||||||
pub fn new() -> Floatf {
|
pub fn new() -> Floatf {
|
||||||
Floatf { as_num: 0.0 }
|
Floatf
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
impl Formatter for Floatf {
|
impl Formatter for Floatf {
|
||||||
|
|
|
@ -11,7 +11,7 @@ use std::i64;
|
||||||
use std::u64;
|
use std::u64;
|
||||||
|
|
||||||
pub struct Intf {
|
pub struct Intf {
|
||||||
a: u32,
|
_a: u32,
|
||||||
}
|
}
|
||||||
|
|
||||||
// see the Intf::analyze() function below
|
// see the Intf::analyze() function below
|
||||||
|
@ -24,7 +24,7 @@ struct IntAnalysis {
|
||||||
|
|
||||||
impl Intf {
|
impl Intf {
|
||||||
pub fn new() -> Intf {
|
pub fn new() -> Intf {
|
||||||
Intf { a: 0 }
|
Intf { _a: 0 }
|
||||||
}
|
}
|
||||||
// take a ref to argument string, and basic information
|
// take a ref to argument string, and basic information
|
||||||
// about prefix (offset, radix, sign), and analyze string
|
// about prefix (offset, radix, sign), and analyze string
|
||||||
|
|
|
@ -5,12 +5,11 @@ use super::super::format_field::FormatField;
|
||||||
use super::super::formatter::{FormatPrimitive, Formatter, InPrefix};
|
use super::super::formatter::{FormatPrimitive, Formatter, InPrefix};
|
||||||
use super::float_common::{get_primitive_dec, primitive_to_str_common, FloatAnalysis};
|
use super::float_common::{get_primitive_dec, primitive_to_str_common, FloatAnalysis};
|
||||||
|
|
||||||
pub struct Scif {
|
pub struct Scif;
|
||||||
as_num: f64,
|
|
||||||
}
|
|
||||||
impl Scif {
|
impl Scif {
|
||||||
pub fn new() -> Scif {
|
pub fn new() -> Scif {
|
||||||
Scif { as_num: 0.0 }
|
Scif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
impl Formatter for Scif {
|
impl Formatter for Scif {
|
||||||
|
|
|
@ -242,18 +242,16 @@ impl UnescapedText {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#[allow(unused_variables)]
|
|
||||||
impl token::Tokenizer for UnescapedText {
|
impl token::Tokenizer for UnescapedText {
|
||||||
fn from_it(
|
fn from_it(
|
||||||
it: &mut PutBackN<Chars>,
|
it: &mut PutBackN<Chars>,
|
||||||
args: &mut Peekable<Iter<String>>,
|
_: &mut Peekable<Iter<String>>,
|
||||||
) -> Option<Box<dyn token::Token>> {
|
) -> Option<Box<dyn token::Token>> {
|
||||||
UnescapedText::from_it_core(it, false)
|
UnescapedText::from_it_core(it, false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#[allow(unused_variables)]
|
|
||||||
impl token::Token for UnescapedText {
|
impl token::Token for UnescapedText {
|
||||||
fn print(&self, pf_args_it: &mut Peekable<Iter<String>>) {
|
fn print(&self, _: &mut Peekable<Iter<String>>) {
|
||||||
cli::flush_bytes(&self.0[..]);
|
cli::flush_bytes(&self.0[..]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue