#ifndef UDO_TEXTTOOLS #define UDO_TEXTTOOLS ## opcode notify, 0, S Stext xin Snew = "\n" iwidth = 60 index = 0 while (index < iwidth) do Snew = strcat(Snew, "*"); index += 1 od prints strcat(strcat(Snew, "\n"), strcat(Stext, "\n\n")) endop #ifndef BUG_VERSION #define BUG_VERSION #-1# notify("No BUG_VERSION specified: must match directive file") exitnow #end opcode gettextindex, i, S Sname xin ifinalindex = -1 index = 0 while (index < lenarray(gSequenced)) do if (strcmp(gSequenced[index], Sname) == 0) then ifinalindex = index igoto complete endif index += 1 od complete: xout ifinalindex endop opcode stripnewline, S, S Sline xin index = strindex(Sline, "\n") if (index != -1) then Sline = strsub(Sline, 0, index) endif xout Sline endop opcode parserowitems, i, Siii Sline, ix1, ix2, imode xin ; mode 0 = count, 1 = write sections, 2 = write chords inum = 0 while (strlen(Sline) > 0) do icomma = strindex(Sline, ",") Stemp = strsub(Sline, 0, icomma) icomma = (icomma == -1) ? 0 : icomma Sline = strsub(Sline, icomma + 1) if (imode == 1) then tabw_i strtod(Stemp), inum, gisectiondata[ix1][ix2] elseif (imode == 2) then tabw_i strtod(Stemp), inum, gichordgroups[ix1][ix2] endif inum += 1 od xout inum endop opcode getparameter, i, iii ipos, idataindex, iparameter xin xout tab_i(ipos, gisectiondata[idataindex][iparameter]) endop /* opcode getparameter, i, iiii isection, instrindex, iparameter, ipos xin isectiondataindex = gisections[isection][instrindex] ifn = gisectiondata[isectiondataindex][iparameter] xout tab_i(ipos, ifn) endop */ opcode getparameterfn, i, iii isection, instrindex, iparameter xin isectiondataindex = gisections[isection][instrindex] xout gisectiondata[isectiondataindex][iparameter] endop opcode getparameterfns, i[], ii isection, instrindex xin isectiondataindex = gisections[isection][instrindex] xout getrow(gisectiondata, isectiondataindex) endop opcode parserow, 0, Siii Sline, ix1, ix2, imode xin ; mode 1 = section patterns , 2 = chords isize = parserowitems(Sline, ix1, ix2, 0) if (imode == 1) then gisectiondata[ix1][ix2] ftgen 0, 0, -isize, -7, 0 elseif (imode == 2) then gichordgroups[ix1][ix2] ftgen 0, 0, -isize, -7, 0 endif isize = parserowitems(Sline, ix1, ix2, imode) endop opcode parsetext, 0, S Sfile xin iparameter = -1 isection = -1 ichordnum = -1 isectiondataindex = -1 imode = -1 read: Sline, ilinenum readfi Sfile Sline = stripnewline(Sline) if (strlen(Sline) > 0) then Sfirstchar = strsub(Sline, 0, 1) if (strcmp(Sfirstchar, ";") == 0) then ; comment ; no action elseif (strcmp(Sfirstchar, "v") == 0) then ; version imode = 0 iversion = strtod(strsub(Sline, 2)) if (iversion != $BUG_VERSION) then notify(sprintf("Incompatible directive file version: got %.2f , expected %.2f", iversion, $BUG_VERSION)) exitnow endif elseif (strcmp(Sfirstchar, "s") == 0) then ; section imode = 1 icomma = strindex(Sline, ",") isectionnum = strtod(strsub(Sline, 2, icomma)) Sub = strsub(Sline, icomma+1) icomma = strindex(Sub, ",") isectionlength = strtod(strsub(Sub, 0, icomma)) ichordgroup = strtod(strsub(Sub, icomma+1)) gisectionchords[isectionnum] = ichordgroup tabw_i isectionlength, isectionnum, gisectionlengths elseif (strcmp(Sfirstchar, "b") == 0) then ; bpm imode = -1 gitempo = strtod(strsub(Sline, 2)) elseif (strcmp(Sfirstchar, "c") == 0) then ; chord group imode = 3 ichordgroup = strtod(strsub(Sline, 2)) ichordnum = 0 elseif (strcmp(Sfirstchar, "i") == 0) then ; pattern imode = 4 iparameter = 0 icomma = strindex(Sline, ",") instrindex = gettextindex(strsub(Sline, 2, icomma)) Sub = strsub(Sline, icomma+1) icomma2 = strindex(Sub, ",") isection = strtod(strsub(Sub, 0, icomma2)) if (icomma2 != -1) then ; repeat or null section irepeatsection = strtod(strsub(Sub, icomma2+1)) if (irepeatsection == -1) then inewsection = -1 else inewsection = gisections[irepeatsection][instrindex] endif gisections[isection][instrindex] = inewsection else isectiondataindex += 1 gisections[isection][instrindex] = isectiondataindex endif elseif (imode == 3) then ; chords parserow(Sline, ichordgroup, ichordnum, 2) ichordnum += 1 elseif (imode == 4) then parserow(Sline, isectiondataindex, iparameter, 1) iparameter += 1 endif endif if (ilinenum != -1) igoto read endop #end