// // Programmer: Craig Stuart Sapp <craig@ccrma.stanford.edu> // Creation Date: Mon Nov 23 05:24:14 PST 2009 // Last Modified: Mon Nov 23 05:24:18 PST 2009 // Last Modified: Thu Dec 22 11:50:31 PST 2011 Added -V and -k options // Last Modified: Mon Apr 1 00:28:01 PDT 2013 Enabled multiple segment input // Filename: ...sig/examples/all/ridx.cpp // Web Address: http://sig.sapp.org/examples/museinfo/humdrum/ridx.cpp // Syntax: C++; museinfo // // Description: Remove various components of Humdrum file data structures. // #include "humdrum.h" #include "PerlRegularExpression.h" #include <string.h> #include <stdio.h> #ifndef OLDCPP #include <iostream> #include <fstream> #else #include <iostream.h> #include <fstream.h> #endif // function declarations: void checkOptions(Options& opts, int argc, char** argv); void example(void); void usage(const char* command); void processFile(HumdrumFile& infile); // User interface variables: Options options; int option_D = 0; // used with -D option int option_d = 0; // used with -d option int option_G = 0; // used with -G option int option_g = 0; // used with -g option int option_I = 0; // used with -I option int option_i = 0; // used with -i option int option_L = 0; // used with -L option int option_l = 0; // used with -l option int option_T = 0; // used with -T option int option_U = 0; // used with -U and -u option int option_M = 0; // used with -M option int option_C = 0; // used with -C option int option_c = 0; // used with -c option int option_k = 0; // used with -k option int option_V = 0; // used with -V option ////////////////////////////////////////////////////////////////////////// int main(int argc, char** argv) { // process the command-line options checkOptions(options, argc, argv); HumdrumFileSet infiles; // infile.setAllocation(1123123); // allow for very large inputs up to // // million lines. int numinputs = options.getArgumentCount(); int i; if (numinputs < 1) { infiles.read(cin); } else { for (i=0; i<numinputs; i++) { infiles.readAppend(options.getArg(i+1)); } } for (i=0; i<infiles.getCount(); i++) { processFile(infiles[i]); } return 0; } ////////////////////////////////////////////////////////////////////////// ////////////////////////////// // // processFile -- // void processFile(HumdrumFile& infile) { int i; PerlRegularExpression pre; int revQ = option_V; // if bibliographic/reference records are not suppressed // print the !!!!SEGMENT: marker if present. if (!option_G) { infile.printNonemptySegmentLabel(cout); } for (i=0; i<infile.getNumLines(); i++) { if (option_D && (infile[i].isMeasure() || infile[i].isData())) { // remove data lines if -D is specified if (revQ) { cout << infile[i] << "\n"; } continue; } if (option_d) { // remove null data lines if -d is specified if (option_k && infile[i].isData() && infile[i].equalFieldsQ("**kern", ".")) { // remove if only all **kern spines are null. if (revQ) { cout << infile[i] << "\n"; } continue; } else if (!option_k && infile[i].isData() && infile[i].equalDataQ(".")) { // remove null data lines if all spines are null. if (revQ) { cout << infile[i] << "\n"; } continue; } } if (option_G && (infile[i].isGlobalComment() || infile[i].isBibliographic())) { // remove global comments if -G is specified if (revQ) { cout << infile[i] << "\n"; } continue; } if (option_g && pre.search(infile[i][0], "^!!+\\s*$", "")) { // remove empty global comments if -g is specified if (revQ) { cout << infile[i] << "\n"; } continue; } if (option_I && infile[i].isInterpretation()) { // remove all interpretation records if (revQ) { cout << infile[i] << "\n"; } continue; } if (option_i && infile[i].isInterpretation() && infile[i].equalDataQ("*")) { // remove null interpretation records if (revQ) { cout << infile[i] << "\n"; } continue; } if (option_L && infile[i].isLocalComment()) { // remove all local comments if (revQ) { cout << infile[i] << "\n"; } continue; } if (option_l && infile[i].isLocalComment() && infile[i].equalDataQ("!")) { // remove null local comments if (revQ) { cout << infile[i] << "\n"; } continue; } if (option_T && infile[i].isTandem()) { // remove tandem (non-manipulator) interpretations if (revQ) { cout << infile[i] << "\n"; } continue; } if (option_U) { // remove unnecessary (duplicate exclusive) interpretations // HumdrumFile class does not allow duplicate ex. interps. // continue; } // non-classical options: if (option_M && infile[i].isMeasure()) { // remove all measure lines if (revQ) { cout << infile[i] << "\n"; } continue; } if (option_C && infile[i].isComment()) { // remove all comments (local & global) if (revQ) { cout << infile[i] << "\n"; } continue; } if (option_c && (infile[i].isLocalComment() || infile[i].isGlobalComment())) { // remove all comments (local & global) if (revQ) { cout << infile[i] << "\n"; } continue; } // got past all test, so print the current line: if (!revQ) { cout << infile[i] << "\n"; } } } ////////////////////////////// // // checkOptions -- // void checkOptions(Options& opts, int argc, char* argv[]) { // Humdrum Toolkit classic rid options: opts.define("D=b", "remove all data records"); opts.define("d=b", "remove null data records"); opts.define("G=b", "remove all global comments"); opts.define("g=b", "remove null global comments"); opts.define("I=b", "remove all interpretation records"); opts.define("i=b", "remove null interpretation records"); opts.define("L=b", "remove all local comments"); opts.define("l|1=b", "remove null local comments"); opts.define("T=b", "remove all tandem interpretations"); opts.define("U|u=b", "remove unnecessary (duplicate ex. interps."); opts.define("k=b", "for -d, only consider **kern spines."); opts.define("V=b", "negate filtering effect of program."); opts.define("H|no-humdrum=b", "equivalent to -GLIMd."); // additional options opts.define("M=b", "remove measure lines"); opts.define("C=b", "remove all comment lines"); opts.define("c=b", "remove global and local comment lines"); opts.define("author=b", "author of program"); opts.define("version=b", "compilation info"); opts.define("example=b", "example usages"); opts.define("help=b", "short description"); opts.process(argc, argv); // handle basic options: if (opts.getBoolean("author")) { cout << "Written by Craig Stuart Sapp, " << "craig@ccrma.stanford.edu, Nov 2009" << endl; exit(0); } else if (opts.getBoolean("version")) { cout << argv[0] << ", version: 23 Nov 2009" << endl; cout << "compiled: " << __DATE__ << endl; cout << MUSEINFO_VERSION << endl; exit(0); } else if (opts.getBoolean("help")) { usage(opts.getCommand()); exit(0); } else if (opts.getBoolean("example")) { example(); exit(0); } option_D = opts.getBoolean("D"); option_d = opts.getBoolean("d"); option_G = opts.getBoolean("G"); option_g = opts.getBoolean("g"); option_I = opts.getBoolean("I"); option_i = opts.getBoolean("i"); option_L = opts.getBoolean("L"); option_l = opts.getBoolean("l"); option_T = opts.getBoolean("T"); option_U = opts.getBoolean("U"); option_M = opts.getBoolean("M"); option_C = opts.getBoolean("C"); option_c = opts.getBoolean("c"); option_k = opts.getBoolean("k"); option_V = opts.getBoolean("V"); if (opts.getBoolean("no-humdrum")) { // remove all Humdrum file structure option_G = option_L = option_I = option_M = option_d = 1; } } ////////////////////////////// // // example -- // void example(void) { } ////////////////////////////// // // usage -- // void usage(const char* command) { } // md5sum: 27425e228c8c9068df0f665f264db564 ridx.cpp [20130404]