Subversion Repositories public

Rev

Rev 47 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

/***************************************************************************
 *   Copyright (C) 2007 by Andreas Theofilu   *
 *   andreas@TheoSys.at   *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   This program is distributed in the hope that it will be useful,       *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
 *   GNU General Public License for more details.                          *
 *                                                                         *
 *   You should have received a copy of the GNU General Public License     *
 *   along with this program; if not, write to the                         *
 *   Free Software Foundation, Inc.,                                       *
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
 ***************************************************************************/

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <ctype.h>
#include "helper.h"

int ComputeSize (int OrgLen, int NewLen, int OrgSize)
{
double OLen, NLen, OSize, zw;

        OLen = (double)OrgLen;
        NLen = (double)NewLen;
        OSize = (double)OrgSize;

        zw = (NLen / OLen) * OSize;
        return (int)zw;
}

void date_int (int *day, int *mon, int *year, long date)
{
        *year = (int)(date / 10000);
        *day = (int)(date % 100);
        *mon = (int)((date % 10000) - *day) / 100;
}

double integer (double zahl)
{
long zw;
double ret;

        zw = (long)zahl;
        ret = (double)zw;
        return ret;
}

double round (double zahl, int prez)
{
double divi;
long zw;

        divi = pow (zahl + 0.5,(double)prez);
        zw = (zahl + 0.5) * divi;
        return (double)zw / divi;
}

long get_date (char *sdate)
{
int tag,mon,year,i,j,pos,len,punkt;
char zw[21],hv0[21];
char *beg,*end;

        if (strlen (sdate) < 6)
           return -1L;

        if (strchr (sdate,'.') != NULL)
           punkt = 1;
        else
           punkt = 0;

        if (punkt && strlen (sdate) < 8)
           return -1L;

        tag = mon = year = 0;
        pos = 0;
        beg = sdate;

/* Tag */
        if (punkt)
        {
           if ((end = strchr (beg,'.')) == NULL)
              return -1L;

           j = end - beg;

           if (j > 2)
              return -1L;

           len = j;
           beg = end;
        }
        else
           len = 2;

        strncpy (&zw[0],sdate,len);
        zw[len] = 0;
        tag = atoi (zw);
        pos = len;

/* Monat */
        if (!isdigit (*(sdate+pos)))
        {
           beg++;
           pos++;
        }

        if (punkt)
        {
           if ((end = strchr (beg,'.')) == NULL)
              return -1L;

           j = end - beg;

           if (j > 2)
              return -1L;

           len = j;
           beg = end;
        }
        else
           len = 2;

        strncpy (&zw[0],sdate+pos,len);
        zw[len] = 0;
        mon = atoi (zw);
        pos += len;

/* Jahr */
        if (!isdigit (*(sdate+pos)))
           pos++;

        beg = sdate+pos;
        i = strlen (beg);

        if (i != 4 && i != 2)
           return -1L;

        year = atoi (beg);

/* Überprüfung */

        if (tag == 0 && mon == 0 && year == 0)
           return 0L;

        if (mon < 1 || mon > 12)
           return -1L;

        if (year < 100)
        {
           if (year < 50)
              year += 2000;
           else
              year += 1900;
        }

        if ((year % 4) == 0)
           MonLeiste[1] = 29;
        else
           MonLeiste[1] = 28;

        if (tag < 1 || tag > MonLeiste[mon-1])
           return -1L;

        return (long)year * 10000L + ((long)mon * 100L) + (long)tag;
}

long get_gebos_date (char *sdate, int kenn)
{
int tag,mon,year,i,j,pos,len,punkt;
char zw[21],hv0[21];
char *beg,*end;

        if (!kenn)
        {
           if (strlen (sdate) < 6)
              return -1L;
        }
        else if (strlen (sdate) < 4 && strlen (sdate) > 0 && kenn)
              return -1L;
        else if (strlen (sdate) == 0 && kenn)
              return 0L;                /* Kein Datum */

        if (strchr (sdate,'.') != NULL)
           punkt = 1;
        else
           punkt = 0;

        if (!kenn)
        {
           if (punkt && strlen (sdate) < 8)
              return -1L;
        }
        else
        {
           if (punkt && strlen (sdate) < 5)
              return -1L;
        }

        tag = mon = year = 0;
        pos = 0;
        beg = sdate;

/* Tag */
        if (!kenn)
        {
           if (punkt)
           {
              if ((end = strchr (beg,'.')) == NULL)
                 return -1L;

              j = end - beg;

              if (j > 2)
                 return -1L;

              len = j;
              beg = end;
           }
           else
              len = 2;

           strncpy (&zw[0],sdate,len);
           zw[len] = 0;
        }
        else
        {
           strcpy (&zw[0], "01");
           len = 0;
        }

        tag = atoi (zw);
        pos = len;

/* Monat */
        if (!isdigit (*(sdate+pos)))
        {
           beg++;
           pos++;
        }

        if (punkt)
        {
           if ((end = strchr (beg,'.')) == NULL)
              return -1L;

           j = end - beg;

           if (j > 2)
              return -1L;

           len = j;
           beg = end;
        }
        else
           len = 2;

        strncpy (&zw[0],sdate+pos,len);
        zw[len] = 0;
        mon = atoi (zw);
        pos += len;

/* Jahr */
        if (!isdigit (*(sdate+pos)))
           pos++;

        beg = sdate+pos;
        i = strlen (beg);

        if (i != 4 && i != 2)
           return -1L;

        year = atoi (beg);

/* Überprüfung */

        if (tag == 0 && mon == 0 && year == 0)
           return 0L;

        if (mon < 1 || mon > 12)
           return -1L;

        if (year < 100)
        {
           if (year < 50)
              year += 2000;
           else
              year += 1900;
        }

        if ((year % 4) == 0)
           MonLeiste[1] = 29;
        else
           MonLeiste[1] = 28;

        if ((tag < 1 || tag > MonLeiste[mon-1]) && tag != 32)
           return -1L;

        return (long)year * 10000L + ((long)mon * 100L) + (long)tag;
}

void set_feb (int year)
{
        if (year == 1900 || year == 2100)
        {
           MonLeiste[1] = 28;
           return;
        }

        if (year % 4)
           MonLeiste[1] = 28;
        else
           MonLeiste[1] = 29;
}

long DateToDay (long date)
{
int day, mon, year, jahre, sj, i;
long tage;

        if (date <= 0L)
           return 0L;

        date_int (&day, &mon, &year, date);

        if (day <= 0 || mon <= 0 || year <= 0)
           return 0L;

        jahre = (year >= 1900) ? year - 1900 : year;
        sj = 0;

        if (jahre < 1)
           tage = 0L;
        else
        {
           tage = ((long)jahre - 1L) * 365L;
           sj = (jahre - 1) / 4;
        }

        tage += (long)sj;
        set_feb (year);

        for (i = 0; i < (mon-1); i++)
           tage += (long)MonLeiste[i];

        tage += (long)day;
        return tage;
}

long DayToDate (long days)
{
int jahr, mon, day, i, j;

        if (days <= 0L)
           return 0L;

        if (days >= 365)
        {
           jahr = (int)(days / 365L);
           mon = (int)(days - (((long)jahr * 365L) + ((long)jahr / 4L)));

           if (mon == 0)
              mon = 1;

           jahr++;
        }
        else
        {
           jahr = 0;
           mon = days;
        }

        set_feb (jahr + 1900);
        i = j = 0;

        while (i < mon)
        {
           i += MonLeiste[j];
           j++;

           if (i < mon && j >= 12)
              j = 0;
        }

        i -= MonLeiste[j-1];
        day = mon - i;
        mon = j;

        return (long)(jahr+1900) * 10000L + ((long)mon * 100L) + (long)day;
}

long make_date (int day, int mon, int year)
{
        if (year < 1900)
           year += 1900;

        if (year > 9999)
           return 0L;

        return (long)year * 10000L + ((long)mon * 100L) + (long)day;
}

char *PointNumber (double Zahl, int prec, char *ret)
{
char buf[128], hv0[128];
int i, j, a, count, maxlen;
BOOL flag;
char *p;

        // Ist Zahl < 0.0?

        if (Zahl < (double)0.0)
        {
           *ret = '-';                  // dann Minus setzen
           j = 1;
        }
        else
           j = 0;

        sprintf (buf, "%%%d.%df", 2+prec, prec);

        // Wenn Zahl negativ dann Positiv machen

        if (Zahl < (double)0.0)
           Zahl = Zahl * (-1.0);

        sprintf (hv0, buf, Zahl);

        // Interpunktion in die Zahl setzen

        i = strlen (hv0);
        maxlen = sizeof(hv0);
        p = hv0;
        a = 0;
        flag = FALSE;
        count = (i - prec - 1) % 3;

        if (count == 0)
           count = 3;

        while (a < i && a < maxlen && j < maxlen)
        {
           if (*p == '.')
           {
              *p = ',';
              flag = TRUE;
           }

           if (count == 0 && a > 0 && !flag)
           {
              ret[j] = '.';
              j++;
              count = 3;
           }

           ret[j] = *p++;
           j++;
           a++;
           count--;
        }

        ret[j] = 0;
        return ret;
}