shithub: bin.rc

ref: 49c1ea83f5e42094b933e462eee157063a0ae690
dir: /bin/c/

View raw version
#!/bin/rc
rfork e
fn usage {>[2=1] echo 'usage:' $usage && exit 'usage'}
usage='c [-fs] [regex] [search]
	-f        find functions
	-s        find structs'

fn struct {
	ignore = (/sys/include/ape)
	search = $*
	if(~ $#search 0)
		search = (/sys/include .)
	if(~ $search *^$ignore^*)
		ignore = (cat)
	if not
		ignore = (grep -v -e^'^'$ignore)

	files = `{walk -f $search | $ignore | grep '\.[chsyl]$'}

	echo 'X ,x@^(typedef[ 	\n]+)?struct([^}][^;]*\n*)+}.*;\n@ g@^(typedef[ 	\n]+)?struct[ 	]+'$regex'@ {
		!echo '•' $%:$%dot(1)
		p
	}' | sam -d $files >[2]/dev/null
}

fn function {
	ignore = ('\.root.s$' 'cmd/python/')
	search = $*
	if(~ $#search 0)
		search = (.)
	if(~ $search *^$ignore^*)
		ignore = (cat)
	if not
		ignore = (grep -v -e^'^'$ignore)

	files = `{walk -f $search | $ignore | grep '\.[chsyl]$'}

	sep = '	• '
	echo 'X ,x g@^'$regex'\(@ {
		!echo -n $%:$%dot(1) $sep
		p
	}' | sam -d $files >[2]/dev/null
}

identifier = '[a-zA-Z_0-9]*'
op = (struct)
while(~ $1 -* && ! ~ $1 --){
	switch($1){
	case -f -func*
		op = 'function'
	case -s -struct
		op = 'struct'
	case *
		usage
	}
	shift
}
if(~ $1 --)
	shift
regex = `{echo $1 | sed 's:%:'$identifier':g'}
if(~ $#regex 0)
	regex = $identifier
shift

$op $*