Posted to tcl by aspect at Fri Jul 08 02:38:06 GMT 2011view pretty

package provide parse

namespace eval ::parse {
    proc date {data} {  ;# non-unix date format
        if {[string length $data] != 7} {
            error "Incorrect input!"
        }
        ::binary scan $data Iccccc Y m d H M S
        clock scan "$Y-$M-$D $H:$M:$S"
    }

    proc csv {s args} {
        if {[llength $args] == 1} { set args [lindex $args 0] }
        array set res {}
        foreach key $args value [split $s ,] {
            set res($key) $value
        }
        array get res
    }

    proc binary {s args} {
        array set typemap {
            u64   Wu
            u32   Iu
            u16   Su
            u8    cu
            s64   W
            s32   I
            s16   S
            s8    c
        }
        if {[llength $args] == 1} { set args [lindex $args 0] }
        set bs {}
        set targets {}
        foreach {type name} $args {
            if {[array names typemap $type] != ""} {
                append bs $typemap($type)
            } else {
                append bs $type
            }
            lappend targets rec($name)
        }
        array set rec {}
        ::binary scan $s $bs {*}$targets
        array get rec
    }
}