home *** CD-ROM | disk | FTP | other *** search
/ PC Format (South-Africa) 2001 May / PCFMay2001.iso / Xenon / C++ / FreeCommandLineTools.exe / Examples / StdLib / concord.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2000-01-31  |  5.0 KB  |  163 lines

  1. #include "stlexam.h"
  2. #pragma hdrstop
  3. /**************************************************************************
  4.  *
  5.  * concord.cpp - Concordance sample program. Section 9.3.3
  6.  *
  7.  ***************************************************************************
  8.  *
  9.  * (c) Copyright 1994, 1998 Rogue Wave Software, Inc.
  10.  * ALL RIGHTS RESERVED
  11.  *
  12.  * The software and information contained herein are proprietary to, and
  13.  * comprise valuable trade secrets of, Rogue Wave Software, Inc., which
  14.  * intends to preserve as trade secrets such software and information.
  15.  * This software is furnished pursuant to a written license agreement and
  16.  * may be used, copied, transmitted, and stored only in accordance with
  17.  * the terms of such license and with the inclusion of the above copyright
  18.  * notice.  This software and information or any other copies thereof may
  19.  * not be provided or otherwise made available to any other person.
  20.  *
  21.  * Notwithstanding any other lease or license that may pertain to, or
  22.  * accompany the delivery of, this computer software and information, the
  23.  * rights of the Government regarding its use, reproduction and disclosure
  24.  * are as set forth in Section 52.227-19 of the FARS Computer
  25.  * Software-Restricted Rights clause.
  26.  * 
  27.  * Use, duplication, or disclosure by the Government is subject to
  28.  * restrictions as set forth in subparagraph (c)(1)(ii) of the Rights in
  29.  * Technical Data and Computer Software clause at DFARS 252.227-7013.
  30.  * Contractor/Manufacturer is Rogue Wave Software, Inc.,
  31.  * P.O. Box 2328, Corvallis, Oregon 97339.
  32.  *
  33.  * This computer software and information is distributed with "restricted
  34.  * rights."  Use, duplication or disclosure is subject to restrictions as
  35.  * set forth in NASA FAR SUP 18-52.227-79 (April 1985) "Commercial
  36.  * Computer Software-Restricted Rights (April 1985)."  If the Clause at
  37.  * 18-52.227-74 "Rights in Data General" is specified in the contract,
  38.  * then the "Alternate III" clause applies.
  39.  *
  40.  **************************************************************************/
  41.  
  42.  
  43. #include <map>
  44. #include <list>
  45.  
  46. #ifdef _RW_STD_IOSTREAM
  47. #include <iostream>
  48. #else
  49. #include <iostream.h>
  50. #endif
  51.     
  52. #include <string>
  53. #include <ctype.h>
  54.  
  55. #ifndef _RWSTD_NO_NAMESPACE
  56. using namespace std;
  57. #endif
  58.  
  59. //
  60. // Split a line of text into words.
  61. //
  62.  
  63. void split (const string& text, const string& separators, list<string,allocator<string> > & words)
  64. {
  65.     int n     = text.length();
  66.     int start = text.find_first_not_of(separators);
  67.  
  68.     while ((start >= 0) && (start < n))
  69.     {
  70.         int stop = text.find_first_of(separators, start);
  71.         if ((stop < 0) || (stop > n)) stop = n;
  72.         words.push_back (text.substr(start, stop-start));
  73.         start = text.find_first_not_of(separators, stop+1);
  74.     }
  75. }
  76.  
  77. class concordance
  78. {
  79.     typedef multimap<string, int, less<string>,allocator<string>  > wordDictType;
  80.   public:
  81.     void addWord (string, int);
  82.     void readText (istream &);
  83.     void printConcordance (ostream &);
  84.   private:
  85.     wordDictType wordMap;
  86. };
  87.  
  88. void concordance::addWord (string word, int line)
  89. {
  90.     //
  91.     // First get range of entries with same key.
  92.     //
  93.     wordDictType::iterator low = wordMap.lower_bound(word);
  94.     wordDictType::iterator high = wordMap.upper_bound(word);
  95.     //
  96.     // Loop over entires, see if any match current line.
  97.     //
  98.     for ( ; low != high; ++low)
  99.         if ((*low).second == line)
  100.             return;
  101.     //
  102.     // Didn't occur, add now.
  103.     //
  104.     wordMap.insert(wordDictType::value_type(word, line));
  105. }
  106.  
  107. void allLower (string & s)
  108. {
  109.     for (int i = 0; i < s.size(); i++)
  110.         if (isupper(s[i]))
  111.             s[i] = tolower(s[i]);
  112. }
  113.  
  114. void concordance::readText (istream & in)
  115. {
  116.     string line;
  117.     for (int i = 1; getline(in, line, '\n'); i++)
  118.     {
  119.         allLower(line);
  120.         list<string,allocator<string> > words;
  121.         split(line, " ,.;:", words);
  122.         list<string,allocator<string> >::iterator wptr;
  123.         for (wptr = words.begin(); wptr != words.end(); ++wptr)
  124.             addWord(*wptr, i);
  125.     }
  126. }
  127.  
  128. void concordance::printConcordance (ostream & out)
  129. {
  130.     string lastword("");
  131.     wordDictType::iterator pairPtr;
  132.     wordDictType::iterator stop = wordMap.end();
  133.     for (pairPtr = wordMap.begin(); pairPtr != stop; ++pairPtr)
  134.         //
  135.         // If word is same as previous, just print line number.
  136.         //
  137.         if (lastword == (*pairPtr).first)
  138.             out << " " << (*pairPtr).second;
  139.         else
  140.         {
  141.             //
  142.             // First entry of word.
  143.             //
  144.             lastword = (*pairPtr).first;
  145.             cout << endl << lastword << ": " << (*pairPtr).second;
  146.         }
  147.     cout << endl;
  148. }
  149.  
  150. int main ()
  151. {
  152.     cout << "Concordance sample program, from Chapter 7" << endl;
  153.  
  154.     cout << "Enter text, then end-of-file:" << endl;
  155.     concordance words;
  156.     words.readText(cin);    
  157.     words.printConcordance(cout);
  158.  
  159.     cout << "End of concordance sample program" << endl;
  160.  
  161.     return 0;
  162. }
  163.