# Some misc functions..  ircII2.2 and beyond
# by: Ian

# reverse a string fed to it.
# $reverse(65 one two three) returns.. 
#                                                          eerht owt eno
# The formatting can be removed.
alias reverse {
	^assign -rev.result
	@ rev.ind = 0
	@ rev.str = [$1-]
	while (mid($rev.ind 1 $rev.str)!=[])
	{
		@ rev.result = [$mid($rev.ind 1 $rev.str)] ## [$rev.result]
		@ rev.ind = rev.ind + 1
	}
	# This right justifies to a field with of $0.  
	# strip out the format() function if you don't want it formatted.
	@ function_return = format($0 $rev.result)
}

# These have been updated to handle multiple words.
# format and lformat differ from $[-num]var and $[num]var in that
# They don't chop off the string if it is too long.
alias format {
	@ IRCII.word = [$1-]
	if (@IRCII.word < [$0]) 
		{ @ function_return = [$([-$0]IRCII.word)] } 
		{ @ function_return = [$IRCII.word] } 
}

alias lformat {
	@ IRCII.word = [$1-]
	if (@IRCII.word < [$0]) 
		{ @ function_return = [$([$0]IRCII.word)] } 
		{ @ function_return = [$IRCII.word] } 
}

# Center text within a given width.   center(width text)
# "$center(10 one)"   returns "   one"
# this might not make sense at first, but it saves alot of cursor travel
# not writing all the spaces on the right side.
alias center {
	@ IRCII.word = [$1-]
	@ IRCII.wordl = [$@IRCII.word]
	@ IRCII.width = [$0]
	if (IRCII.wordl > [$IRCII.width])
		{ @ function_return = [$ircII.word] }
		{ @ function_return = [$([${(IRCII.width - ircII.wordl)/2}])] ## [$IRCII.word] }
}

# This is the huge beastly CPU expensive search and replace funnction 
# written entirely in ircII script language.
# $sandr(search pat/replace pat/words)
# the search and replace patterns can contain spaces or any other chars
# with the exeption of '/'.
alias sandr {
	@ sr.src = [$left($index(/ $*) $*)]
	@ sr.rep = [$mid(${index(/ $*) +1} ${rindex(/ $*) - index(/ $*) +1} $*)]
	@ sr.word = [$mid(${rindex(/ $*) + 1} 512 $*)]
	@ sr.srcl = @sr.src
	@ sr.wordl = @sr.word
	@ sr.cnt1 = 0
	@ sr.cnt2 = 0
	@ sr.lmark = 0
	@ sr.gotit = 0
	^assign -sr.fstring
	while (sr.cnt1 < sr.wordl)
	{
		@ sr.scnt1 = sr.cnt1
		while (([$mid($sr.cnt1 1 $sr.word)] == [$mid($sr.cnt2 1 $sr.src)]) && (sr.cnt2 < sr.srcl))
		{
			if (sr.cnt2 == sr.srcl - 1)
			{
				@ sr.gotit = 1
			}
			@ sr.cnt1 = sr.cnt1 + 1
			@ sr.cnt2 = sr.cnt2 + 1
		}
		@ sr.cnt2 = 0
		if (sr.gotit)
		{
			@ sr.fstring = [$sr.fstring] ## [$mid($sr.lmark ${sr.scnt1 - sr.lmark} $sr.word)] ## [$sr.rep]
			@ sr.gotit = 0
			@ sr.lmark = sr.cnt1
		}
		{
			@ sr.cnt1 = sr.cnt1 +1
		}
	}
	@ sr.fstring = [$sr.fstring] ## [$mid($sr.lmark 512 $sr.word)]
	@ function_return = [$sr.fstring]
}

# The perfect complement to the $word() function.  
# $notword(index words)  returns words minus the indexed word. 
# the special handling of nw.sep is to deal with the cases when 
# the index points to the first or last word.
alias notword {
    if ([$0] > 0)
    {
	if (([$0] > 1) && ([$0] < rmatch($~ $1-)))
		{ @ nw.sep = [ ] }
		{ @ nw.sep = [] }
		
	@ function_return = [$(1-${[$0]-1})] ## [$nw.sep] ## [$(${[$0]+1}-)]
    }
    {
        @ function_return = [$1-]
    }
}

# If you want to look an array.. Type /show <arrayname>
# Lists keys and contents
^alias show {
  if ( [$($0)] )
  {
    echo $0 $($0)
  }
  foreach $0 ii
  {
    show $0.$ii
  }
  ^assign -ii
}


# push an item onto the head of a list
# this only takes the name of the list instead of the variable itself. 
# examples.
# /push list Item
# or     if (push(list Item)) { echo push sucessful } { echo push failed }
# echo $list returns 'Item'
alias push {
	if (![$1])
	{ @function_return = 0 }
	{ eval @ $0 = [$1- $($0)];@function_return = 1}
}
	
# pop an item off a list.  Specified with $pop(listname)
# note there is no $ in front of listname.
# examples.
# /eval echo $pop(list)         returns 'Item' and the list is shortened
# push List2 $pop(List1)        moves first item from List1 to List2
alias pop {
	@function_return = word(0 $($0))
	eval @ $0 = notword(1 $($0))
}

alias pluck {
	@ function_return = notword($match($1 $($0)) $($0))
}
