// classifyChar2B.cpp
//
// Classifies the characters in an
// entered string of 1 to 15 characters,
// using functions defined in textUtility.cpp
// and declared in header file textUtility.h.
// Uses interactive input.
// Outputs to a text file.

#include <fstream>
#include "textUtility.h"    // includes <iostream> and <string>

using namespace std;


/*
 * Outputs, to a text file classification.txt,
 * a table classifying the characters in an
 * entered string.
 *
 * The characters are classified as ASCII
 * letters, ASCII digits, ASCII space,
 * ASCII punctuation marks, ASCII control
 * characters, or non-ASCII characters.
 *
 * Global variables:
 *    cin - an istream object for interactive input.
 *           cin is an external variable, declared
 *           in library header file <iostream>.
 *    cout - an ostream object for output to the terminal.
 *           cout is an external variable, declared
 *           in library header file <iostream>.
 */
int main()
{
   cout << "Enter a string between 1 and 15 characters long:>";

   string text;            // to be entered by the user
   getline( cin, text );   // input entire line, including spaces
   cout << endl;

   // Check whether string length is within range:
   if ( text.length() == 0 || text.length() > 15 )  {
      cout << "You entered a string of length "
                 << text.length()
                 << ", should be between 1 and 15." << endl;
      return 1;
   }  // if

   // Prepare to write to output file classification.txt:
   ofstream outFile;
   char* outputFilename = "classification.txt";   // C-string
   outFile.open(outputFilename);
   if ( !outFile )  {
      cout << "Could not open file "
                 << outputFilename << "." << endl;
      return 1;
   }  // if

   // Print table headings:
   outFile << "Position   Character   Classification" << endl;
   outFile << "--------   ---------   --------------" << endl << endl;

   // Print table body:
   for ( int i = 0; i < text.length(); i++ )  {

      // Display character's position in string text:
      printRightJustified( i, 5, outFile );

      // Display the character itself:
      char x = text[i];   // character at position i in string text
      outFile << "          " << x << "        ";

      // Classify the character:
      if ( ! isAscii(x) )
         outFile << "non-ASCII character" << endl;
      else if ( isSpace(x) )
         outFile << "ASCII space" << endl;
      else if ( isAsciiDigit(x) )
         outFile << "ASCII digit" << endl;
      else if ( isAsciiLetter(x) )
         outFile << "ASCII letter" << endl;
      else if ( isAsciiControl(x) )
         outFile << "ASCII control character" << endl;
      else
         outFile << "ASCII punctuation mark" << endl;
   }  // for i

   cout << "File " << outputFilename
               << " has been created." << endl;

   return 0;
}  // function main