Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
statusMessageReporting.cc
Go to the documentation of this file.
1#include <stdio.h>
2#include <stdlib.h>
3#include <string.h>
4#include <stdarg.h>
5
6#ifdef WIN32
7/*#define va_copy(dst, src) ((dst) = (src))*/
8#endif
9
11
12#if defined __cplusplus
13namespace GIDI {
14using namespace GIDI;
15#endif
16
17#define SMR_InitialMessageSize 1024
18#define SMR_IncrementMessageSize 1024
19
20static int smrIsSetup = 0;
21static char smr_mallocFailed[] = "statusMessageReporting could not allocate memory for message";
22static char statusStringOk[] = "Ok", statusStringInfo[] = "Info",
23 statusStringWarning[] = "Warning", statusStringError[] = "Error", statusStringInvalid[] = "Invalid";
24
25static int numberOfRegisteredLibraries = 0;
26static char unknownLibrary[] = "unknownID";
27static char tooManyLibrary[] = "tooManyIDs";
28static char invalidLibrary[] = "invalidID";
29static char errnoLibrary[] = "errnoID";
30static char smrLibrary[] = "statusMessageReporting";
31static char *registeredLibraries[smr_maximumNumberOfRegisteredLibraries];
32
33static statusMessageReport *smr_reportNew( void );
34static int smr_reportInitialize( statusMessageReport *report );
35static void smr_reportRelease( statusMessageReport *report );
36static int smr_setReport( statusMessageReporting *smr, void *userInterface, char const *file, int line, char const *function, int libraryID, int code,
37 enum smr_status status, char const *fmt, va_list *args );
38static int smr_setAllocationFailure( statusMessageReport *report, char const *file, int line, char const *function, char const *fmt, va_list *args );
39/*
40============================================================
41*/
42int smr_setup( void ) {
43
44 int i;
45
46 if( smrIsSetup ) return( 0 );
47 smrIsSetup = 1;
48 for( i = 0; i < smr_maximumNumberOfRegisteredLibraries; ++i ) registeredLibraries[i] = NULL;
49 registeredLibraries[smr_unknownID] = unknownLibrary;
50 ++numberOfRegisteredLibraries;
51 registeredLibraries[smr_tooManyIDs] = tooManyLibrary;
52 ++numberOfRegisteredLibraries;
53 registeredLibraries[smr_invalidID] = invalidLibrary;
54 ++numberOfRegisteredLibraries;
55 registeredLibraries[smr_errnoID] = errnoLibrary;
56 ++numberOfRegisteredLibraries;
57 registeredLibraries[smr_smrID] = smrLibrary;
58 ++numberOfRegisteredLibraries;
59 return( 1 );
60}
61/*
62============================================================
63*/
64int smr_cleanup( void ) {
65
66 int i;
67
68 if( smrIsSetup == 0 ) return( 0 );
69 for( i = smr_smrID + 1; i < numberOfRegisteredLibraries; ++i ) smr_freeMemory( (void **) &(registeredLibraries[i]) );
70 numberOfRegisteredLibraries = 0;
71 smrIsSetup = 0;
72
73 return( 0 );
74}
75/*
76============================================================
77*/
78int smr_registerLibrary( char const *libraryName ) {
79
80 int i;
81
82 if( smrIsSetup == 0 ) return( -1 );
83 if( numberOfRegisteredLibraries == smr_maximumNumberOfRegisteredLibraries ) return( smr_tooManyIDs );
84 for( i = 0; i < numberOfRegisteredLibraries; ++i ) { /* Check if name is already registered. */
85 if( strcmp( libraryName, registeredLibraries[i] ) == 0 ) return( i );
86 }
87 if( ( registeredLibraries[numberOfRegisteredLibraries] = strdup( libraryName ) ) == NULL ) return( -2 );
88 ++numberOfRegisteredLibraries;
89 return( numberOfRegisteredLibraries - 1 );
90}
91/*
92============================================================
93*/
95
96 return( numberOfRegisteredLibraries );
97}
98/*
99============================================================
100*/
101char const *smr_getRegisteredLibrariesName( int ID ) {
102
103 if( ( ID < 0 ) || ( ID >= smr_maximumNumberOfRegisteredLibraries ) ) return( NULL );
104 return( registeredLibraries[ID] );
105}
106/*
107============================================================
108*/
110
111 statusMessageReporting *new_SMR;
112
113 if( ( new_SMR = (statusMessageReporting *) smr_malloc2( smr, sizeof( statusMessageReporting ), 0, "new_SMR" ) ) == NULL ) return( NULL );
114 smr_initialize( new_SMR, verbosity, append );
115 return( new_SMR );
116}
117/*
118============================================================
119*/
120int smr_initialize( statusMessageReporting *smr, enum smr_status verbosity, int append ) {
121
122 if( smr == NULL ) return( 0 );
123 smr->verbosity = verbosity;
124 smr->append = append;
125 smr_reportInitialize( &(smr->report) );
126 return( 0 );
127}
128/*
129============================================================
130*/
132
133 if( smr == NULL ) return( NULL );
134 return( smr_new( NULL, smr->verbosity, smr->append ) );
135}
136/*
137============================================================
138*/
140
141 statusMessageReport *current, *next, *first = smr_firstReport( smr );
142
143 if( smr == NULL ) return;
144 for( current = first; current != NULL; current = next ) {
145 next = smr_nextReport( current );
146 smr_reportRelease( current );
147 if( current != first ) smr_freeMemory( (void **) &current );
148 }
149 smr_initialize( smr, smr->verbosity, smr->append );
150}
151/*
152============================================================
153*/
155
156 if( smr == NULL ) return( NULL );
157 if( *smr != NULL ) {
158 smr_release( *smr );
159 smr_freeMemory( (void **) smr );
160 }
161 return( *smr );
162}
163/*
164============================================================
165*/
166static statusMessageReport *smr_reportNew( void ) {
167
168 statusMessageReport *report;
169
170 if( ( report = (statusMessageReport *) smr_malloc2( NULL, sizeof( statusMessageReport ), 0, "report" ) ) == NULL ) return( NULL );
171 smr_reportInitialize( report );
172 return( report );
173}
174/*
175============================================================
176*/
177static int smr_reportInitialize( statusMessageReport *report ) {
178
179 report->next = NULL;
180 report->status = smr_status_Ok;
181 report->libraryID = smr_unknownID;
182 report->code = smr_codeNULL;
183 report->line = -1;
184 report->fileName[0] = 0;
185 report->function[0] = 0;
186 report->message = NULL;
187 return( 0 );
188}
189/*
190============================================================
191*/
192static void smr_reportRelease( statusMessageReport *report ) {
193
194 if( report->message != NULL ) {
195 if( report->message != smr_mallocFailed ) smr_freeMemory( (void **) &(report->message) );
196 }
197 smr_reportInitialize( report );
198}
199/*
200============================================================
201*/
202static int smr_setReport( statusMessageReporting *smr, void *userInterface, char const *file, int line, char const *function, int libraryID, int code,
203 enum smr_status status, char const *fmt, va_list *args ) {
204
205 char *userMsg;
206 statusMessageReport *report, *next;
207
208 if( smr == NULL ) return( 0 );
209 if( (int) status < (int) smr->verbosity ) return( 0 );
210 if( status == smr_status_Ok ) return( 0 );
211 if( ( smr->report.status != smr_status_Ok ) && smr->append ) {
212 if( ( report = smr_reportNew( ) ) == NULL ) return( smr_setAllocationFailure( NULL, file, line, function, fmt, args ) );
213 for( next = smr_firstReport( smr ); next->next != NULL; next = next->next ) ;
214 next->next = report; }
215 else {
216 if( status <= smr->report.status ) return( 0 );
217 smr_release( smr );
218 report = &(smr->report);
219 }
220 report->status = status;
221 if( ( libraryID < 0 ) || ( libraryID >= numberOfRegisteredLibraries ) ) libraryID = smr_invalidID;
222 report->libraryID = libraryID;
223 report->code = code;
224 report->line = line;
225 if( file != NULL ) strncpy( report->fileName, file, smr_maximumFileNameSize );
227 if( function != NULL ) strncpy( report->function, function, smr_maximumFileNameSize );
229
230 if( ( report->message = smr_vallocateFormatMessage( fmt, args ) ) == NULL ) return( smr_setAllocationFailure( report, file, line, function, fmt, args ) );
231 if( userInterface != NULL ) {
232 if( ( userMsg = (*(smr_userInterface *) userInterface)( (void *) userInterface ) ) != NULL ) {
233 int userSize = (int) strlen( userMsg );
234 if( ( report->message = (char *) smr_realloc2( NULL, report->message, strlen( report->message ) + userSize + 2, "report->message" ) ) == NULL ) {
235 free( userMsg );
236 return( smr_setAllocationFailure( report, file, line, function, fmt, args ) );
237 }
238 strcat( report->message, userMsg );
239 free( userMsg );
240 }
241 }
242 return( 0 );
243}
244/*
245============================================================
246*/
247static int smr_setAllocationFailure( statusMessageReport *report, char const *file, int line, char const *function, char const *fmt, va_list *args ) {
248
249 vfprintf( stderr, fmt, *args );
250 va_end( *args );
251 fprintf( stderr, "\nAt line %d of %s in function %s\n", line, file, function );
252 if( report != NULL ) {
253 report->status = smr_status_Error;
254 report->message = (char *) smr_mallocFailed;
255 return( 1 );
256 }
257 return( -1 );
258}
259/*
260============================================================
261*/
262int smr_setReportInfo( statusMessageReporting *smr, void *userInterface, char const *file, int line, char const *function, int libraryID, int code, char const *fmt, ... ) {
263
264 int status;
265 va_list args;
266
267 va_start( args, fmt );
268 status = smr_setReport( smr, userInterface, file, line, function, libraryID, code, smr_status_Info, fmt, &args );
269 va_end( args );
270 return( status );
271}
272/*
273============================================================
274*/
275int smr_vsetReportInfo( statusMessageReporting *smr, void *userInterface, char const *file, int line, char const *function, int libraryID, int code, char const *fmt, va_list *args ) {
276
277 return( smr_setReport( smr, userInterface, file, line, function, libraryID, code, smr_status_Info, fmt, args ) );
278}
279/*
280============================================================
281*/
282int smr_setReportWarning( statusMessageReporting *smr, void *userInterface, char const *file, int line, char const *function, int libraryID, int code, char const *fmt, ... ) {
283
284 int status;
285 va_list args;
286
287 va_start( args, fmt );
288 status = smr_setReport( smr, userInterface, file, line, function, libraryID, code, smr_status_Warning, fmt, &args );
289 va_end( args );
290 return( status );
291}
292/*
293============================================================
294*/
295int smr_vsetReportWarning( statusMessageReporting *smr, void *userInterface, char const *file, int line, char const *function, int libraryID, int code, char const *fmt, va_list *args ) {
296
297 return( smr_setReport( smr, userInterface, file, line, function, libraryID, code, smr_status_Warning, fmt, args ) );
298}
299/*
300============================================================
301*/
302int smr_setReportError( statusMessageReporting *smr, void *userInterface, char const *file, int line, char const *function, int libraryID, int code, char const *fmt, ... ) {
303
304 int status;
305 va_list args;
306
307 va_start( args, fmt );
308 status = smr_setReport( smr, userInterface, file, line, function, libraryID, code, smr_status_Error, fmt, &args );
309 va_end( args );
310 return( status );
311}
312/*
313============================================================
314*/
315int smr_vsetReportError( statusMessageReporting *smr, void *userInterface, char const *file, int line, char const *function, int libraryID, int code, char const *fmt, va_list *args ) {
316
317 return( smr_setReport( smr, userInterface, file, line, function, libraryID, code, smr_status_Error, fmt, args ) );
318}
319/*
320============================================================
321*/
323
324 enum smr_status status = smr_status_Ok;
325 statusMessageReport *report;
326
327 if( smr == NULL ) return( smr_status_Ok );
328 for( report = smr_firstReport( smr ); report != NULL; report = smr_nextReport( report ) ) if( report->status > status ) status = report->status;
329 return( status );
330}
331/*
332============================================================
333*/
335
336 return( smr_highestStatus( smr ) == smr_status_Ok );
337}
338/*
339============================================================
340*/
342
343 return( smr_highestStatus( smr ) == smr_status_Info );
344}
345/*
346============================================================
347*/
349
350 return( smr_highestStatus( smr ) == smr_status_Warning );
351}
352/*
353============================================================
354*/
356
357 return( smr_highestStatus( smr ) == smr_status_Error );
358}
359/*
360============================================================
361*/
363
364 enum smr_status status = smr_highestStatus( smr );
365
366 return( ( status == smr_status_Warning ) || ( status == smr_status_Error ) );
367}
368/*
369============================================================
370*/
372
373 if( report == NULL ) return( 0 );
374 return( report->status == smr_status_Ok );
375}
376/*
377============================================================
378*/
380
381 if( report == NULL ) return( 0 );
382 return( report->status == smr_status_Info );
383}
384/*
385============================================================
386*/
388
389 if( report == NULL ) return( 0 );
390 return( report->status == smr_status_Warning );
391}
392/*
393============================================================
394*/
396
397 if( report == NULL ) return( 0 );
398 return( report->status == smr_status_Error );
399}
400/*
401============================================================
402*/
404
405 if( report == NULL ) return( 0 );
406 return( ( report->status == smr_status_Warning ) || ( report->status == smr_status_Error ) );
407}
408/*
409============================================================
410*/
412
413 int n = 0;
414 statusMessageReport *report;
415
416 if( smr == NULL ) return( 0 );
417 if( smr->report.status == smr_status_Ok ) return( 0 );
418 for( report = smr_firstReport( smr ); report != NULL; report = smr_nextReport( report ) ) ++n;
419 return( n );
420}
421/*
422============================================================
423*/
425
426 if( smr == NULL ) return( NULL );
427 if( smr->report.status == smr_status_Ok ) return( NULL );
428 return( &(smr->report) );
429}
430/*
431============================================================
432*/
434
435 if( report == NULL ) return( NULL );
436 return( report->next );
437}
438/*
439============================================================
440*/
442
443 if( smr == NULL ) return( smr_status_Ok );
444 return( smr->verbosity );
445}
446/*
447============================================================
448*/
450
451 if( smr == NULL ) return( 0 );
452 return( smr->append );
453}
454/*
455============================================================
456*/
458
459 if( report == NULL ) return( 0 );
460 return( report->libraryID );
461}
462/*
463============================================================
464*/
466
467 if( report == NULL ) return( -1 );
468 return( report->code );
469}
470/*
471============================================================
472*/
474
475 if( report == NULL ) return( -1 );
476 return( report->line );
477}
478/*
479============================================================
480*/
481char const *smr_getFile( statusMessageReport *report ) {
482
483 if( report == NULL ) return( NULL );
484 return( report->fileName );
485}
486/*
487============================================================
488*/
489char const *smr_getFunction( statusMessageReport *report ) {
490
491 if( report == NULL ) return( NULL );
492 return( report->function );
493}
494/*
495============================================================
496*/
497char const *smr_getMessage( statusMessageReport *report ) {
498
499 if( report == NULL ) return( NULL );
500 return( report->message );
501}
502/*
503============================================================
504*/
506
507 if( report == NULL ) return( NULL );
508 if( report->status == smr_status_Ok ) return( NULL );
509 return( smr_allocateFormatMessage( report->message ) );
510}
511/*
512============================================================
513*/
515
516 if( report == NULL ) return( NULL );
517 if( report->status == smr_status_Ok ) return( NULL );
518 return( smr_allocateFormatMessage( "%s\nAt line %d of %s in function %s", report->message, report->line, report->fileName, report->function ) );
519}
520/*
521============================================================
522*/
523void smr_print( statusMessageReporting *smr, int clear ) {
524
525 smr_write( smr, stdout, clear );
526}
527/*
528============================================================
529*/
530void smr_write( statusMessageReporting *smr, FILE *f, int clear ) {
531
532 statusMessageReport *report;
533
534 if( smr == NULL ) return;
535 for( report = smr_firstReport( smr ); report != NULL; report = smr_nextReport( report ) ) smr_reportWrite( report, f );
536 if( clear ) smr_release( smr );
537}
538/*
539============================================================
540*/
542
543 smr_reportWrite( report, stderr );
544}
545/*
546============================================================
547*/
548void smr_reportWrite( statusMessageReport *report, FILE *f ) {
549
550 if( report->message != NULL ) fprintf( f, "%s\nAt line %d of %s in function %s\n", report->message, report->line, report->fileName, report->function );
551}
552/*
553============================================================
554*/
555char const *smr_statusToString( enum smr_status status ) {
556
557 switch( status ) {
558 case smr_status_Ok : return( statusStringOk );
559 case smr_status_Info : return( statusStringInfo );
560 case smr_status_Warning : return( statusStringWarning );
561 case smr_status_Error : return( statusStringError );
562 }
563 return( statusStringInvalid );
564}
565/*
566============================================================
567*/
568char *smr_allocateFormatMessage( char const *fmt, ... ) {
569
570 char *s;
571 va_list args;
572
573 va_start( args, fmt );
574 s = smr_vallocateFormatMessage( fmt, &args );
575 va_end( args );
576 return( s );
577}
578/*
579============================================================
580*/
581char *smr_vallocateFormatMessage( char const *fmt, va_list *args ) {
582
583 int n, size = SMR_InitialMessageSize;
584 char buffer[SMR_InitialMessageSize], *message = buffer;
585 va_list args_;
586
587 while( 1 ) {
588 va_copy( args_, *args );
589 n = vsnprintf( message, size, fmt, args_ );
590 va_end( args_ );
591 if( ( n > -1 ) && ( n < size ) ) break;
592 if( n > -1 ) { /* glibc 2.1 */
593 size = n + 3; }
594 else { /* glibc 2.0 */
596 }
597 if( message == buffer ) message = NULL;
598 if( ( message = (char *) realloc( message, size ) ) == NULL ) return( NULL );
599 } // Loop checking, 11.06.2015, T. Koi
600 if( message == buffer ) {
601 if( ( message = (char *) malloc( n + 1 ) ) == NULL ) return( NULL );
602 strcpy( message, buffer ); }
603 else {
604 if( ( message = (char *) realloc( message, n + 1 ) ) == NULL ) return( NULL );
605 }
606 return( message );
607}
608/*
609============================================================
610*/
611void *smr_malloc( statusMessageReporting *smr, size_t size, int zero, char const *forItem, char const *file, int line, char const *function ) {
612
613 void *p = smr_realloc( smr, NULL, size, forItem, file, line, function );
614 size_t i;
615 char *c;
616 long long *l;
617
618 if( ( p != NULL ) && zero ) {
619 for( i = 0, l = (long long *) p; i < size / sizeof( long long ); i++, l++ ) *l = 0;
620 for( i *= sizeof( long long ), c = (char *) l; i < size; i++, c++ ) *c = 0;
621 }
622
623 return( p );
624}
625/*
626============================================================
627*/
628void *smr_realloc( statusMessageReporting *smr, void *pOld, size_t size, char const *forItem, char const *file, int line, char const *function ) {
629
630 void *p = realloc( pOld, size );
631
632 if( ( p == NULL ) && ( smr != NULL ) ) {
633 smr_setReportError( smr, NULL, file, line, function, smr_smrID, -1, " smr_realloc: failed to realloc size = %z for variable %s\n", size, forItem );
634 }
635 return( p );
636}
637/*
638============================================================
639*/
640void *smr_freeMemory( void **p ) {
641
642 if( p == NULL ) return( NULL );
643 if( *p != NULL ) {
644 free( *p );
645 *p = NULL;
646 }
647 return( *p );
648}
649/*
650============================================================
651*/
652char *smr_allocateCopyString( statusMessageReporting *smr, char const *s, char const *forItem, char const *file, int line, char const *function ) {
653/*
654* User must free returned string.
655*/
656 char *c = strdup( s );
657
658 if( c == NULL ) smr_setReportError( smr, NULL, file, line, function, smr_smrID, -1, " smr_allocateCopyString: strdup failed for strlen( s ) = %z for variable %s",
659 strlen( s ), forItem );
660 return( c );
661}
662/*
663============================================================
664*/
665char *smr_allocateCopyStringN( statusMessageReporting *smr, char const *s, size_t n, char const *forItem, char const *file, int line, char const *function ) {
666/*
667* User must free returned string.
668*/
669 size_t l = strlen( s );
670 char *c;
671
672 if( l > n ) l = n;
673 if( ( c = (char *) smr_malloc( smr, l + 1, 0, forItem, file, line, function ) ) != NULL ) {
674 strncpy( c, s, n );
675 c[l] = 0;
676 }
677/*
678 c = strndup( s, l ); # Not standard on enough systems.
679 if( c != NULL ) {
680 c[l] = 0; }
681 else {
682 smr_setReportError( smr, NULL, file, line, function, smr_smrID, -1, " smr_allocateCopyStringN: strndup failed for strlen( s ) = %z for variable %s",
683 strlen( s ), forItem );
684 }
685*/
686 return( c );
687}
688
689#if defined __cplusplus
690}
691#endif
G4double(*)(G4double) function
#define SMR_InitialMessageSize
#define SMR_IncrementMessageSize
int smr_vsetReportError(statusMessageReporting *smr, void *userInterface, char const *file, int line, char const *function, int libraryID, int code, char const *fmt, va_list *args)
int smr_registerLibrary(char const *libraryName)
char * smr_copyMessage(statusMessageReport *report)
int smr_isInfo(statusMessageReporting *smr)
int smr_initialize(statusMessageReporting *smr, enum smr_status verbosity, int append)
char * smr_allocateCopyString(statusMessageReporting *smr, char const *s, char const *forItem, char const *file, int line, char const *function)
char * smr_vallocateFormatMessage(char const *fmt, va_list *args)
int smr_isError(statusMessageReporting *smr)
int smr_setup(void)
int smr_isReportOk(statusMessageReport *report)
char * smr_copyFullMessage(statusMessageReport *report)
int smr_isReportWarningOrError(statusMessageReport *report)
int smr_getAppend(statusMessageReporting *smr)
statusMessageReport * smr_nextReport(statusMessageReport *report)
int smr_isReportWarning(statusMessageReport *report)
#define smr_maximumFileNameSize
char const * smr_getFile(statusMessageReport *report)
#define smr_realloc2(smr, old, size, forItem)
statusMessageReporting * smr_new(statusMessageReporting *smr, enum smr_status verbosity, int append)
#define smr_tooManyIDs
int smr_numberOfReports(statusMessageReporting *smr)
void * smr_realloc(statusMessageReporting *smr, void *pOld, size_t size, char const *forItem, char const *file, int line, char const *function)
int smr_isWarningOrError(statusMessageReporting *smr)
statusMessageReporting * smr_clone(statusMessageReporting *smr)
statusMessageReport * smr_firstReport(statusMessageReporting *smr)
enum smr_status smr_highestStatus(statusMessageReporting *smr)
int smr_getLibraryID(statusMessageReport *report)
int smr_vsetReportInfo(statusMessageReporting *smr, void *userInterface, char const *file, int line, char const *function, int libraryID, int code, char const *fmt, va_list *args)
#define smr_errnoID
void * smr_free(statusMessageReporting **smr)
int smr_setReportWarning(statusMessageReporting *smr, void *userInterface, char const *file, int line, char const *function, int libraryID, int code, char const *fmt,...)
void smr_print(statusMessageReporting *smr, int clear)
char *(* smr_userInterface)(void *userData)
int smr_isReportInfo(statusMessageReport *report)
char const * smr_getMessage(statusMessageReport *report)
#define smr_smrID
int smr_vsetReportWarning(statusMessageReporting *smr, void *userInterface, char const *file, int line, char const *function, int libraryID, int code, char const *fmt, va_list *args)
char const * smr_statusToString(enum smr_status status)
void * smr_freeMemory(void **p)
char const * smr_getRegisteredLibrariesName(int ID)
int smr_isWarning(statusMessageReporting *smr)
void smr_write(statusMessageReporting *smr, FILE *f, int clear)
int smr_getLine(statusMessageReport *report)
void smr_reportWrite(statusMessageReport *report, FILE *f)
void * smr_malloc(statusMessageReporting *smr, size_t size, int zero, char const *forItem, char const *file, int line, char const *function)
int smr_setReportInfo(statusMessageReporting *smr, void *userInterface, char const *file, int line, char const *function, int libraryID, int code, char const *fmt,...)
int smr_setReportError(statusMessageReporting *smr, void *userInterface, char const *file, int line, char const *function, int libraryID, int code, char const *fmt,...)
enum smr_status smr_getVerbosity(statusMessageReporting *smr)
int smr_cleanup(void)
void smr_release(statusMessageReporting *smr)
int smr_isOk(statusMessageReporting *smr)
#define smr_maximumNumberOfRegisteredLibraries
void smr_reportPrint(statusMessageReport *report)
#define smr_codeNULL
char * smr_allocateFormatMessage(char const *fmt,...)
char * smr_allocateCopyStringN(statusMessageReporting *smr, char const *s, size_t n, char const *forItem, char const *file, int line, char const *function)
int smr_numberOfRegisteredLibraries(void)
int smr_getCode(statusMessageReport *report)
@ smr_status_Warning
@ smr_status_Error
@ smr_status_Info
@ smr_status_Ok
char const * smr_getFunction(statusMessageReport *report)
#define smr_malloc2(smr, size, zero, forItem)
#define smr_unknownID
#define smr_invalidID
int smr_isReportError(statusMessageReport *report)
Definition: inftrees.h:24
char function[smr_maximumFileNameSize+1]
struct statusMessageReport * next
char fileName[smr_maximumFileNameSize+1]
statusMessageReport report