Skip to content

Commit 0b673fe

Browse files
committed
code for 0x0d Files
1 parent 3345807 commit 0b673fe

File tree

7 files changed

+194
-0
lines changed

7 files changed

+194
-0
lines changed

0d_files/python/binary.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import sys
2+
from pathlib import Path
3+
4+
5+
def bytes_from_file(filename):
6+
return bytearray(Path(filename).read_bytes())
7+
8+
9+
if __name__ == "__main__":
10+
filename = sys.argv[1]
11+
data = bytes_from_file(filename)
12+
print(f"data size {len(data)}bytes")
13+
14+
user_home = Path.home()
15+
user_fonts = user_home.joinpath('Library', 'Fonts')
16+
print(f"user_home: {user_home} user_fonts: {user_fonts}")
17+
18+
data = bytes_from_file(user_fonts)

0d_files/python/simple.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import sys
2+
3+
4+
if __name__ == "__main__":
5+
6+
7+
with open(sys.argv[1]) as fh:
8+
count = 0
9+
10+
11+
for line in fh:
12+
elems = line.split(',')
13+
if elems[1] == "Tanzania":
14+
count += 1
15+
16+
17+
18+
print(f"found {count} sales for Tanzania")

0d_files/rust/binary/Cargo.toml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
[package]
2+
name = "binary"
3+
version = "0.1.0"
4+
authors = ["Bedroom Builds"]
5+
edition = "2018"
6+
7+
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
8+
9+
[dependencies]
10+
dirs = "3.0.1"

0d_files/rust/binary/src/main.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
use std::io;
2+
use std::path::{Path, PathBuf};
3+
4+
fn bytes_from_file(filename: impl AsRef<std::path::Path>) -> io::Result<Vec<u8>> {
5+
Ok(std::fs::read(filename)?)
6+
}
7+
8+
fn main() -> io::Result<()> {
9+
let args: Vec<String> = std::env::args().collect();
10+
11+
let data = bytes_from_file(&args[1])?;
12+
println!("data size {}bytes", data.len());
13+
14+
let user_home: PathBuf = dirs::home_dir().expect("Could not find home directory.");
15+
let user_fonts = Path::new(&user_home).join("Library").join("Fonts");
16+
println!("user_home: {:?} user_fonts: {:?}", user_home, user_fonts);
17+
18+
let _data = bytes_from_file(user_fonts)?;
19+
Ok(())
20+
}

0d_files/rust/bufread_iterator.rs

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
/// Example using single Stringbuffer and iterators (needs to use Rc!)
2+
3+
fn main() -> std::io::Result<()> {
4+
for line in my_reader::BufReader::open("Cargo.toml")? {
5+
println!("{}", line?.trim());
6+
}
7+
8+
Ok(())
9+
}
10+
11+
mod my_reader {
12+
use std::{
13+
fs::File,
14+
io::{self, prelude::*},
15+
rc::Rc,
16+
};
17+
18+
pub struct BufReader {
19+
reader: io::BufReader<File>,
20+
buf: Rc<String>,
21+
}
22+
23+
fn new_buf() -> Rc<String> {
24+
Rc::new(String::with_capacity(1024)) // Tweakable capacity
25+
}
26+
27+
impl BufReader {
28+
pub fn open(path: impl AsRef<std::path::Path>) -> io::Result<Self> {
29+
let file = File::open(path)?;
30+
let reader = io::BufReader::new(file);
31+
let buf = new_buf();
32+
33+
Ok(Self { reader, buf })
34+
}
35+
}
36+
37+
impl Iterator for BufReader {
38+
type Item = io::Result<Rc<String>>;
39+
40+
fn next(&mut self) -> Option<Self::Item> {
41+
let buf = match Rc::get_mut(&mut self.buf) {
42+
Some(buf) => {
43+
buf.clear();
44+
buf
45+
}
46+
None => {
47+
self.buf = new_buf();
48+
Rc::make_mut(&mut self.buf)
49+
}
50+
};
51+
52+
self.reader
53+
.read_line(buf)
54+
.map(|u| {
55+
if u == 0 {
56+
None
57+
} else {
58+
Some(Rc::clone(&self.buf))
59+
}
60+
})
61+
.transpose()
62+
}
63+
}
64+
}

0d_files/rust/bufread_lines.rs

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
/// Example using a single String Buffer vs new String for every line
2+
3+
fn main() -> std::io::Result<()> {
4+
let mut reader = my_reader::BufReader::open("Cargo.toml")?;
5+
let mut buffer = String::new();
6+
7+
while let Some(line) = reader.read_line(&mut buffer) {
8+
println!("{}", line?.trim());
9+
}
10+
11+
Ok(())
12+
}
13+
14+
mod my_reader {
15+
use std::{
16+
fs::File,
17+
io::{self, prelude::*},
18+
};
19+
20+
pub struct BufReader {
21+
reader: io::BufReader<File>,
22+
}
23+
24+
impl BufReader {
25+
pub fn open(path: impl AsRef<std::path::Path>) -> io::Result<Self> {
26+
let file = File::open(path)?;
27+
let reader = io::BufReader::new(file);
28+
29+
Ok(Self { reader })
30+
}
31+
32+
pub fn read_line<'buf>(
33+
&mut self,
34+
buffer: &'buf mut String,
35+
) -> Option<io::Result<&'buf mut String>> {
36+
buffer.clear();
37+
38+
self.reader
39+
.read_line(buffer)
40+
.map(|u| if u == 0 { None } else { Some(buffer) })
41+
.transpose()
42+
}
43+
}
44+
}

0d_files/rust/simple.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
use std::fs::File;
2+
use std::io::{self, BufRead, BufReader};
3+
4+
fn main() -> io::Result<()> {
5+
let args: Vec<String> = std::env::args().collect();
6+
7+
let file = File::open(&args[1])?;
8+
let reader = BufReader::new(file);
9+
10+
let mut found = 0usize;
11+
for line in reader.lines() {
12+
let line = line?;
13+
let elems: Vec<&str> = line.split(',').collect();
14+
if elems[1] == "Tanzania" {
15+
found += 1;
16+
}
17+
}
18+
println!("found {} sales for Tanzania", found);
19+
Ok(())
20+
}

0 commit comments

Comments
 (0)