// // Programmer: Craig Stuart Sapp // Creation Date: Fri Jul 27 21:54:14 PDT 2012 // Last Modified: Fri Jul 27 21:54:18 PDT 2012 // Filename: ...sig/examples/all/decom.cpp // Web Address: http://sig.sapp.org/examples/museinfo/score/decom.cpp // Syntax: C++; museinfo // // Description: Extract staves/systems from a SCORE page. // #include "PerlRegularExpression.h" #include "ScorePage.h" #include "Options.h" #include #include #include #include // function declarations void checkOptions (Options& opts, int argc, char* argv[]); void printSystem (int sysidx, ScorePage& page, int loweststaff); void printStaff (int sysidx, int staffidx, ScorePage& page); void example (void); void usage (const char* command); int getLowestStaff (ScorePage& page, Array& list); // block parsing functions: void fillFieldData (Array& field, const char* fieldstring, int maxval); void processFieldEntry (Array& field, const char* string, int maxval); void removeDollarsFromString(Array& buffer, int maxval); void printInfo (ScorePage& page); // interface variables: Options options; int countQ = 0; // used with -c option int keepstaffQ = 0; // used with -k option int debugQ = 0; // used with --debug option int infoQ = 0; // used with -i option int sysstaffQ = 0; // used with --ss option Array list; // used with -s option ////////////////////////////////////////////////////////////////////////// int main(int argc, char** argv) { // process the command-line options checkOptions(options, argc, argv); if (options.getArgCount() == 0) { cout << "Usage: " << argv[0] << " input.mus " << endl; exit(1); } ScorePage page; page.readFile(options.getArg(1)); page.analyzeContent(); page.packBase40Pitch(); int i, j; if (options.getBoolean("system-list")) { fillFieldData(list, options.getString("system-list"), page.getSystemCount()); if (debugQ) { cout << "# SYSTEM LIST: " << list << endl; } } else if (options.getBoolean("system-staff-list")) { fillFieldData(list, options.getString("system-staff-list"), page.getSystemStaffCount(0)); if (debugQ) { cout << "# SYSTEM STAFF LIST: " << list << endl; } } else { list.setSize(0); } if (infoQ) { printInfo(page); return 0; } int loweststaff = getLowestStaff(page, list); if (countQ) { cout << page.getSystemCount() << endl; } else if (sysstaffQ && (list.getSize() > 0)) { for (i=0; i 0) { for (i=0; i& list) { int i; int output = 999; int low; int sysidx; for (i=0; i list; page.getStaffObjectIndexes(sysidx, staffidx, list); int i; for (i=0; i list; page.getSystemObjectIndexes(sysidx, list); int i; int staff; for (i=0; i& field, const char* fieldstring, int maxval) { field.setSize(maxval); field.setGrowth(0); field.setAll(0); Array tempfield; tempfield.setSize(maxval); tempfield.setSize(0); PerlRegularExpression pre; Array buffer; buffer.setSize(strlen(fieldstring)+1); strcpy(buffer.getBase(), fieldstring); pre.sar(buffer, "\\s", "", "gs"); int start = 0; int value = 0; value = pre.search(buffer.getBase(), "^([^,]+,?)"); while (value != 0) { start += value - 1; start += strlen(pre.getSubmatch(1)); processFieldEntry(tempfield, pre.getSubmatch(), maxval); value = pre.search(buffer.getBase() + start, "^([^,]+,?)"); } if (debugQ) { cout << "# tempfield: " << tempfield << endl; } field = tempfield; //int i; //for (i=0; i& field, const char* string, int maxval) { PerlRegularExpression pre; Array buffer; buffer.setSize(strlen(string)+1); strcpy(buffer.getBase(), string); // remove any comma left at end of input string (or anywhere else) pre.sar(buffer, ",", " ", "g"); pre.sar(buffer, "\\s+$", ""); pre.sar(buffer, "^\\s+", ""); if (debugQ) { cout << "MAXBLOCK = " << maxval << endl; cout << "INPUT BLOCK STRING TO DOLLAR: " << buffer << endl; } // first remove $ symbols and replace with the correct values removeDollarsFromString(buffer, maxval); if (debugQ) { cout << "OUTPUT BLOCK STRING FROM DOLLAR: " << buffer << endl; } if (pre.search(buffer.getBase(), "^(\\d+)-(\\d+)$")) { int firstone = strtol(pre.getSubmatch(1), NULL, 10); int lastone = strtol(pre.getSubmatch(2), NULL, 10); if ((firstone < 1) && (firstone != 0)) { cerr << "Error: range token: \"" << string << "\"" << " contains too small a number at start: " << firstone << endl; cerr << "Minimum number allowed is " << 1 << endl; exit(1); } if ((lastone < 1) && (lastone != 0)) { cerr << "Error: range token: \"" << string << "\"" << " contains too small a number at end: " << lastone << endl; cerr << "Minimum number allowed is " << 1 << endl; exit(1); } if (firstone > maxval) { cerr << "Error: range token: \"" << string << "\"" << " contains number too large at start: " << firstone << endl; cerr << "Maximum number allowed is " << maxval << endl; exit(1); } if (lastone > maxval) { cerr << "Error: range token: \"" << string << "\"" << " contains number too large at end: " << lastone << endl; cerr << "Maximum number allowed is " << maxval << endl; exit(1); } int i; if (firstone > lastone) { for (i=firstone; i>=lastone; i--) { field.append(i); } } else { for (i=firstone; i<=lastone; i++) { field.append(i); } } } else if (pre.search(buffer.getBase(), "^(\\d+)")) { int value = strtol(pre.getSubmatch(1), NULL, 10); if ((value < 1) && (value != 0)) { cerr << "Error: range token: \"" << string << "\"" << " contains too small a number at end: " << value << endl; cerr << "Minimum number allowed is " << 1 << endl; exit(1); } if (value > maxval) { cerr << "Error: range token: \"" << string << "\"" << " contains number too large at start: " << value << endl; cerr << "Maximum number allowed is " << maxval << endl; exit(1); } field.append(value); } } ////////////////////////////// // // removeDollarsFromString -- substitute $ sign for maximum track count. // void removeDollarsFromString(Array& buffer, int maxval) { PerlRegularExpression pre; char buf2[128] = {0}; int value2; if (debugQ) { cout << "IN DOLLAR STRING MAXBLOCK = " << maxval << endl; } if (pre.search(buffer.getBase(), "\\$$")) { sprintf(buf2, "%d", maxval); pre.sar(buffer, "\\$$", buf2); } if (debugQ) { cout << "IN DOLLAR STRING = " << buffer << endl; } if (pre.search(buffer.getBase(), "\\$(?![\\d-])")) { // don't know how this case could happen, however... sprintf(buf2, "%d", maxval); pre.sar(buffer, "\\$(?![\\d-])", buf2, "g"); } if (pre.search(buffer.getBase(), "\\$0")) { // replace $0 with maxval (used for reverse orderings) sprintf(buf2, "%d", maxval); pre.sar(buffer, "\\$0", buf2, "g"); } while (pre.search(buffer.getBase(), "\\$(-?\\d+)")) { value2 = maxval - (int)fabs(strtol(pre.getSubmatch(1), NULL, 10)); sprintf(buf2, "%d", value2); pre.sar(buffer, "\\$-?\\d+", buf2); } } // // Spine field list extraction functions // /////////////////////////////////////////////////////////////////////////// // md5sum: 1bbc9a1e1f2e88763d17b4ea979a8861 decom.cpp [20120811]