ref: 9f9c33d10d88bc328309a5877dcac72c3fa96c1a
dir: /bin/s/
#!/bin/rc
# sam functions
# ^D [cmd] # run command in cwd and send output to jam.err window
fn D{
if(~ $% jam.err */jam.err){
echo nope >[1=2]
exit
}
echo '^T'
c=''''^($*)^''''
f=$%
echo !'{' '@{' $c '}' '}'
echo B /tmp/jam.err
echo e
echo b $f
echo b ~~jam~~
}
# ^R [cmd] # run command and send output to jam.err window
fn R{
if(~ $% jam.err */jam.err){
echo nope >[1=2]
exit
}
echo '^T'
c=''''^($*)^''''
f=$%
echo !'{' cd `{basename -d $f} '&&' '@{' $c '}' '}'
echo B /tmp/jam.err
echo e
echo b $f
echo b ~~jam~~
}
# ^T # write to disk any modified files
fn T{
echo X/^''''/w
}
# !o name expr # save a sam command
fn o{
# beware of free carets between the überquotes
echo fn $1 '{' echo '''' $*(2-) '''' '}' >/env/'fn#'^$1
}
# ^O expr # run any rc function
fn O{
fun $*
}
# from kvik's rc/rwin
# ^W [cmd] # open window in current file's directory
fn W{
if(~ $% jam.err */jam.err){
echo nope >[1=2]
exit
}
echo '^T'
echo !exec window -minx 0 -miny 0 -dx 600 -dy 600 -m -cd `{basename -d $%} $*
}
# ^dump # print all files in menu
fn dump{
rfork e
d = `{pwd}
echo 'Y/^..\./!echo `{cleanname -d' $d '$%}^'':#''^$%dot(2)^'',#''^$%dot(3) >>/tmp/dump.'$pid
echo 'X/^..\./!echo `{cleanname -d' $d '$%}^'':#''^$%dot(2)^'',#''^$%dot(3) >>/tmp/dump.'$pid
echo r '/tmp/dump.'$pid
echo !rm '/tmp/dump.'$pid
}
# from umbraticus' rc/s/u
# !u [fn...] # print sam fn usage
fn U{
if(~ $#* 0) sed -n 's/^# ([_!^|><])/\1/p' /bin/s
if not for(i) sed -n 's/^# ([_!^|><]'^$i^' )/\1/p' /bin/s
}
fn u{
window -m -dx 636 rc -c 'U; read'
}
# ^+ [n] # increase indent
fn +{
t=' '
if(! ~ $#* 0)
for(i in `{seq 2 1 $1}) t=$t^' '
echo 's/^/'^$t^'/g'
}
# ^- [n] # decrease indent
fn -{
t=' '
if(! ~ $#* 0)
for(i in `{seq 2 1 $1}) t=$t^' '
echo 's/^'^$t^'//g'
}
# ^swap # swap two strings specified as regular expressions
fn swap{
echo s/''^$"1^''/‡‡'&'‡‡/g
echo s/''^$"2^''/''^$"1^''/g
echo s/‡‡''^$"1^''‡‡/''^$"2^''/g
}
# from umbraticus' rc/s
# |pc # inline arithmetic
fn pc{
/bin/pc -n | tr -d '
'
}
# _sig # print function signature
fn sig{
sed '1s/.*/!sig &/;q'
}
# _i # find information about selected C function/struct or command
fn i{
rfork e
name = `{read}
if(! ~ $#name 1){
echo !echo select a function/struct/command name first!
exit
}
cd `{basename -d $%}
match = `{g '^([*a-zA-Z]+[ ]+)*'^$name^'[ ]*(\([^;]*)?$' | sed '1{s/: .*//;q;}'}
if(~ $#match 1) # local function definition
plumb $match
if not{
match = `{g 'struct[ ]+'^$name^'[ ]*({|$)' | sed '1{s/: .*//;q;}'}
if(~ $#match 1) # local struct definition
plumb $match
if not{
match = `{struct $name | sed 1q}
if(~ $#match 1) # system struct definition
plumb $match
if not{
match = `{man -w $name >[2]/dev/null | sed 's†.*/([0-9])/(.*)†\2(\1)†'}
if(! ~ $#match 0){ # system function or command
echo !echo ''''^$"match^''''
echo !sig $name
}
if not{ # getting really desperate now...
match = `{lookman $name | sed 's/.*#//'}
if(~ $#match 0)
echo !echo no information found for $name
if not
echo !echo ''''^$"match^''''
}
}
}
}
}
# _m # plumb man page for selected name
fn m{
sed '1s/.*/!plumb &''(0)''/;q'
}
# ^rn from to # rename C identifier
fn rn{
rfork e
if(! ~ $#* 2){
echo 'usage: ^rn from to'
exit
}
if(~ $%dot(2) $%dot(3)) echo ,
charconst='''[^'']*'''
strconst='"([^"]|\\")*"'
name='[a-zA-Z_¡-][a-zA-Z_0-9¡-]*'
partial=`{
echo -n $1 |
awk '{for(i = 0; i < length($1) + 1; i++) printf "."}'
}
echo 'y/'$charconst'/ y/'$strconst'/ x/'$name'/ g/'$1'/ v/'$partial'/ c/'$2
}
# ^cc # c comment
fn cc{
echo '#'^$%dot(3)^'a/*\//'
echo '#'^$%dot(2)^'i/\/*/'
}
# ^uc # uncomment c/rc code
fn uc{
echo 'x/^(#|\/\/) ?/d'
}
# common menu items
cat <<!
M ^T
M ^W
M ^R mk install
M |fmt -l 82
!
# more common menu items
if(test -f $home/lib/jam)
. $home/lib/jam