/***************************************************************************
 *
 * strstream.cpp - strstream example.
 *
 * $Id$
 *
 ***************************************************************************
 *
 * Licensed to the Apache Software  Foundation (ASF) under one or more
 * contributor  license agreements.  See  the NOTICE  file distributed
 * with  this  work  for  additional information  regarding  copyright
 * ownership.   The ASF  licenses this  file to  you under  the Apache
 * License, Version  2.0 (the  "License"); you may  not use  this file
 * except in  compliance with the License.   You may obtain  a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the  License is distributed on an  "AS IS" BASIS,
 * WITHOUT  WARRANTIES OR CONDITIONS  OF ANY  KIND, either  express or
 * implied.   See  the License  for  the  specific language  governing
 * permissions and limitations under the License.
 *
 * Copyright 1994-2006 Rogue Wave Software.
 * 
 **************************************************************************/

#include <iostream>    // for cout, ends
#include <strstream>   // for sstream

#include <examples.h>


int main ()
{
    // create a bi-directional strstream object 
    std::strstream inout;

    // write three complete lines of text to the stream
    inout << "  Dieses ist die Geschichte eines Mannes.\n"
          << "  C'est l'histoire d'un homme.\n"
          << "  This is the story of a man.\n"
          << std::ends;

    char line [80];

    // output the entire contents of the stream object to stdout
    std::cout << "Full text, " << inout.pcount ()
              << " characters:\n" << inout.str ();

    // keep track of the number of characters extracted by getline
    int gcount = 0;

    // extract lines from the stream, one at a time
    for (int i = 1; inout.getline (line, sizeof line); ++i) {

        // increment the number of extracted characters
        gcount += inout.gcount ();

        // write out the line number and its length
        std::cout << "\nLine " << i << ", " << inout.gcount ();

        if ('\0' == *line) {
            // incomplete line (missing newline character)
            std::cout << " character (no newline):\n"
                      << "  '\\0'\n";
        }
        else {
            // output the line to stdout
            std::cout << " characters:\n" << line;
        }
    }

    // write out the total number of extracted characters
    std::cout << "\nExtracted " << gcount << " characters.\n";
 
    return 0;
}
