/* StrayNumLen - Returns the length of numerical elements in an array-string DESCRIPTION Returns the number of numerical elements in Stray. 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 UDOs StrayGetEl, StrayLen and StrNumP SYNTAX ilen StrayNumLen Stray [, isep1 [, isep2]] INITIALIZATION Stray - a string as array isep1 - the first seperator (default=32: space) isep2 - the second seperator (default=9: tab) CREDITS joachim heintz april 2010 */ opcode StrayGetEl, ii, Sijj ;returns the startindex and the endindex (= the first space after the element) for ielindex in String. if startindex returns -1, the element has not been found Stray, ielindx, 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 iendsel = -1; endindex for searched element iel = 0; actual number of element while searching iwarleer = 1 indx = 0 if ilen == 0 igoto end ;don't go into the loop if Stray is empty loop: Snext strsub Stray, indx, indx+1; next sign isep1p strcmp Snext, Sep1; returns 0 if Snext is sep1 isep2p strcmp Snext, Sep2; 0 if Snext is sep2 ;;NEXT SIGN IS NOT SEP1 NOR SEP2 if isep1p != 0 && isep2p != 0 then if iwarleer == 1 then; first character after a seperator if iel == ielindx then; if searched element index istartsel = indx; set it iwarleer = 0 else ;if not searched element index iel = iel+1; increase it iwarleer = 0; log that it's not a seperator endif endif ;;NEXT SIGN IS SEP1 OR SEP2 else if istartsel > -1 then; if this is first selector after searched element iendsel = indx; set iendsel igoto end ;break else iwarleer = 1 endif endif loop_lt indx, 1, ilen, loop end: xout istartsel, iendsel endop opcode StrayLen, i, Sjj ;returns the number of elements in Stray. 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 Stray, 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 icount = 0; number of elements iwarsep = 1 indx = 0 if ilen == 0 igoto end ;don't go into the loop if String is empty loop: Snext strsub Stray, indx, indx+1; next sign isep1p strcmp Snext, Sep1; returns 0 if Snext is sep1 isep2p strcmp Snext, Sep2; 0 if Snext is sep2 if isep1p == 0 || isep2p == 0 then; if sep1 or sep2 iwarsep = 1; tell the log so else ; if not if iwarsep == 1 then ; and has been sep1 or sep2 before icount = icount + 1; increase counter iwarsep = 0; and tell you are ot sep1 nor sep2 endif endif loop_lt indx, 1, ilen, loop end: xout icount endop opcode StrNumP, i, S ;tests whether String is numerical string (simple, no scientific notation) which can be converted via strtod ito a float (1 = yes, 0 = no) Str xin ip = 1; start at yes and falsify ilen strlen Str if ilen == 0 then ip = 0 igoto end endif ifirst strchar Str, 0 if ifirst == 45 then; a "-" is just allowed as first character Str strsub Str, 1, -1 ilen = ilen-1 endif indx = 0 inpnts = 0; how many points have there been loop: iascii strchar Str, indx; 48-57 if iascii < 48 || iascii > 57 then; if not 0-9 if iascii == 46 && inpnts == 0 then; if not the first point inpnts = 1 else ip = 0 endif endif loop_lt indx, 1, ilen, loop end: xout ip endop opcode StrayNumLen, i, Sjj ;returns the number of numerical elements in Stray. 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 UDOs StrayGetEl, StrayLen and StrNumP Stray, isepA, isepB xin isep1 = (isepA == -1 ? 32 : isepA) isep2 = (isepA == -1 && isepB == -1 ? 9 : (isepB == -1 ? isep1 : isepB)) ilen StrayLen Stray, isep1, isep2 if ilen == 0 igoto end ;don't go into the loop if there is nothing to do icount = 0; number of elements indx = 0 loop: istrt, iend StrayGetEl Stray, indx, isep1, isep2 Snext strsub Stray, istrt, iend; next element inump StrNumP Snext if inump == 1 then icount = icount + 1 endif loop_lt indx, 1, ilen, loop end: xout icount endop