use std::io::{BufReader, Read};
use std::fs::File;
use std::env;

fn args() -> Vec<String> {
    if env::args().count() < 2 {
        vec!["/dev/stdin".to_owned()]
    } else {
        env::args().skip(1).collect()
    }
}

fn analyse(name: &str) {
    let mut acc = [0u64; 0x100];
    let mut size = 0u64;
    for b in BufReader::new(File::open(name).expect(name)).bytes() {
        acc[b.expect("byte") as usize] += 1;
        size += 1;
    }
    let mut entropy = 0.0;
    let invsize = 1.0 / size as f64;
    for count in acc.iter() {
        if *count > 0 {
            let p = *count as f64 * invsize;
            entropy -= p * p.log(256.0);
        }
    }
    println!("{}\t{}", entropy, name);
}

fn main() {
    for file in args() {
        analyse(&file);
    }
}