/* StrayNumToFt - Converts a string-array which just consists of numbers or simple math expressions to a function table DESCRIPTION Puts all numbers in Stray (which must not contain non-numerical elements) in a function table and returns its variable ift (which is produced by iftno, default=0) and the length of the elements written iftlen. (An empty string as input writes a function table of size=1 to avoid an error but returns 0 as length of elements written.) Simple binary math expressions using +, -, *, /, ^ and % are allowed, with just one parenthesis in total (see the examples below). 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, and the UDOs StrayLen, StrExpr1 and StrExpr2 SYNTAX ift, iftlen StrayNumToFt Stray [, iftno [, isep1 [, isep2]]] INITIALIZATION Stray - a string as array iftno - like in an ftgen statement: if 0 (which is also the default) an automatic number is generated by Csound; if any positive number, this is then the number of the function table isep1 - the first seperator (default=32: space) isep2 - the second seperator (default=9: tab) ift - the number of the function table which has been created iftlen - the length of the elements written to the function table (usually this equals the length of the function table; just an empty string as input will create a function table of size=1 but with iftlen=0) CREDITS joachim heintz april 2010 / sept 2011 / feb 2012 / dec 2012 */ opcode StrayNumToFt, ii, Sojj ;requires the UDOs StrayLen, StrExpr1 and StrExpr2 Stray, iftno, 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 ;;CREATE A FUNCTION TABLE iftlen StrayLen Stray, isep1, isep2 if iftlen == 0 then prints "WARNING! StrayNumToFt got empty string as input. Function table with length=1 created, but iftlen=0 returned.\n" iftl = 1 else iftl = iftlen endif ift ftgen iftno, 0, -iftl, -2, 0 ;;INITIALIZE SOME PARAMETERS ilen strlen Stray istartsel = -1; startindex for searched element iel = -1; number of element in Stray and ift 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 ;WRITE THE ELEMENT TO THE TABLE if inewel == 1 then inum StrExpr2 Sel ;convert expression to number tabw_i inum, iel, ift ;write to ift endif inewel = 0 loop_le indx, 1, ilen, loop end: xout ift, iftlen endop