/* StrayNumMem - Tests whether a number is a member of an array-string DESCRIPTION Looks whether the number inum is a member of Stray. If yes, itest returns the position of inum in Stray, 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 the UDO StrNumP SYNTAX itest StrayNumMem Stray, inum [, isep1 [, isep2]] INITIALIZATION Stray - a string as array inum - the number which is being looked for isep1 - the first seperator (default=32: space) isep2 - the second seperator (default=9: tab) CREDITS joachim heintz april 2010 / january 2012 */ opcode StrayNumMem, i, Sijj ;looks whether inum is an element of Stray. returns the index of the element if found, and -1 if not. Stray, inum, 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 element inewel = 1 ;tell about iwarleer = 1 ;reset info about previous separator endif ;CHECK THE ELEMENT if inewel == 1 then ;for each new element inump StrNumP Sel ;check whether element is number if inump == 1 then inumber strtod Sel ;if so, convert if inumber == inum then ;check if equals inum iout = iel igoto end ;if so, terminate endif endif endif inewel = 0 loop_le indx, 1, ilen, loop end: xout iout endop