/************************************************************************** * * concord.cpp - Concordance sample program. Section 9.3.3 * * $Id: concord.cpp,v 1.14 1996/08/28 01:19:02 smithey Exp $ * *************************************************************************** * * Copyright 2003 Compaq Information Technologies Group, L.P. * * Compaq and the Compaq logo are trademarks of Compaq Information * Technologies Group, L.P. in the U.S. and/or other countries. * * Confidential computer software. Valid license from Compaq required for * possession, use or copying. Consistent with FAR 12.211 and 12.212, * Commercial Computer Software, Computer Software Documentation, and * Technical Data for Commercial Items are licensed to the U.S. Government * under vendor's standard commercial license. * *************************************************************************** * * (c) Copyright 1994-1996 Rogue Wave Software, Inc. * ALL RIGHTS RESERVED * * The software and information contained herein are proprietary to, and * comprise valuable trade secrets of, Rogue Wave Software, Inc., which * intends to preserve as trade secrets such software and information. * This software is furnished pursuant to a written license agreement and * may be used, copied, transmitted, and stored only in accordance with * the terms of such license and with the inclusion of the above copyright * notice. This software and information or any other copies thereof may * not be provided or otherwise made available to any other person. * * Notwithstanding any other lease or license that may pertain to, or * accompany the delivery of, this computer software and information, the * rights of the Government regarding its use, reproduction and disclosure * are as set forth in Section 52.227-19 of the FARS Computer * Software-Restricted Rights clause. * * Use, duplication, or disclosure by the Government is subject to * restrictions as set forth in subparagraph (c)(1)(ii) of the Rights in * Technical Data and Computer Software clause at DFARS 252.227-7013. * Contractor/Manufacturer is Rogue Wave Software, Inc., * P.O. Box 2328, Corvallis, Oregon 97339. * * This computer software and information is distributed with "restricted * rights." Use, duplication or disclosure is subject to restrictions as * set forth in NASA FAR SUP 18-52.227-79 (April 1985) "Commercial * Computer Software-Restricted Rights (April 1985)." If the Clause at * 18-52.227-74 "Rights in Data General" is specified in the contract, * then the "Alternate III" clause applies. * **************************************************************************/ #ifndef _RWSTD_HEADER_REQUIRES_HPP #include #include #else #include #include #endif #ifdef __USE_STD_IOSTREAM #include #else #include #endif #ifndef _RWSTD_HEADER_REQUIRES_HPP #include #else #include #endif #include #ifndef _RWSTD_NO_NAMESPACE using namespace std; #endif // // Split a line of text into words. // void split (const string& text, const string& separators, list > & words) { string::size_type n = text.length(); string::size_type start = text.find_first_not_of(separators); while ((start < n)) { string::size_type stop = text.find_first_of(separators, start); if (stop > n) stop = n; words.push_back (text.substr(start, stop-start)); start = text.find_first_not_of(separators, stop+1); } } class concordance { // typedef multimap, allocator > wordDictType; // does not work with the rw v3.0 library. What works is either the default // allocator class: // // typedef multimap > wordDictType; // // or allocator > which is consistent with // 23.3 - Associative containers [lib.associative] for multimap: // // template , // class Allocator = allocator > > // class multimap; // typedef multimap, allocator > > wordDictType; public: void addWord (string, int); void readText (istream &); void printConcordance (ostream &); private: wordDictType wordMap; }; void concordance::addWord (string word, int line) { // // First get range of entries with same key. // wordDictType::iterator low = wordMap.lower_bound(word); wordDictType::iterator high = wordMap.upper_bound(word); // // Loop over entires, see if any match current line. // for ( ; low != high; ++low) if ((*low).second == line) return; // // Didn't occur, add now. // wordMap.insert(wordDictType::value_type(word, line)); } void allLower (string & s) { for (string::size_type i = 0; i < s.size(); i++) if (isupper(s[i])) s[i] = (char) tolower(s[i]); } void concordance::readText (istream & in) { string line; for (int i = 1; getline(in, line, '\n'); i++) { allLower(line); list > words; split(line, " ,.;:", words); list >::iterator wptr; for (wptr = words.begin(); wptr != words.end(); ++wptr) addWord(*wptr, i); } } void concordance::printConcordance (ostream & out) { string lastword(""); wordDictType::iterator pairPtr; wordDictType::iterator stop = wordMap.end(); for (pairPtr = wordMap.begin(); pairPtr != stop; ++pairPtr) // // If word is same as previous, just print line number. // if (lastword == (*pairPtr).first) out << " " << (*pairPtr).second; else { // // First entry of word. // lastword = (*pairPtr).first; cout << endl << lastword << ": " << (*pairPtr).second; } cout << endl; } int main () { cout << "Concordance sample program, from Chapter 7" << endl; cout << "Enter text, then end-of-file:" << endl; concordance words; words.readText(cin); words.printConcordance(cout); cout << "End of concordance sample program" << endl; return 0; }