Subversion Repositories public

Rev

Rev 60 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
43 root 1
/***************************************************************************
52 andreas 2
 *   Copyright (C) 2007 by Andreas Theofilu                                *
3
 *   andreas@TheoSys.at                                                    *
43 root 4
 *                                                                         *
5
 *   This program is free software; you can redistribute it and/or modify  *
6
 *   it under the terms of the GNU General Public License as published by  *
52 andreas 7
 *   the Free Software Foundation version 3 of the License.                *
43 root 8
 *                                                                         *
9
 *   This program is distributed in the hope that it will be useful,       *
10
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
11
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
12
 *   GNU General Public License for more details.                          *
13
 *                                                                         *
14
 *   You should have received a copy of the GNU General Public License     *
15
 *   along with this program; if not, write to the                         *
16
 *   Free Software Foundation, Inc.,                                       *
17
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
18
 ***************************************************************************/
19
 
20
#include <stdio.h>
21
#include <string.h>
22
#include <math.h>
23
#include <stdlib.h>
24
#include <ctype.h>
25
#include "helper.h"
26
 
27
int ComputeSize (int OrgLen, int NewLen, int OrgSize)
28
{
29
double OLen, NLen, OSize, zw;
30
 
31
	OLen = (double)OrgLen;
32
	NLen = (double)NewLen;
33
	OSize = (double)OrgSize;
34
 
35
	zw = (NLen / OLen) * OSize;
36
	return (int)zw;
37
}
38
 
39
void date_int (int *day, int *mon, int *year, long date)
40
{
70 andreas 41
	if (day == NULL || mon == NULL || year == NULL || date <= 10000L)
42
	   return;
43
 
43 root 44
	*year = (int)(date / 10000);
45
	*day = (int)(date % 100);
46
	*mon = (int)((date % 10000) - *day) / 100;
47
}
48
 
49
double integer (double zahl)
50
{
51
long zw;
52
double ret;
53
 
54
	zw = (long)zahl;
55
	ret = (double)zw;
56
	return ret;
57
}
58
 
59
double round (double zahl, int prez)
60
{
61
double divi;
62
long zw;
63
 
64
	divi = pow (zahl + 0.5,(double)prez);
65
	zw = (zahl + 0.5) * divi;
66
	return (double)zw / divi;
67
}
68
 
69
long get_date (char *sdate)
70
{
71
int tag,mon,year,i,j,pos,len,punkt;
52 andreas 72
char zw[21];
43 root 73
char *beg,*end;
74
 
47 andreas 75
	if (sdate == NULL || strlen (sdate) < 6)
43 root 76
	   return -1L;
77
 
78
	if (strchr (sdate,'.') != NULL)
79
	   punkt = 1;
80
	else
81
	   punkt = 0;
82
 
83
	if (punkt && strlen (sdate) < 8)
84
	   return -1L;
85
 
86
	tag = mon = year = 0;
87
	pos = 0;
88
	beg = sdate;
89
 
90
/* Tag */
91
	if (punkt)
92
	{
93
	   if ((end = strchr (beg,'.')) == NULL)
94
	      return -1L;
95
 
96
	   j = end - beg;
97
 
98
	   if (j > 2)
99
	      return -1L;
100
 
101
	   len = j;
102
	   beg = end;
103
	}
104
	else
105
	   len = 2;
106
 
107
	strncpy (&zw[0],sdate,len);
108
	zw[len] = 0;
109
	tag = atoi (zw);
110
	pos = len;
111
 
112
/* Monat */
113
	if (!isdigit (*(sdate+pos)))
114
	{
115
	   beg++;
116
	   pos++;
117
	}
118
 
119
	if (punkt)
120
	{
121
	   if ((end = strchr (beg,'.')) == NULL)
122
	      return -1L;
123
 
124
	   j = end - beg;
125
 
126
	   if (j > 2)
127
	      return -1L;
128
 
129
	   len = j;
130
	   beg = end;
131
	}
132
	else
133
	   len = 2;
134
 
135
	strncpy (&zw[0],sdate+pos,len);
136
	zw[len] = 0;
137
	mon = atoi (zw);
138
	pos += len;
139
 
140
/* Jahr */
141
	if (!isdigit (*(sdate+pos)))
142
	   pos++;
143
 
144
	beg = sdate+pos;
145
	i = strlen (beg);
146
 
147
	if (i != 4 && i != 2)
148
	   return -1L;
149
 
150
	year = atoi (beg);
151
 
152
/* Überprüfung */
153
 
154
	if (tag == 0 && mon == 0 && year == 0)
155
	   return 0L;
156
 
157
	if (mon < 1 || mon > 12)
158
	   return -1L;
159
 
160
	if (year < 100)
161
	{
162
	   if (year < 50)
163
	      year += 2000;
164
	   else
165
	      year += 1900;
166
	}
167
 
168
	if ((year % 4) == 0)
169
	   MonLeiste[1] = 29;
170
	else
171
	   MonLeiste[1] = 28;
172
 
173
	if (tag < 1 || tag > MonLeiste[mon-1])
174
	   return -1L;
175
 
176
	return (long)year * 10000L + ((long)mon * 100L) + (long)tag;
177
}
178
 
179
long get_gebos_date (char *sdate, int kenn)
180
{
181
int tag,mon,year,i,j,pos,len,punkt;
52 andreas 182
char zw[21];
43 root 183
char *beg,*end;
184
 
60 andreas 185
	if (sdate == NULL)
186
	   return -1L;
187
 
43 root 188
	if (!kenn)
189
	{
190
	   if (strlen (sdate) < 6)
191
	      return -1L;
192
	}
193
	else if (strlen (sdate) < 4 && strlen (sdate) > 0 && kenn)
194
	      return -1L;
195
	else if (strlen (sdate) == 0 && kenn)
196
	      return 0L;		/* Kein Datum */
197
 
198
	if (strchr (sdate,'.') != NULL)
199
	   punkt = 1;
200
	else
201
	   punkt = 0;
202
 
203
	if (!kenn)
204
	{
205
	   if (punkt && strlen (sdate) < 8)
206
	      return -1L;
207
	}
208
	else
209
	{
210
	   if (punkt && strlen (sdate) < 5)
211
	      return -1L;
212
	}
213
 
214
	tag = mon = year = 0;
215
	pos = 0;
216
	beg = sdate;
217
 
218
/* Tag */
219
	if (!kenn)
220
	{
221
	   if (punkt)
222
	   {
223
	      if ((end = strchr (beg,'.')) == NULL)
224
		 return -1L;
225
 
226
	      j = end - beg;
227
 
228
	      if (j > 2)
229
		 return -1L;
230
 
231
	      len = j;
232
	      beg = end;
233
	   }
234
	   else
235
	      len = 2;
236
 
237
	   strncpy (&zw[0],sdate,len);
238
	   zw[len] = 0;
239
	}
240
	else
241
	{
242
	   strcpy (&zw[0], "01");
243
	   len = 0;
244
	}
245
 
246
	tag = atoi (zw);
247
	pos = len;
248
 
249
/* Monat */
250
	if (!isdigit (*(sdate+pos)))
251
	{
252
	   beg++;
253
	   pos++;
254
	}
255
 
256
	if (punkt)
257
	{
258
	   if ((end = strchr (beg,'.')) == NULL)
259
	      return -1L;
260
 
261
	   j = end - beg;
262
 
263
	   if (j > 2)
264
	      return -1L;
265
 
266
	   len = j;
267
	   beg = end;
268
	}
269
	else
270
	   len = 2;
271
 
272
	strncpy (&zw[0],sdate+pos,len);
273
	zw[len] = 0;
274
	mon = atoi (zw);
275
	pos += len;
276
 
277
/* Jahr */
278
	if (!isdigit (*(sdate+pos)))
279
	   pos++;
280
 
281
	beg = sdate+pos;
282
	i = strlen (beg);
283
 
284
	if (i != 4 && i != 2)
285
	   return -1L;
286
 
287
	year = atoi (beg);
288
 
289
/* Überprüfung */
290
 
291
	if (tag == 0 && mon == 0 && year == 0)
292
	   return 0L;
293
 
294
	if (mon < 1 || mon > 12)
295
	   return -1L;
296
 
297
	if (year < 100)
298
	{
299
	   if (year < 50)
300
	      year += 2000;
301
	   else
302
	      year += 1900;
303
	}
304
 
305
	if ((year % 4) == 0)
306
	   MonLeiste[1] = 29;
307
	else
308
	   MonLeiste[1] = 28;
309
 
310
	if ((tag < 1 || tag > MonLeiste[mon-1]) && tag != 32)
311
	   return -1L;
312
 
313
	return (long)year * 10000L + ((long)mon * 100L) + (long)tag;
314
}
315
 
316
void set_feb (int year)
317
{
318
	if (year == 1900 || year == 2100)
319
	{
320
	   MonLeiste[1] = 28;
321
	   return;
322
	}
323
 
324
	if (year % 4)
325
	   MonLeiste[1] = 28;
326
	else
327
	   MonLeiste[1] = 29;
328
}
329
 
330
long DateToDay (long date)
331
{
332
int day, mon, year, jahre, sj, i;
333
long tage;
334
 
335
	if (date <= 0L)
336
	   return 0L;
337
 
338
	date_int (&day, &mon, &year, date);
339
 
340
	if (day <= 0 || mon <= 0 || year <= 0)
341
	   return 0L;
342
 
343
	jahre = (year >= 1900) ? year - 1900 : year;
344
	sj = 0;
345
 
346
	if (jahre < 1)
347
	   tage = 0L;
348
	else
349
	{
350
	   tage = ((long)jahre - 1L) * 365L;
351
	   sj = (jahre - 1) / 4;
352
	}
353
 
354
	tage += (long)sj;
355
	set_feb (year);
356
 
357
	for (i = 0; i < (mon-1); i++)
358
	   tage += (long)MonLeiste[i];
359
 
360
	tage += (long)day;
361
	return tage;
362
}
363
 
364
long DayToDate (long days)
365
{
366
int jahr, mon, day, i, j;
367
 
368
	if (days <= 0L)
369
	   return 0L;
370
 
371
	if (days >= 365)
372
	{
373
	   jahr = (int)(days / 365L);
374
	   mon = (int)(days - (((long)jahr * 365L) + ((long)jahr / 4L)));
375
 
376
	   if (mon == 0)
377
	      mon = 1;
378
 
379
	   jahr++;
380
	}
381
	else
382
	{
383
	   jahr = 0;
384
	   mon = days;
385
	}
386
 
387
	set_feb (jahr + 1900);
388
	i = j = 0;
389
 
390
	while (i < mon)
391
	{
392
	   i += MonLeiste[j];
393
	   j++;
394
 
395
	   if (i < mon && j >= 12)
396
	      j = 0;
397
	}
398
 
399
	i -= MonLeiste[j-1];
400
	day = mon - i;
401
	mon = j;
402
 
403
	return (long)(jahr+1900) * 10000L + ((long)mon * 100L) + (long)day;
404
}
405
 
406
long make_date (int day, int mon, int year)
407
{
408
	if (year < 1900)
409
	   year += 1900;
410
 
411
	if (year > 9999)
412
	   return 0L;
413
 
414
	return (long)year * 10000L + ((long)mon * 100L) + (long)day;
415
}
416
 
417
char *PointNumber (double Zahl, int prec, char *ret)
418
{
419
char buf[128], hv0[128];
420
int i, j, a, count, maxlen;
421
BOOL flag;
422
char *p;
423
 
60 andreas 424
	if (ret == NULL)
425
	   return NULL;
426
 
43 root 427
	// Ist Zahl < 0.0?
428
 
429
	if (Zahl < (double)0.0)
430
	{
431
	   *ret = '-';			// dann Minus setzen
432
	   j = 1;
433
	}
434
	else
435
           j = 0;
436
 
437
	sprintf (buf, "%%%d.%df", 2+prec, prec);
438
 
439
	// Wenn Zahl negativ dann Positiv machen
440
 
441
	if (Zahl < (double)0.0)
442
	   Zahl = Zahl * (-1.0);
443
 
444
	sprintf (hv0, buf, Zahl);
445
 
446
	// Interpunktion in die Zahl setzen
447
 
448
	i = strlen (hv0);
449
	maxlen = sizeof(hv0);
450
	p = hv0;
451
	a = 0;
452
	flag = FALSE;
453
	count = (i - prec - 1) % 3;
454
 
455
	if (count == 0)
456
	   count = 3;
457
 
458
	while (a < i && a < maxlen && j < maxlen)
459
	{
460
	   if (*p == '.')
461
	   {
462
              *p = ',';
463
	      flag = TRUE;
464
           }
465
 
466
	   if (count == 0 && a > 0 && !flag)
467
	   {
468
	      ret[j] = '.';
469
	      j++;
470
	      count = 3;
471
	   }
472
 
473
	   ret[j] = *p++;
474
	   j++;
475
	   a++;
476
	   count--;
477
	}
478
 
479
	ret[j] = 0;
480
	return ret;
481
}