null-terminated 0.3.17

Library of null-terminated slices and UTF-8-encoded strings with thin references
Documentation
#![no_main]
#![feature(nll)]

extern crate null_terminated;
extern crate syscall;
use null_terminated::Nul;
use syscall::syscall;

#[no_mangle]
extern "C" fn main(_: isize, args: &'static Nul<&'static Nul<u8>>) -> isize {
    let mut n_flag = false;
    let mut argi = args.iter().peekable();
    loop {
        argi.next();
        let arg = match argi.peek() {
            None => break,
            Some(arg) => arg,
        };
        if Some(b'-') != arg.get(0).map(Clone::clone) { break }
        for flag in arg.iter().skip(1) {
            match flag {
                b'n' => n_flag = true,
                _ => {
                    write(2, "Usage: echo [-n] <arg>...".as_bytes());
                    return 1;
                }
            }
        }
    }
    let mut c = 0;
    for (k, arg) in argi.enumerate() {
        if k > 0 { c |= write(1, " ".as_bytes()); }
        c |= dputs(arg, 1);
    }
    if !n_flag { c |= write(1, "\n".as_bytes()); }
    c
}

fn dputs(s: &Nul<u8>, fd: isize) -> isize { write(fd, &s[..]) }

fn write(fd: isize, bs: &[u8]) -> isize {
    unsafe { syscall!(WRITE, fd, bs.as_ptr(), bs.len()) as _ }
}