1 /**********************************************************
2 * Version $Id$
3 *********************************************************/
4
5 ///////////////////////////////////////////////////////////
6 // //
7 // SAGA //
8 // //
9 // System for Automated Geoscientific Analyses //
10 // //
11 // Tool Library //
12 // Grid_Filter / Grid_Calculus //
13 // //
14 //-------------------------------------------------------//
15 // //
16 // errfunc.c //
17 // //
18 // Copyright (C) 2013 by //
19 // HfT Stuttgart //
20 // //
21 //-------------------------------------------------------//
22 // //
23 // This file is part of 'SAGA - System for Automated //
24 // Geoscientific Analyses'. SAGA is free software; you //
25 // can redistribute it and/or modify it under the terms //
26 // of the GNU General Public License as published by the //
27 // Free Software Foundation, either version 2 of the //
28 // License, or (at your option) any later version. //
29 // //
30 // SAGA is distributed in the hope that it will be //
31 // useful, but WITHOUT ANY WARRANTY; without even the //
32 // implied warranty of MERCHANTABILITY or FITNESS FOR A //
33 // PARTICULAR PURPOSE. See the GNU General Public //
34 // License for more details. //
35 // //
36 // You should have received a copy of the GNU General //
37 // Public License along with this program; if not, see //
38 // <http://www.gnu.org/licenses/>. //
39 // //
40 //-------------------------------------------------------//
41 // //
42 // e-mail: johannes.engels@hft-stuttgart.de //
43 // //
44 // contact: Johannes Engels //
45 // Hochschule fuer Technik Stuttgart //
46 // Schellingstr. 24 //
47 // 70174 Stuttgart //
48 // Germany //
49 // //
50 ///////////////////////////////////////////////////////////
51
52 //---------------------------------------------------------
53
54
55 ///////////////////////////////////////////////////////////
56 // //
57 // //
58 // //
59 ///////////////////////////////////////////////////////////
60
61 //---------------------------------------------------------
62 #include <string.h>
63 #include <stdio.h>
64 #include <stdlib.h>
65 #include <stdarg.h>
66 #include <ctype.h>
67
68 #include "errfunc.h"
69
70
71
72
73
74
fehler(int zeile,int fnr,char * filename,char * funk_name,FILE * protfile,fehlerinfo * finf,void * info1,void * info2,void * info3,void * info4,void * info5,void * info6,void * info7)75 void fehler (int zeile,
76 int fnr,
77 char *filename,
78 char *funk_name,
79 FILE *protfile,
80 fehlerinfo *finf,
81 void *info1,
82 void *info2,
83 void *info3,
84 void *info4,
85 void *info5,
86 void *info6,
87 void *info7)
88
89 /************************************************/
90 /* Ausgabe von Laufzeitfehlern, */
91 /* ggf. Programmabbruch */
92 /************************************************/
93
94 {
95 int j;
96 int gefunden;
97 int sl;
98
99 char fmessage [255];
100 char *cp1;
101 char *cp2;
102 char *cp3;
103 char *cp4;
104 fehlerinfo *fil;
105
106 void *info [8];
107
108
109 info [1] = info1;
110 info [2] = info2;
111 info [3] = info3;
112 info [4] = info4;
113 info [5] = info5;
114 info [6] = info6;
115 info [7] = info7;
116
117 fprintf (protfile, "\n\n");
118
119 gefunden = 0;
120
121 for (fil = finf; fil != NULL && fil -> fnr != 0; fil ++)
122 {
123 if (fnr == fil -> fnr)
124 {
125 gefunden = 1;
126 break;
127 }
128 }
129
130 if (gefunden == 0)
131 {
132 fprintf (protfile, "+++ Unbekannter Fehler\n");
133 fflush (protfile);
134 fprintf (protfile, " Abbruch des Programms.\n\n");
135 exit (20);
136 }
137
138 if (fil -> art == 'W')
139 fprintf (protfile,
140 "+++ Warnung in Funktion %s,\n"
141 " Datei %s,\n"
142 " Zeile %d:\n",
143 funk_name,
144 filename,
145 zeile);
146 else if (fil -> art == 'F' || fil -> art == 'E')
147 fprintf (protfile,
148 "+++ Fehler in Funktion %s,\n"
149 " Datei %s,\n"
150 " Zeile %d:\n",
151 funk_name,
152 filename,
153 zeile);
154
155 for (cp1 = fil -> message, j = 1, cp4 = cp1;
156 j <= 7 && info [j] != NULL; j ++)
157 {
158 cp2 = strchr (cp4, '%');
159
160 if (cp2 == NULL)
161 break;
162
163 if (*(cp2 + 1) == '%')
164 {
165 cp4 = cp2 + 2;
166 j --;
167 continue;
168 }
169
170
171 gefunden = 0;
172
173 cp3 = strpbrk (cp2 + 1, "csdlhfe");
174
175 if (cp3 == NULL)
176 {
177 fprintf (protfile, " Fehler in errfunc.c: ");
178 fprintf (protfile, "unzulaessige Formatangabe\n");
179 break;
180 }
181
182 if (*(cp3 + 1) != 0x00 && *(cp3 + 1) != '%')
183 cp2 = cp3 + 2;
184 else
185 cp2 = cp3 + 1;
186
187 sl = cp2 - cp1;
188
189 memcpy (fmessage, cp1, sl);
190 fmessage [sl] = 0x00;
191
192 switch (*cp3)
193 {
194 case 'd':
195 fprintf (protfile, fmessage, *((int *)(info [j])));
196 break;
197
198 case 'l':
199 fprintf (protfile, fmessage, *((long *)(info [j])));
200 break;
201
202 case 'h':
203 fprintf (protfile, fmessage, *((short *)(info [j])));
204 break;
205
206 case 'e':
207 case 'f':
208 fprintf (protfile, fmessage, *((double *)(info [j])));
209 break;
210
211 case 'c':
212 fprintf (protfile, fmessage, *((char *)(info [j])));
213 break;
214
215 case 's':
216 fprintf (protfile, fmessage, (char *)(info [j]));
217 break;
218
219 default:
220 break;
221 }
222
223 cp1 = cp2;
224 cp4 = cp2;
225 }
226
227 fprintf (protfile, "%s", cp1);
228
229 if (fil -> art == 'E')
230 {
231 fprintf (protfile, " Abbruch des Programms.\n\n");
232 exit (20);
233 }
234
235 fflush (protfile);
236
237 return;
238 }
239
240
241
242
243
244
error_message(int zeile,int fnr,char * filename,char * funk_name,char ** error_list,fehlerinfo * finf,void * info1,void * info2,void * info3,void * info4,void * info5,void * info6,void * info7)245 void error_message (int zeile,
246 int fnr,
247 char *filename,
248 char *funk_name,
249 char **error_list,
250 fehlerinfo *finf,
251 void *info1,
252 void *info2,
253 void *info3,
254 void *info4,
255 void *info5,
256 void *info6,
257 void *info7)
258
259 /************************************************/
260 /* Ausgabe von Laufzeitfehlern, */
261 /* ggf. Programmabbruch */
262 /************************************************/
263
264 {
265 int j;
266 int gefunden;
267 int sl;
268 int sl_head;
269 int sl_all;
270 int sl_alt;
271 fehlerinfo *fil;
272
273 char fmessage [512];
274 char zw [255];
275 char *cp1;
276 char *cp2;
277 char *cp3;
278 char *cp4;
279
280 void *info [8];
281
282
283 info [1] = info1;
284 info [2] = info2;
285 info [3] = info3;
286 info [4] = info4;
287 info [5] = info5;
288 info [6] = info6;
289 info [7] = info7;
290
291 gefunden = 0;
292
293 for (fil = finf; fil != NULL && fil -> fnr != 0; fil ++)
294 {
295 if (fnr == fil -> fnr)
296 {
297 gefunden = 1;
298 break;
299 }
300 }
301
302 if (gefunden == 0)
303 {
304 sprintf (fmessage, "\n"
305 "+++ Unbekannter Fehler\n"
306 " Abbruch des Programms.\n\n");
307 sl_all = strlen (fmessage);
308
309 sl_alt = strlen (*error_list);
310 *error_list = realloc (*error_list,
311 (sl_alt + sl_all + 1) * sizeof (char));
312 memcpy (*error_list + sl_alt, fmessage, sl_all);
313 *(*error_list + sl_alt + sl_all) = 0x00;
314
315 return;
316 }
317
318
319 if (fil -> art == 'W')
320 sprintf (fmessage, "\n"
321 "+++ Warnung in Funktion %s,\n"
322 " Datei %s,\n"
323 " Zeile %d:\n",
324 funk_name,
325 filename,
326 zeile);
327 else if (fil -> art == 'F' || fil -> art == 'E')
328 sprintf (fmessage, "\n"
329 "+++ Fehler in Funktion %s,\n"
330 " Datei %s,\n"
331 " Zeile %d:\n",
332 funk_name,
333 filename,
334 zeile);
335
336
337 sl_head = strlen (fmessage);
338 memset (fmessage + sl_head, ' ', 4);
339 sl_head += 4;
340 sl_all = sl_head;
341
342 for (cp1 = fil -> message, j = 1, cp4 = cp1;
343 j <= 7 && info [j] != NULL;
344 j ++)
345 {
346 cp2 = strchr (cp4, '%');
347
348 if (cp2 == NULL)
349 break;
350
351 if (*(cp2 + 1) == '%')
352 {
353 cp4 = cp2 + 2;
354 j --;
355 continue;
356 }
357
358
359 gefunden = 0;
360
361 cp3 = strpbrk (cp2 + 1, "csdlhfe");
362
363 if (cp3 == NULL)
364 {
365 sprintf (fmessage + sl_all, " Fehler in errfunc.c: "
366 "unzulaessige Formatangabe\n");
367 break;
368 }
369
370 if (*(cp3 + 1) != 0x00 && *(cp3 + 1) != '%')
371 cp2 = cp3 + 2;
372 else
373 cp2 = cp3 + 1;
374
375 sl = cp2 - cp1;
376
377 memcpy (zw, cp1, sl);
378 zw [sl] = 0x00;
379
380 switch (*cp3)
381 {
382 case 'd':
383 sprintf (fmessage + sl_all, zw, *((int *)(info [j])));
384 break;
385
386 case 'l':
387 sprintf (fmessage + sl_all, zw, *((long *)(info [j])));
388 break;
389
390 case 'h':
391 sprintf (fmessage + sl_all, zw, *((short *)(info [j])));
392 break;
393
394 case 'e':
395 case 'f':
396 sprintf (fmessage + sl_all, zw, *((double *)(info [j])));
397 break;
398
399 case 'c':
400 sprintf (fmessage + sl_all, zw, *((char *)(info [j])));
401 break;
402
403 case 's':
404 sprintf (fmessage + sl_all, zw, (char *)(info [j]));
405 break;
406
407 default:
408 break;
409 }
410
411 sl_all = strlen (fmessage);
412
413 cp1 = cp2;
414 cp4 = cp2;
415 }
416
417 sprintf (fmessage + sl_all, "%s", cp1);
418 sl_all = strlen (fmessage);
419
420 sl_alt = strlen (*error_list);
421 *error_list = realloc (*error_list,
422 (sl_alt + sl_all + 1) * sizeof (char));
423 memcpy (*error_list + sl_alt, fmessage, sl_all);
424 *(*error_list + sl_alt + sl_all) = 0x00;
425
426 return;
427 }
428
429
430
431
432
fehler2(int zeile,int fnr,char * filename,char * funk_name,FILE * protfile,fehlerinfo * finf,...)433 void fehler2 (int zeile,
434 int fnr,
435 char *filename,
436 char *funk_name,
437 FILE *protfile,
438 fehlerinfo *finf,
439 ...)
440
441 /************************************************/
442 /* Ausgabe von Laufzeitfehlern, */
443 /* ggf. Programmabbruch */
444 /************************************************/
445
446 {
447 int j;
448 int gefunden;
449 int sl;
450
451 char fmessage [255];
452 char *cp1;
453 char *cp2;
454 char *cp3;
455 char *cp4;
456 fehlerinfo *fil;
457 va_list ap;
458
459 int vint;
460 double vdouble;
461 long vlong;
462 char *pchar;
463
464 fprintf (protfile, "\n\n");
465
466 gefunden = 0;
467
468 for (fil = finf; fil != NULL && fil -> fnr != 0; fil ++)
469 {
470 if (fnr == fil -> fnr)
471 {
472 gefunden = 1;
473 break;
474 }
475 }
476
477 if (gefunden == 0)
478 {
479 fprintf (protfile, "+++ Unbekannter Fehler\n");
480 fprintf (protfile, " Abbruch des Programms.\n\n");
481 exit (20);
482 }
483
484 if (fil -> art == 'W')
485 fprintf (protfile,
486 "+++ Warnung in Funktion %s,\n"
487 " Datei %s,\n"
488 " Zeile %d:\n",
489 funk_name,
490 filename,
491 zeile);
492 else if (fil -> art == 'F' || fil -> art == 'E')
493 fprintf (protfile,
494 "+++ Fehler in Funktion %s,\n"
495 " Datei %s,\n"
496 " Zeile %d:\n",
497 funk_name,
498 filename,
499 zeile);
500
501
502 va_start(ap,finf);
503
504 for (cp1 = fil -> message, j = 1, cp4 = cp1;
505 j <= 7; j ++)
506 {
507 cp2 = strchr (cp4, '%');
508
509 if (cp2 == NULL)
510 break;
511
512 if (*(cp2 + 1) == '%')
513 {
514 cp4 = cp2 + 2;
515 j --;
516 continue;
517 }
518
519
520 gefunden = 0;
521
522 cp3 = strpbrk (cp2 + 1, "sdlfe");
523
524 if (cp3 == NULL)
525 {
526 fprintf (protfile, " Fehler in errfunc.c: ");
527 fprintf (protfile, "unzulaessige Formatangabe\n");
528 break;
529 }
530
531 if (*(cp3 + 1) != 0x00 && *(cp3 + 1) != '%')
532 cp2 = cp3 + 2;
533 else
534 cp2 = cp3 + 1;
535
536 sl = cp2 - cp1;
537
538 memcpy (fmessage, cp1, sl);
539 fmessage [sl] = 0x00;
540
541 switch (*cp3)
542 {
543 /*****************************************************/
544 /* shorts und chars darf es hier aus Syntaxgr�nden */
545 /* nicht geben (!?!) */
546 /*****************************************************/
547
548 case 'd':
549 vint = va_arg(ap,int);
550 fprintf (protfile, fmessage, vint);
551 break;
552
553 case 'l':
554 vlong = va_arg(ap,long);
555 fprintf (protfile, fmessage, vlong);
556 break;
557
558 case 'e':
559 case 'f':
560 vdouble = va_arg(ap,double);
561 fprintf (protfile, fmessage, vdouble);
562 break;
563
564 case 's':
565 pchar = va_arg(ap,char *);
566 fprintf (protfile, fmessage, pchar);
567 break;
568
569 default:
570 break;
571 }
572
573 cp1 = cp2;
574 cp4 = cp2;
575 }
576
577 va_end (ap);
578
579 fprintf (protfile, "%s", cp1);
580
581 if (fil -> art == 'E')
582 {
583 fprintf (protfile, " Abbruch des Programms.\n\n");
584 exit (20);
585 }
586
587 return;
588 }
589
590
591
592
fehler3(int zeile,int fnr,char * filename,char * funk_name,char ** error_list,fehlerinfo * finf,...)593 void fehler3 (int zeile,
594 int fnr,
595 char *filename,
596 char *funk_name,
597 char **error_list,
598 fehlerinfo *finf,
599 ...)
600
601 /************************************************/
602 /* Ausgabe von Laufzeitfehlern, */
603 /* ggf. Programmabbruch */
604 /************************************************/
605
606 {
607 int j;
608 int gefunden;
609 int sl;
610 int sl_all;
611 int sl_alt;
612 int sl_head;
613
614 char fmessage [512];
615 char zw [255];
616 char *cp1;
617 char *cp2;
618 char *cp3;
619 char *cp4;
620 fehlerinfo *fil;
621 va_list ap;
622
623 int vint;
624 double vdouble;
625 long vlong;
626 char *pchar;
627
628 gefunden = 0;
629
630 for (fil = finf; fil != NULL && fil -> fnr != 0; fil ++)
631 {
632 if (fnr == fil -> fnr)
633 {
634 gefunden = 1;
635 break;
636 }
637 }
638
639
640 if (gefunden == 0)
641 {
642 sprintf (fmessage, "\n+++ Unbekannter Fehler\n"
643 " Abbruch des Programms.\n\n");
644 sl_all = strlen (fmessage);
645
646 sl_alt = strlen (*error_list);
647 *error_list = realloc (*error_list,
648 (sl_alt + sl_all + 1) * sizeof (char));
649 memcpy (*error_list + sl_alt, fmessage, sl_all);
650 *(*error_list + sl_alt + sl_all) = 0x00;
651
652 return;
653 }
654
655
656 if (fil -> art == 'W')
657 sprintf (fmessage, "\n"
658 "+++ Warnung in Funktion %s,\n"
659 " Datei %s,\n"
660 " Zeile %d:\n",
661 funk_name,
662 filename,
663 zeile);
664 else if (fil -> art == 'F' || fil -> art == 'E')
665 sprintf (fmessage, "\n"
666 "+++ Fehler in Funktion %s,\n"
667 " Datei %s,\n"
668 " Zeile %d:\n",
669 funk_name,
670 filename,
671 zeile);
672
673
674 sl_head = strlen (fmessage);
675 memset (fmessage + sl_head, ' ', 4);
676 sl_head += 4;
677 sl_all = sl_head;
678
679 va_start (ap, finf);
680
681 for (cp1 = fil -> message, j = 1, cp4 = cp1;
682 j <= 7; j ++)
683 {
684 cp2 = strchr (cp4, '%');
685
686 if (cp2 == NULL)
687 break;
688
689 if (*(cp2 + 1) == '%')
690 {
691 cp4 = cp2 + 2;
692 j --;
693 continue;
694 }
695
696
697 gefunden = 0;
698
699 cp3 = strpbrk (cp2 + 1, "sdlfe");
700
701 if (cp3 == NULL)
702 {
703 sprintf (fmessage + sl_all, " Fehler in errfunc.c: "
704 "unzulaessige Formatangabe\n");
705 break;
706 }
707
708 if (*(cp3 + 1) != 0x00 && *(cp3 + 1) != '%')
709 cp2 = cp3 + 2;
710 else
711 cp2 = cp3 + 1;
712
713 sl = cp2 - cp1;
714
715 memcpy (zw, cp1, sl);
716 zw [sl] = 0x00;
717
718 switch (*cp3)
719 {
720 /*****************************************************/
721 /* shorts und chars darf es hier aus Syntaxgruenden */
722 /* nicht geben (!?!) */
723 /*****************************************************/
724
725 case 'd':
726 vint = va_arg (ap, int);
727 sprintf (fmessage + sl_all, zw, vint);
728 break;
729
730 case 'l':
731 vlong = va_arg (ap, long);
732 sprintf (fmessage + sl_all, zw, vlong);
733 break;
734
735 case 'e':
736 case 'f':
737 vdouble = va_arg (ap, double);
738 sprintf (fmessage + sl_all, zw, vdouble);
739 break;
740
741 case 's':
742 pchar = va_arg (ap, char *);
743 sprintf (fmessage + sl_all, zw, pchar);
744 break;
745
746 default:
747 break;
748 }
749
750 sl_all = strlen (fmessage);
751
752 cp1 = cp2;
753 cp4 = cp2;
754 }
755
756 va_end (ap);
757
758 sprintf (fmessage + sl_all, "%s", cp1);
759 sl_all = strlen (fmessage);
760
761 sl_alt = strlen (*error_list);
762 *error_list = realloc (*error_list,
763 (sl_alt + sl_all + 1) * sizeof (char));
764 memcpy (*error_list + sl_alt, fmessage, sl_all);
765 *(*error_list + sl_alt + sl_all) = 0x00;
766
767 return;
768 }
769
770
771
772
773