199 lines
5.7 KiB
C
199 lines
5.7 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <ctype.h>
|
|
#include <string.h>
|
|
|
|
|
|
|
|
|
|
#define TWO_DIGIT_CROSSOVER 10
|
|
|
|
|
|
|
|
//**************************************************************************
|
|
//
|
|
// Make sure a year value is ProBoard Y2K compliant (i.e., 1900 + 0-127)
|
|
//
|
|
// Prototype: int NormalizeYear( int iYearVal );
|
|
//
|
|
// Parameters: iYearVal ... Input year value to adjust
|
|
//
|
|
// Returns: The "normalized" year value that is Y2K compliant
|
|
//
|
|
// Remarks:
|
|
//
|
|
// The year value that this routine returns is between 0 and 127, to
|
|
// indicate the years 1900 through 2027. 2027 will only be returned if the
|
|
// macro TWO_DIGIT_CROSSOVER is set to 28. Right now, it's set to 10, which
|
|
// will result in a return value of 0 to 109, indicating 1900 - 2009.
|
|
//
|
|
// We use this macro to allow the programmer to customize the cutoff of two-
|
|
// digit year values to suit their application's needs.
|
|
//
|
|
// This routine performs quite a number of checks on the year value. If the
|
|
// year value is negative, it converts it to positive and goes from there.
|
|
//
|
|
// If the value is a two-digit value, it checks the crossover value to
|
|
// figure out what century it's in. If it's a three-digit value, it
|
|
// considers it a freaky value and tries the best it can (it MOD's the value
|
|
// by 100, and treats the final date as a two-year value).
|
|
//
|
|
// We also check for typos here. We only consider a simple typo of the year
|
|
// 3XXX. If we find a year like this, we'll treat it as a 2XXX year.
|
|
// Anything else is treated verbatim as a legitimate 4-digit year. Anything
|
|
// after 2000+TWO_DIGIT_CROSSOVER-1 wraps over to the 1900 century.
|
|
//
|
|
// -------------------------------------------------------------------------
|
|
//
|
|
// Created on: 06/17/99 (Jeff Reeder)
|
|
// Last modified: 06/17/99 (Jeff Reeder) Created
|
|
//
|
|
//**************************************************************************
|
|
|
|
int NormalizeYear( int iYearVal )
|
|
{
|
|
//----------------------------------------------------------
|
|
// First, check for really outrageous year values. This
|
|
// means years from 100..1899 and 2000+TWO_DIGIT_CROSSOVER..
|
|
//----------------------------------------------------------
|
|
|
|
if ( iYearVal < 0 )
|
|
{
|
|
//---------------------------------------
|
|
// We somehow have a negative year value.
|
|
// Convert it to a positive value.
|
|
//---------------------------------------
|
|
|
|
iYearVal *= -1;
|
|
}
|
|
|
|
|
|
//---------------------------------
|
|
// Check for outlandish year values
|
|
//---------------------------------
|
|
|
|
if ( iYearVal >= 3000 &&
|
|
iYearVal < 3000 + TWO_DIGIT_CROSSOVER )
|
|
{
|
|
//-------------------------------------------------------
|
|
// User must have hit 3 when they meant 2 - subtract 1000
|
|
//-------------------------------------------------------
|
|
|
|
iYearVal -= 1000;
|
|
}
|
|
|
|
|
|
if (
|
|
iYearVal >= 100 &&
|
|
(
|
|
iYearVal < 1900 ||
|
|
iYearVal >= 2000 + TWO_DIGIT_CROSSOVER
|
|
)
|
|
)
|
|
{
|
|
//------------------------------------------------
|
|
// The year is more than two digits, and it's not
|
|
// in the range of 1900 - 2000+TWO_DIGIT_CROSSOVER
|
|
//
|
|
// This is a weird input ... do our best by
|
|
// converting it to a two-digit year and proceed.
|
|
//------------------------------------------------
|
|
|
|
iYearVal %= 100;
|
|
}
|
|
|
|
|
|
//--------------------------------------------
|
|
// Now we can proceed with year normaliziation
|
|
//--------------------------------------------
|
|
|
|
if ( iYearVal < 100 )
|
|
{
|
|
//-----------
|
|
// Short year
|
|
//-----------
|
|
|
|
if ( iYearVal < TWO_DIGIT_CROSSOVER )
|
|
{
|
|
//--------------------------------------------
|
|
// Should be 2000...2000+TWO_DIGIT_CROSSOVER-1
|
|
//--------------------------------------------
|
|
|
|
iYearVal += 100;
|
|
}
|
|
else
|
|
{
|
|
//-----------------------------------------------
|
|
// This year must be in the 1900's - The value is
|
|
// already in the proper value range. Do nothing
|
|
//-----------------------------------------------
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//---------------------------------------------------
|
|
// The year must be 1900...2000+TWO_DIGIT_CROSSOVER-1
|
|
//---------------------------------------------------
|
|
|
|
if ( iYearVal < 2000 + TWO_DIGIT_CROSSOVER )
|
|
{
|
|
//-----------------------------
|
|
// Year is between 1900 .. 1999
|
|
//-----------------------------
|
|
|
|
iYearVal -= 1900;
|
|
}
|
|
}
|
|
|
|
|
|
return iYearVal;
|
|
}
|
|
|
|
|
|
|
|
void main( void )
|
|
{
|
|
for ( ; ; )
|
|
{
|
|
char buf[ 256 ];
|
|
|
|
|
|
printf( "\nEnter a year value (ENTER=quit): " );
|
|
|
|
gets( buf );
|
|
|
|
|
|
if ( buf[ 0 ] == '\0' )
|
|
{
|
|
break;
|
|
}
|
|
|
|
|
|
if ( isdigit( buf[ 0 ] ) ||
|
|
(
|
|
buf[ 0 ] == '-' &&
|
|
isdigit( buf[ 1 ] )
|
|
)
|
|
)
|
|
{
|
|
int val1;
|
|
int val2;
|
|
|
|
|
|
val1 = atoi( buf );
|
|
val2 = NormalizeYear( val1 );
|
|
|
|
|
|
printf( "Buffer=%-10.10s Year=%-7d NormalizedYear=%-4d RealYear=%d\n",
|
|
buf,
|
|
val1,
|
|
val2,
|
|
val2 + 1900 );
|
|
}
|
|
else
|
|
{
|
|
printf( "\nInvalid year value\n\n" );
|
|
}
|
|
}
|
|
}
|