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