//genesis // // $Id: stack.g 1.3 Thu, 04 Apr 2002 11:55:56 +0200 hugo $ // ////////////////////////////////////////////////////////////////////////////// //' //' Purkinje tutorial //' //' (C) 1998-2002 BBF-UIA //' //' see our site at http://www.bbf.uia.ac.be/ for more information regarding //' the Purkinje cell and genesis simulation software. //' //' //' functional ideas ... Erik De Schutter, erik@bbf.uia.ac.be //' genesis coding ..... Hugo Cornelis, hugo@bbf.uia.ac.be //' //' general feedback ... Reinoud Maex, Erik De Schutter //' ////////////////////////////////////////////////////////////////////////////// // stack.g : a simple stack implementation int include_stack if ( {include_stack} == 0 ) include_stack = 1 include utility.g extern StackCreate extern StackPop extern StackPush extern StackTopElement extern StackTop /// /// SH: StackCreate /// /// PA: path..: path to contain stack elements ending in '/' /// /// DE: Create a stack /// function StackCreate(path) str path //- create stack container create neutral {path}stack //- add field for number of elements addfield {path}stack \ elements -description "Number of elements -1 in stack" //- initialize field setfield {path}stack elements -1 end /// /// SH: StackDelete /// /// PA: path..: path with stack elements ending in '/' /// /// DE: Delete stack /// function StackDelete(path) str path //- delete stack container delete {path}stack end /// /// SH: StackNumberOfElements /// /// PA: path..: path with stack elements ending in '/' /// /// RE: number of values in stack /// /// DE: Get number of values in stack /// function StackNumberOfElements(path) str path return {{getfield {path}stack elements} + 1} end /// /// SH: StackPop /// /// PA: path..: path with stack elements ending in '/' /// /// RE: value of previous top of stack /// /// DE: Pop value onto stack /// function StackPop(path) str path str top str val //- get number of elements in stack int iElements = {StackNumberOfElements {path}} //- if no underflow if (iElements > 0) //- get stack top top = {StackTopElement {path}} //- get value of stacktop val = {getfield {top} value} //- delete top delete {top} //- adjust element count setfield {path}stack \ elements {{getfield {path}stack elements} - 1} //- else else //- set empty result val = "" end //- return value return {val} end /// /// SH: StackPush /// /// PA: path..: path with stack elements ending in '/' /// val...: value to push /// /// DE: Push value onto stack /// function StackPush(path,val) str path str val //- get stack top str top = {StackTopElement {path}} //- create new element str new = {{top} @ "/1"} create neutral {new} //- set value addfield {new} value setfield {new} value {val} //- adjust element count setfield {path}stack \ elements {{getfield {path}stack elements} + 1} end /// /// SH: StackTopElement /// /// PA: path..: path with stack elements ending in '/' /// /// RE: top of stack /// /// DE: Get top of stack /// function StackTopElement(path) str path //- get stack top str top = {LastArgument {el {path}##}} //- return element return {top} end /// /// SH: StackTop /// /// PA: path..: path with stack elements ending in '/' /// /// RE: value of top of stack /// /// DE: Get top value of stack /// function StackTop(path) str path //- get stack top str top = {StackTopElement {path}} //- get value of stacktop str val = {getfield {top} value} //- return value return {val} end end