//MonthAbbrev.cpp

/*-----------------------------------------------------------------------
          Implementation file for enumeration type MonthAbbrev.
  -----------------------------------------------------------------------*/

#include <string>
#include <cctype>
using namespace std;

#include "MonthAbbrev.h"

//--- Definition of operator<<()
ostream & operator<<(ostream & out, MonthAbbrev monthVal)
{
   switch (monthVal)
   {
      case JAN:  out << "Jan"; break;
      case FEB:  out << "Feb"; break;
      case MAR:  out << "Mar"; break;
      case APR:  out << "Apr"; break;
      case MAY:  out << "May"; break;
      case JUN:  out << "Jun"; break;
      case JUL:  out << "Jul"; break;
      case AUG:  out << "Aug"; break;
      case SEP:  out << "Sep"; break;
      case OCT:  out << "Oct"; break;
      case NOV:  out << "Nov"; break;
      case DEC:  out << "Dec"; break;

      case MONTH_OVERFLOW :  out << "Month_Overflow"; break;
      default:          out << "ERROR"; break;
   }

   return out ;
}

//--- Definition of operator>>()

istream & operator>>(istream & in, MonthAbbrev & monthVal)
{
   string abbr;
   in >> abbr;                             // read a string

   if (abbr.length() > 3)                  // need at least 3 chars
      abbr = abbr.substr(0,3);             // get first 3 chars

   for (int i = 0; i < abbr.length(); i++) // change to uppercase
      if (islower(abbr[i]))
         abbr[i] = toupper(abbr[i]);

   if (abbr == "JAN")                      // compare to constants
      monthVal = JAN;
   else if (abbr == "FEB")
      monthVal = FEB;
   else if (abbr == "MAR")
      monthVal = MAR;
   else if (abbr == "APR")
      monthVal = APR;
   else if (abbr == "MAY")
      monthVal = MAY;
   else if (abbr == "JUN")
      monthVal = JUN;
   else if (abbr == "JUL")
      monthVal = JUL;
   else if (abbr == "AUG")
      monthVal = AUG;
   else if (abbr == "SEP")
      monthVal = SEP;
   else if (abbr == "OCT")
      monthVal = OCT;
   else if (abbr == "NOV")
      monthVal = NOV;
   else if (abbr == "DEC")
      monthVal = DEC;
   else
   {
      cerr << "** Invalid month abbreviation -- using MONTH_OVERFLOW ** \n";
      monthVal = MONTH_OVERFLOW;
   }

   return in;
}

//--- Definition of next()

MonthAbbrev next(MonthAbbrev monthVal)
{
   switch (monthVal)
   {
      case JAN: return FEB;
      case FEB: return MAR;
      case MAR: return APR;
      case APR: return MAY;
      case MAY: return JUN;
      case JUN: return JUL;
      case JUL: return AUG;
      case AUG: return SEP;
      case SEP: return OCT;
      case OCT: return NOV;
      case NOV: return DEC;
      default:  return MONTH_OVERFLOW;
   }
}
