Susan's Arrays

From Gwen Morse's Wiki
Jump to: navigation, search

This library is needed for Susan's Lists

; $Id: array.tf,v 1.1 2004/02/19 11:47:23 dittmar Exp $
;/loaded array.tf

; use at your own risk!
; written by Susan Dittmar <Susan dot Dittmar>

/def echo_array = \
    /let arrayname=%{1} %;\
    /let mycount=1 %;\
    /while /test %{arrayname}__%{mycount} !~ "" %;\
        /do /eval /echo %%{%{arrayname}__%{mycount}} %;\
        /test mycount := mycount + 1%;\
    /done
/def exe_array = \
    /let arrayname=%{1} %;\
    /let mycount=1 %;\
    /while /test %{arrayname}__%{mycount} !~ "" %;\
        /do /eval /def testcomm = %%{%{arrayname}__%{mycount}} %;\
        /testcomm %;\
        /undef testcomm %;\
        /test mycount := mycount + 1 %;\
    /done
/def append_array = \
    /let arrayname=%{1} %;\
    /let mycount=1 %;\
    /while /test %{arrayname}__%{mycount} !~ "" %;\
        /do /test mycount := mycount + 1 %;\
    /done %;\
    /eval /set %{arrayname}__%{mycount}=%{-1}
/def del_first_array = \
    /let arrayname=%{1} %;\
    /let mycount=1 %;\
    /while /test %{arrayname}__%{mycount} !~ "" %;\
        /do /eval /set %{arrayname}__%{mycount}=%%{%{arrayname}__$[%{mycount}+1]} %;\
        /test mycount := mycount + 1 %;\
    /done
/def exe_first_array = \
    /let arrayname=%{1}%;\
    /eval /def testcomm = %%{%{arrayname}__1} %;\
    /testcomm %;\
    /undef testcomm
/def clear_array = \
    /let arrayname=%{1}%;\
    /let mycount=1%;\
    /while /test %{arrayname}__%{mycount} !~ ""%;\
    /do /eval /unset %{arrayname}__%{mycount} %;\
        /test mycount := mycount + 1%;\
    /done
/def sort_array = \
    /let arrayname=%{1} %;\
    /let mycount=1 %;\
    /while /test %{arrayname}__%{mycount} !~ "" %;\
        /do /test ++mycount %;\
    /done %;\
    /test --mycount %;\
    /set __changed=1%;\
    /while (__changed!=0) \
        /set __changed=0%;\
        /let _j=1%;\
        /while (_j<mycount) \
            /let _k=$[_j+1]%;\
            /while (_k<=mycount) \
                /eval /if (strcmp({%{arrayname}__%{_j}},{%{arrayname}__%{_k}})>0) \
                    /let __quark=%%{%{arrayname}__%{_j}}%%;\
                    /set %{arrayname}__%{_j}=%%{%{arrayname}__%{_k}}%%;\
                    /set %{arrayname}__%{_k}=%%{__quark}%%;\
                    /set __changed=1%%;\
                /endif %;\
                /let _k=$[_k+1]%;\
            /done %;\
            /let _j=$[_j+1]%;\
        /done %;\
    /done