/* StrayElMem - Tests whether a string is contained as an element in an array-string DESCRIPTION Looks whether a string equals one of the elements in Stray. If yes, itest returns the position of the element, if no, -1. Elements are defined by two seperators as ASCII coded characters: isep1 defaults to 32 (= space), isep2 defaults to 9 (= tab). if just one seperator is used, isep2 equals isep1. Requires Csound 5.15 or higher. SYNTAX ipos StrayElMem Stray, Stest [, isep1 [, isep2]] INITIALIZATION Stray - a string as array Stest - a string to be looked for in Stray isep1 - the first seperator (default=32: space) isep2 - the second seperator (default=9: tab) ipos - if Stest has been found as element in Stray, the position (starting at 0) is returned. if Stest has not been found as a member of Stray, -1 is returned CREDITS joachim heintz april 2010 / january 2012 */ opcode StrayElMem, i, SSjj ;looks whether Stest is an element of Stray. returns the index of the element if found, and -1 if not. Stray, Stest, isepA, isepB xin ;;DEFINE THE SEPERATORS isep1 = (isepA == -1 ? 32 : isepA) isep2 = (isepA == -1 && isepB == -1 ? 9 : (isepB == -1 ? isep1 : isepB)) Sep1 sprintf "%c", isep1 Sep2 sprintf "%c", isep2 ;;INITIALIZE SOME PARAMETERS ilen strlen Stray istartsel = -1; startindex for searched element iout = -1 ;default output iel = -1; actual number of element while searching iwarleer = 1; is this the start of a new element indx = 0 ;character index inewel = 0 ;new element to find ;;LOOP if ilen == 0 igoto end ;don't go into the loop if Stray is empty loop: Schar strsub Stray, indx, indx+1; this character isep1p strcmp Schar, Sep1; returns 0 if Schar is sep1 isep2p strcmp Schar, Sep2; 0 if Schar is sep2 is_sep = (isep1p == 0 || isep2p == 0 ? 1 : 0) ;1 if Schar is a seperator ;END OF STRING AND NO SEPARATORS BEFORE? if indx == ilen && iwarleer == 0 then Sel strsub Stray, istartsel, -1 inewel = 1 ;FIRST CHARACTER OF AN ELEMENT? elseif is_sep == 0 && iwarleer == 1 then istartsel = indx ;if so, set startindex iwarleer = 0 ;reset info about previous separator iel = iel+1 ;increment element count ;FIRST SEPERATOR AFTER AN ELEMENT? elseif iwarleer == 0 && is_sep == 1 then Sel strsub Stray, istartsel, indx ;get elment inewel = 1 ;tell about iwarleer = 1 ;reset info about previous separator endif ;CHECK THE ELEMENT if inewel == 1 then ;for each new element icmp strcmp Sel, Stest ;check whether equals Stest ;terminate and return the position of the element if successful if icmp == 0 then iout = iel igoto end endif endif inewel = 0 loop_le indx, 1, ilen, loop end: xout iout endop