function ano_bissexto($ano)
  {
    return ($ano % 4 == 0) and (($ano % 100 != 0) or ($ano % 400 == 0));
  }

  function data_codifica($dia,$mes,$ano)
  {
    $a = $ano-1;
    $anos_bissextos = floor($a/4);
    $dias = ($a*365)+$anos_bissextos;
    $mab = array(31,29,31,30,31,30,31,31,30,31,30,31);
    $msb = array(31,28,31,30,31,30,31,31,30,31,30,31);
    $meses = $msb;
    if (ano_bissexto($ano))
      $meses = $mab;
    for ($m==1;$m<$mes;$m++)
      $dias = $dias+$meses[$m-1];
    $dias = $dias+$dia;
    return $dias;
  }
  
  function data_decodifica($data)
  {
    $base = (365*4)+1;
    $arr = array(1,1,1);
    $anos_bissextos = floor($data/$base);
    $dias_excedentes = floor($data%$base);
    $ano = ($anos_bissextos*4)+floor($dias_excedentes/365)+1;
    $dias = floor($dias_excedentes%365);
    $mab = array(31,29,31,30,31,30,31,31,30,31,30,31);
    $msb = array(31,28,31,30,31,30,31,31,30,31,30,31);
    $meses = $msb;
    if (ano_bissexto($ano))
      $meses = $mab;
    $continua = true;
    $m = 0;
    while (true)
    {
      if ($dias < $meses[$m])
        break;
      $dias = $dias-$meses[$m];
      $m++;
    }
    $arr[0] = $dias;
    $arr[1] = $m+1;
    $arr[2] = $ano;
    return $arr;
  }