//
// palindrome.C
//
// Searches date/time strings of the form yyyymmddhhmm for palindromes.
//
// Benjamin Hersey
// 02/20/2002
//

#include <stdio.h>
#include <stdlib.h>
#include <iostream.h>
#include <string>

#define VERBOSE 0


int main( int argc, char* argv[] )
{

  int days[] = { 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
  string monthname[] = { "none", "January", "February", "March", "", "", 
			 "", "", "", "", "October", "November", "December" };

  char temp[32];
  string ymdhm = "------------", front = "------", endrev = "------";

  int yearlow, yearhigh;
  
  if( argc != 3 )
    {
      cout << endl << "Usage: palindrome <low> <high>" << endl;
      cout << "       where <low> and <high> are year limits." << endl << endl;

      return 0;
    }

  yearlow = atoi( argv[1] );
  yearhigh = atoi( argv[2] );

  if( yearlow < 1 )
    {
      yearlow = 1;
      cout << "(Low year limit adjusted up to 1.)" << endl;
    }

  if( yearhigh > 9999 )
    {
      yearhigh = 9999;
      cout << "(High year limit adjusted down to 9999.)" << endl;
    }
  
  cout << "Searching from " << yearlow << " to " << yearhigh;
  cout << ", inclusive." << endl;
  
  
  for( int year = yearlow; year <= yearhigh; year++ )
    {
      sprintf( temp, "%04d", year );
      for( int i = 0; i < 4; i++ )
        { ymdhm[i] = temp[i]; }
      
      if( year - ((year/10)*10) < 3 && year - ((year/1000)*1000)<600 )
	{      
	  for( int month = 1; month <= 12; month++ )
	    {
	      sprintf( temp, "%02d", month );
	      for( int i = 0; i < 2; i++ )
		{ ymdhm[ i + 4 ] = temp[i]; }
	      
	      if( month - ( ( month / 10 ) * 10 ) < 4 )
		{  
		  for( int day = 1; day <= days[month]; day++ )
		    {
		      sprintf( temp, "%02d", day );
		      for( int i = 0; i < 2; i++ )
			{ ymdhm[ i + 6 ] = temp[i]; }
		      
		      for( int hour = 0; hour < 24; hour++ )
			{
			  sprintf( temp, "%02d", hour );
			  for( int i = 0; i < 2; i++ )
			    { ymdhm[ i + 8 ] = temp[i]; }
			  
			  for( int min = 0; min < 60; min++ )
			    {
			      sprintf( temp, "%02d", min );
			      for( int i = 0; i < 2; i++ )
				{ ymdhm[ i + 10 ] = temp[i]; }
			      
			      for( int i = 0; i < 6; i++ )
				{
				  front[i] = ymdhm[i];
				  endrev[ 5 - i ] = ymdhm[ 6 + i ];
				}
			      
			      if( front == endrev ) 
				{
				  cout << "  " << ymdhm << "    ";
				  cout << hour << ":" << temp << " ";
				  cout << monthname[month] << " " << day;
				  cout << ", A.D. " << year << endl;
				}  // end if( front == endrev )
			    }  // end for( min )
			}  // end for( hour )
		    }  // end for( day )
		}  // end if( month in range )
	    }  // end for( month )	  
	}  // end if( year in range )
      else
	{
	  if( VERBOSE )
	    cout << "(Skipped year " << year << " analytically.)  ";
	}
      
      if( VERBOSE )
	cout << "(Finished search of year " << year << ".)" << endl;
      
    }  // end for( year )
  
  return 0;

}  // end int main()



