@ -7,6 +7,8 @@ use getrandom::*;
mod parse ;
mod parse ;
mod r #impl ;
mod r #impl ;
const BYTES_BUFFER_SIZE : usize = 4096 ;
fn get < T : Default > ( ) -> Result < T , Error >
fn get < T : Default > ( ) -> Result < T , Error >
{
{
let mut value : T = Default ::default ( ) ;
let mut value : T = Default ::default ( ) ;
@ -151,22 +153,40 @@ fn shuffle(args: &[String]) -> Result<(), Error>
fn bytes ( args : & [ String ] ) -> Result < ( ) , Error >
fn bytes ( args : & [ String ] ) -> Result < ( ) , Error >
{
{
if args . len ( ) < 1 {
if args . len ( ) < 1 {
usage ( ) ;
usage ( ) ;
} else {
} else {
let num = parse ::bytes ( & args [ 0 ] ) . expect ( "Failed to parse number of bytes" ) as usize ;
let num = parse ::bytes ( & args [ 0 ] ) . expect ( "Failed to parse number of bytes" ) as usize ;
let mut mem = Vec ::with_capacity ( num ) ;
if cfg! ( feature = "bytes-dynamic" ) {
debug_assert_eq! ( mem . capacity ( ) , num ) ;
let mut mem = Vec ::with_capacity ( num ) ;
// SAFETY: populating uninitialised memory with random data. There are no reads to the uninitialised data.
unsafe {
debug_assert_eq! ( mem . capacity ( ) , num ) ;
mem . set_len ( num ) ;
// SAFETY: populating uninitialised memory with random data. There are no reads to the uninitialised data.
populate ( & mut mem [ .. ] ) ? ;
unsafe {
mem . set_len ( num ) ;
populate ( & mut mem [ .. ] ) ? ;
}
debug_assert_eq! ( num , mem . len ( ) ) ;
let stdout = std ::io ::stdout ( ) ;
use std ::io ::Write ;
stdout . lock ( ) . write_all ( & mem [ .. ] ) . expect ( "write error" ) ;
} else {
let mut buffer = [ 0 u8 ; BYTES_BUFFER_SIZE ] ;
let mut num = num ;
let stdout = std ::io ::stdout ( ) ;
let mut stdout = stdout . lock ( ) ;
while num > 0 {
let w = std ::cmp ::min ( num , BYTES_BUFFER_SIZE ) ;
getrandom ( & mut buffer [ .. w ] ) ? ;
use std ::io ::Write ;
stdout . write_all ( & buffer [ .. w ] ) . expect ( "write error" ) ;
num - = w ;
}
}
}
debug_assert_eq! ( num , mem . len ( ) ) ;
let stdout = std ::io ::stdout ( ) ;
use std ::io ::Write ;
stdout . lock ( ) . write_all ( & mem [ .. ] ) . expect ( "write error" ) ;
}
}
Ok ( ( ) )
Ok ( ( ) )
}
}