Código:
/***
* Compara duas datas.
*
* Valor de retorno:
* < 0 - Se a primeira data for anterior à segunda
* == 0 - Se as datas forem iguais
* > 0 - Se a primeira data for posterior à segunda
***/
int comparar_datas(struct Data data1, struct Data data2)
{
int retval = 0;
if (data1.ano < data2.ano)
{
/* o primeiro ano é inferior ao segundo, logo a 1a data é inferior à 2a */
retval = -1;
}
else if (data1.ano > data2.ano)
{
/* o 1o ano é superior ao 2o, logo a 1a data é superior à 2a */
retval = 1;
}
else /* os anos sao iguais, temos de testar os meses */
{
if (data1.mes < data2.mes)
{
/* o 1o mes é inferior ao 2o, logo a 1a data é inferior à 2a */
retval = -1;
} else if (data1.mes > data2.mes)
{
/* o 1o mes é superior ao 2o, logo a 1a data é superior à 2a */
retval = 1;
}
else /* os meses também são iguais, temos de testar os dias */
{
if (data1.dia < data2.dia)
{
/* bla bla bla ;) */
retval = -1;
} else if (data1.dia > data2.dia)
{
/* idem idem... */
retval = 1;
} else
{
/* datas iguais */
retval = 0;
}
}
}
return retval;
}
/***
* Verifica se uma data está entre duas datas limites indicadas
* (NOTA: Não é verificado se a data inicial é realmente anterior ou igual à data final.
* Isso fica como exercício ;)
*
* Valor de retorno:
* != 0 - Dentro dos limites
* == 0 - Fora dos limites
***/
int verificar_limites(struct Data data_teste, struct Data data_inicial, struct Data data_final)
{
int retval;
if (comparar_datas(data_teste, data_inicial < 0)
{
/* data anterior à data inicial */
retval = 0;
} else (comparar_datas(data_teste, data_final) > 0)
{
/* data posterior à data final */
retval = 0;
} else /* se não é anterior à inicial nem posterior à final, só pode estar dentro dos limites */
retval = 1;
return retval;
}