home *** CD-ROM | disk | FTP | other *** search
/ GEMini Atari / GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso / files / gnu / gplibt02 / tobstack.cc < prev    next >
C/C++ Source or Header  |  1993-07-24  |  2KB  |  82 lines

  1. // This may look like C code, but it is really -*- C++ -*-
  2.  
  3. /*
  4.  a little test of Obstacks
  5.  Thu Feb 18 11:16:28 1988  Doug Lea  (dl at rocky.oswego.edu)
  6. */
  7.  
  8. #include <assert.h>
  9.  
  10. #define tassert(ex) {if ((ex)) cerr << #ex << "\n"; \
  11.                        else _assert(#ex, __FILE__,__LINE__); }
  12.  
  13. extern "C" { unsigned long _stksize = 64*1024; };
  14.  
  15. #include <stream.h>
  16. #include <xobstack.h>
  17. #include <stddef.h>
  18. #include <ctype.h>
  19.  
  20. main()
  21. {
  22.   char*   s[10000];
  23.   int     n = 0;
  24.   int     got_one = 0;
  25.   Obstack os;
  26.   char    c;
  27.  
  28.   s[n++] = os.copy("\nunique words:");
  29.   assert(os.OK());
  30.   assert(os.contains(s[0]));
  31.  
  32.   cout << "enter anything at all, end with an EOF(^D)\n";
  33.  
  34.   while (cin.good() && n < 10000)
  35.   {
  36.     if (cin.get(c) && isalnum(c))
  37.     {
  38.       got_one = 1;
  39.       os.grow(c);
  40.     }
  41.     else if (got_one)
  42.     {
  43.       char* current = os.finish(0);
  44.       for (int i = 0; i < n; ++i) // stupid, but this is only a test.
  45.       {
  46.         if (strcmp(s[i], current) == 0)
  47.         {
  48.           os.free(current);
  49.           current = 0;
  50.           break;
  51.         }
  52.       }
  53.       if (current != 0)
  54.         s[n++] = current;
  55.       got_one = 0;
  56.     }
  57.   }
  58.   assert(os.OK());
  59.  
  60.   cout << s[0] << "\n";
  61.  
  62.   for (int i = n - 1; i > 0; -- i)
  63.   {
  64.     assert(os.contains(s[i]));
  65.     cout << s[i] << "\n";
  66.     os.free(s[i]);
  67.   }
  68.  
  69.   assert(os.OK());
  70.   assert(os.contains(s[0]));
  71.  
  72.   cout << "\n\nObstack vars:\n";
  73.   cout << "alignment_mask = " << os.alignment_mask() << "\n";
  74.   cout << "chunk_size = " << os.chunk_size() << "\n";
  75.   cout << "size = " << os.size() << "\n";
  76.   cout << "room = " << os.room() << "\n";
  77.  
  78.   cout << "\nend of test\n";
  79.  
  80. }
  81.  
  82.