From c4b96cdd87738e9f0cba695904d2d484b4335e7f Mon Sep 17 00:00:00 2001 From: Richard Knight Date: Fri, 29 Oct 2021 22:32:21 +0100 Subject: initial --- BUG3/text_tools.udo | 185 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 185 insertions(+) create mode 100644 BUG3/text_tools.udo (limited to 'BUG3/text_tools.udo') diff --git a/BUG3/text_tools.udo b/BUG3/text_tools.udo new file mode 100644 index 0000000..63cc2a8 --- /dev/null +++ b/BUG3/text_tools.udo @@ -0,0 +1,185 @@ +#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 + -- cgit v1.2.3