home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 8 / FreshFishVol8-CD2.bin / bbs / gnu / libg++-2.6.2-src.lha / libg++-2.6.2 / libio / tests / tiomisc.cc < prev    next >
Encoding:
C/C++ Source or Header  |  1994-11-06  |  3.1 KB  |  176 lines

  1. /* Random regression tests etc. */
  2.  
  3. #include <fstream.h>
  4. #include <stdio.h>
  5. #include <strstream.h>
  6. #include <string.h>
  7. #include <fcntl.h>
  8. #include <stdlib.h>
  9.  
  10. #define BUF_SIZE 4096
  11.  
  12. void
  13. test1 ()
  14. {
  15.    fstream f;
  16.    char    buf[BUF_SIZE];
  17.  
  18.    f.setbuf( buf, BUF_SIZE );
  19. }
  20.  
  21. void
  22. test2 ( )
  23. {
  24.    char string[BUF_SIZE];
  25.    ostrstream s( string, BUF_SIZE );
  26.  
  27.    s << "Bla bla bla " << 55 << ' ' << 3.23 << '\0' << endl;
  28.    cout << "Test2: " << string << endl;
  29. }
  30.  
  31.  
  32. /* Test case from Joe Buck <jbuck@Synopsys.COM>. */
  33.  
  34. class special_ofstream : public ofstream {
  35. public:
  36.     special_ofstream() : ofstream() {}
  37.     special_ofstream(int fd) : ofstream(fd) {}
  38.     special_ofstream(const char *name, int mode=ios::out, int prot=0664) {
  39.         open(name,mode,prot);
  40.     }
  41.     void open(const char *name, int mode=ios::out, int prot=0664);
  42. };
  43.  
  44. void special_ofstream::open(const char* name, int mode, int prot) {
  45.     if (strcmp(name, "<cout>") == 0) {
  46.         rdbuf()->attach(1);
  47.     }
  48.     else if (strcmp(name, "<cerr>") == 0) {
  49.         rdbuf()->attach(2);
  50.         setf(unitbuf);
  51.     }
  52.     else ofstream::open(name,mode,prot);
  53. }
  54.  
  55. void
  56. test3 ()
  57. {
  58.     {
  59.         special_ofstream o("<cout>");
  60.         o << "Hello\n";
  61.         // o is destructed now.  This should not close cout
  62.     }
  63.     {
  64.         special_ofstream o("<cout>");
  65.         o << "Line 2\n";
  66.     }
  67. }
  68.  
  69. void
  70. getline_test1 ()
  71. {
  72.   char buf[1000];
  73.   char data[] = "#include <iostream.h>\n#include <fstream.h>\n";
  74.   istrstream infile(data, strlen(data));
  75.   infile.getline(buf,1000);
  76.   infile.getline(buf,1000);
  77.  
  78.   cout << buf << '\n';
  79. }
  80.  
  81. getline_test2 ()
  82. {
  83.   char data[] = "Line one.\nline 2.\n";
  84.   char line[100];
  85.   istrstream strin(data, strlen(data));
  86.   strin.getline(line, 10);
  87.   cout << "line: " << line << ", count: " << strin.gcount () << "\n";
  88. }
  89.  
  90. class A : private ostream
  91. {
  92. public:
  93.   A(streambuf* s);
  94.   ostream::flush;
  95. };
  96. A::A(streambuf* s)
  97. : ostream(s)
  98. {
  99. }
  100.  
  101. flush1_test()
  102. {
  103.   A os(cout.rdbuf());
  104.   os.flush();
  105. }
  106.  
  107. void
  108. reread_test ()
  109. {  // This is PR 5486.
  110.    int tag_char;
  111.    char *fname = "Makefile";
  112.    int mode = O_RDONLY;
  113.    filebuf file_p; 
  114.  
  115.    int fd = ::open(fname, mode, 0666);
  116.    file_p.attach(fd); 
  117.  
  118.    istream d_istream(&file_p);
  119.  
  120.    // Read a character from the stream, save it and put it back.
  121.    tag_char = d_istream.get();
  122.    int save_char = tag_char;
  123.    d_istream.putback((char) tag_char);
  124.  
  125.    // Uncomment then next statement and the next get will be EOF.
  126.    streampos pos = d_istream.tellg();  
  127.  
  128.    // Re-read the first character
  129.    tag_char = d_istream.get();
  130.  
  131.    cout << "reread_test: " << (char)save_char << " " << (char)tag_char << "\n";
  132.    cout.flush();
  133.  
  134. }
  135.  
  136. void *danger_pointer;
  137. void operator delete (void *p)
  138. {
  139.   if (p)
  140.     {
  141.       if (p == danger_pointer)
  142.     fprintf (stderr, "deleted\n");
  143.  
  144.       free (p);
  145.     }
  146. }
  147.  
  148. struct my_ostream: virtual public ios, public ostream
  149. {
  150.   my_ostream (ostream &s): ios (s.rdbuf()) { }
  151. };
  152.  
  153. test_destroy ()
  154. {
  155.   ofstream fstr ("foo.dat");
  156.   my_ostream wa (fstr);
  157.  
  158.   /* Check that sure wa.rdbuf() is only freed once. */
  159.   danger_pointer = wa.rdbuf ();
  160.  
  161.   wa << "Hi there" << endl;
  162. }
  163.  
  164. int main( )
  165. {
  166.   test1 ();
  167.   test2 ();
  168.   test3 ();
  169.   getline_test1 ();
  170.   getline_test2 ();
  171.   flush1_test ();
  172.   reread_test ();
  173.   test_destroy ();
  174.   return 0;
  175. }
  176.