// // Programmer: Craig Stuart Sapp // Creation Date: Mon Oct 14 23:58:44 2002 // Last Modified: Mon Apr 25 11:30:20 PDT 2005 // Last Modified: Thu Dec 13 21:03:33 PST 2012 Added -s option // Last Modified: Fri Mar 11 20:44:58 PST 2016 Switch to STL // Filename: ...sig/examples/all/humcat.cpp // Web Address: http://sig.sapp.org/examples/museinfo/humdrum/humcat.cpp // Syntax: C++; museinfo // // Description: Concatenate multiple humdrum files into one continuous // data stream. // #include "humdrum.h" #include #include #include #include using namespace std; // function declarations: void checkOptions (Options& opts, int argc, char** argv); void example (void); void usage (const char* command); void printFile (HumdrumFile& infile, int start, int stop); int getIdTags (vector& idtags, HumdrumFile& infile); void printFileID (HumdrumFile& infile, int index, int count, vector& primaryids); int findTag (vector& primaryids, string& idtags); void printLineID (HumdrumFile& infile, int index, vector& primaryids, vector& idtags); int hasSegment (HumdrumFile& infile); void printFile (HumdrumFile& infile); // User interface variables: Options options; int segmentQ = 0; // used with -s option ////////////////////////////////////////////////////////////////////////// int main(int argc, char** argv) { // process the command-line options checkOptions(options, argc, argv); HumdrumStream streamer(options); vector idtags; int idtagQ = 0; HumdrumFile infiles[2]; int good1 = streamer.read(infiles[0]); int good2 = streamer.read(infiles[1]); if (good1 == 0) { // nothing to do exit(1); } // if printing segments, then don't do extra work to suppress **/*-: int hassegment; if (segmentQ && good1) { printFile(infiles[0]); } if (segmentQ && good2) { printFile(infiles[1]); } if (!segmentQ) { // if there is only one file, then just print it out and do nothing: if (good2 == 0) { if (segmentQ) { infiles[0].printSegmentLabel(cout); } cout << infiles[0]; exit(0); } // extract tags from first input idtagQ = getIdTags(idtags, infiles[0]); // print the first file printFile(infiles[0], 1, 0); } int currindex = 0; int count = 1; while (streamer.read(infiles[currindex])) { count++; if (segmentQ) { infiles[currindex].printNonemptySegmentLabel(cout); } hassegment = hasSegment(infiles[currindex]); if (segmentQ) { for (int i=0; i 0) && !segmentQ) { // print the last file, including data terminators if (idtagQ) { printFileID(infiles[!currindex], 0, 1, idtags); } else { printFile(infiles[!currindex], 0, 1); } } return 0; } ////////////////////////////////////////////////////////////////////////// ////////////////////////////// // // printFile -- // void printFile(HumdrumFile& infile) { infile.printNonemptySegmentLabel(cout); int hassegment = hasSegment(infile); for (int i=0; i& idtags, HumdrumFile& infile) { int i, j; idtags.resize(infile.getMaxTracks()); for (i=0; i<(int)idtags.size(); i++) { idtags[i] = ""; } int foundids = 0; char tag[128] = {0}; for (i=0; i& primaryids) { vector idtags; int idtagQ = getIdTags(idtags, infile); if (!idtagQ) { cout << "ERROR: no ID tags found in file: " << endl; cout << infile; exit(1); } int i; for (i=0; i& primaryids, vector& idtags) { vector > spines; spines.resize(primaryids.size()); int i; for (i=0; i<(int)spines.size(); i++) { spines[i].reserve(32); } int mapping; for (i=0; i<(int)idtags.size(); i++) { mapping = findTag(primaryids, idtags[i]); spines[mapping].push_back(i); } int j; for (i=0; i<(int)spines.size(); i++) { if (spines[i].size() == 0) { cout << "X"; } else { for (j=0; j<(int)spines[i].size(); j++) { cout << "Y"; } } cout << "\t"; } } ////////////////////////////// // // findTag -- // int findTag(vector& primaryids, string& idtags) { for (int i=0; i<(int)primaryids.size(); i++) { if (primaryids[i] == idtags) { return i; } } return -1; } ////////////////////////////// // // checkOptions -- // void checkOptions(Options& opts, int argc, char* argv[]) { opts.define("h|header=s:", "Header filename for placement in output"); opts.define("t|trailer=s:", "Trailer filename for placement in output"); opts.define("s|segment=b", "Do not merge files, but leave as segments"); 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, Oct 2002" << endl; exit(0); } else if (opts.getBoolean("version")) { cout << argv[0] << ", version: 14 Oct 2002" << endl; cout << "compiled: " << __DATE__ << endl; cout << MUSEINFO_VERSION << endl; exit(0); } else if (opts.getBoolean("help")) { usage(opts.getCommand().c_str()); exit(0); } else if (opts.getBoolean("example")) { example(); exit(0); } segmentQ = opts.getBoolean("segment"); } ////////////////////////////// // // example -- // void example(void) { } ////////////////////////////// // // usage -- // void usage(const char* command) { } // md5sum: 6c5a8b4d731b305af7f3e9d28023b384 humcat.cpp [20170605]