ref: 7dee296cc084756f355ea76bc4a7e9fc02c62f26
dir: /sys/src/cmd/usb/usbd/mkdev/
#!/bin/rc rfork e DB=usbdb HDR=../lib/usb.h subs=`{ grep '^ Cl.*' $HDR | sed -e 's/.*Cl([a-z]+)[ ]+=[ ]+([0-9]+).*/-e s.\1,.\2,./' | tr A-Z a-z } cat<<EOF /* machine generated. do not edit */ #include <u.h> #include <libc.h> #include <thread.h> #include "usb.h" #include "usbd.h" EOF awk ' /^#|^$/ { next } collect && /^[^ \t]/{ collect = 0; } $0 ~ /^(embed|auto)/{ section = $0; collect = 1; next; } collect { if(section ~ "embed"){ printf("extern int %smain(Dev*, int, char**);\n", $1); } } ' $DB cat <<EOF Devtab devtab[] = { /* device, entrypoint, {csp, csp, csp csp}, vid, did */ EOF awk ' /^#|^$/ { next } collect && /^[^ \t]/{ collect = 0; } $0 ~ /^(embed|auto)/{ section = $0; collect = 1; next; } collect { printf(" {\"%s\"", $1); if(section ~ "embed"){ fns[nfns++] = $1; printf(",\t%smain", $1); } else printf(", nil"); printf(",\t{"); ncsp = 0; vid="-1"; did="-1"; args=""; for(i = 2; i <= NF; i++) if($i ~ "^args="){ sub("args=", "", $i); for(j = i; j <= NF; j++) if(j > i) args = args " " $j; else args = $j } for(i = 2; i <= NF; i++){ if($i ~ "^csp="){ ncsp++; sub("csp=", "", $i); printf("%s, ", $i); } else if($i ~ "^subclass="){ ncsp++; sub("subclass=", "", $i); printf("DSC|%s, ", $i); } else if($i ~ "^class="){ ncsp++; sub("class=", "", $i); printf("DCL|%s, ", $i); } else if($i ~ "^proto="){ ncsp++; sub("proto=", "", $i); printf("DPT|%s, ", $i); } else if($i ~ "^vid="){ sub("vid=", "", $i); vid=$i } else if($i ~ "did="){ sub("did=", "", $i); did=$i } } for(i = ncsp; i < 4; i++) printf("0, "); printf("}, %s, %s, \"%s\"},\n", vid, did, args); } ' $DB | sed $subs cat <<EOF {nil, nil, {0, 0, 0, 0, }, -1, -1, nil}, }; /* end of machine generated */ EOF