17#define SMR_InitialMessageSize 1024
18#define SMR_IncrementMessageSize 1024
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";
25static int numberOfRegisteredLibraries = 0;
26static char unknownLibrary[] =
"unknownID";
27static char tooManyLibrary[] =
"tooManyIDs";
28static char invalidLibrary[] =
"invalidID";
29static char errnoLibrary[] =
"errnoID";
30static char smrLibrary[] =
"statusMessageReporting";
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 );
49 if( smrIsSetup )
return( 0 );
53 ++numberOfRegisteredLibraries;
55 ++numberOfRegisteredLibraries;
57 ++numberOfRegisteredLibraries;
59 ++numberOfRegisteredLibraries;
60 registeredLibraries[
smr_smrID] = smrLibrary;
61 ++numberOfRegisteredLibraries;
71 if( smrIsSetup == 0 )
return( 0 );
72 for( i =
smr_smrID + 1; i < numberOfRegisteredLibraries; ++i )
smr_freeMemory( (
void **) &(registeredLibraries[i]) );
73 numberOfRegisteredLibraries = 0;
86 for( i = 0; i < numberOfRegisteredLibraries; ++i ) {
87 if( strcmp( libraryName, registeredLibraries[i] ) == 0 )
return( i );
90 if( ( registeredLibraries[numberOfRegisteredLibraries] = strdup( libraryName ) ) == NULL )
return( -1 );
91 ++numberOfRegisteredLibraries;
92 return( numberOfRegisteredLibraries - 1 );
99 return( numberOfRegisteredLibraries );
107 return( registeredLibraries[ID] );
125 if( smr == NULL )
return( 0 );
127 smr_reportInitialize( &(smr->
report) );
135 if( smr == NULL )
return( NULL );
145 if( smr == NULL )
return;
146 for( current = first; current != NULL; current = next ) {
148 smr_reportRelease( current );
158 if( smr == NULL )
return( NULL );
173 smr_reportInitialize( report );
196 if( report->
message != NULL ) {
199 smr_reportInitialize( report );
205 enum smr_status status,
char const *fmt, va_list *args ) {
210 if( smr == NULL )
return( 0 );
211 if( (
int) status < (
int) smr->
verbosity )
return( 0 );
216 if( ( report = smr_reportNew( ) ) == NULL )
return( smr_setAllocationFailure( NULL, file, line,
function, fmt, args ) );
217 for( next = smr_firstReport2( smr ); next->
next != NULL; next = next->
next );
221 if( ( libraryID < 0 ) || ( libraryID >= numberOfRegisteredLibraries ) ) libraryID =
smr_invalidID;
231 if( userInterface != NULL ) {
232 if( ( userMsg = (*(
smr_userInterface *) userInterface)( (
void *) userInterface ) ) != NULL ) {
233 int userSize = (int) strlen( userMsg );
236 return( smr_setAllocationFailure( report, file, line,
function, fmt, args ) );
238 strcat( report->
message, userMsg );
247static int smr_setAllocationFailure(
statusMessageReport *report,
char const *file,
int line,
char const *
function,
char const *fmt, va_list *args ) {
249 vfprintf( stderr, fmt, *args );
251 fprintf( stderr,
"\n At line %d of %s in function %s\n", line, file,
function );
252 if( report != NULL ) {
254 report->
message = (
char *) smr_mallocFailed;
267 va_start( args, fmt );
287 va_start( args, fmt );
307 va_start( args, fmt );
373 if( report == NULL )
return( 0 );
381 if( report == NULL )
return( 0 );
389 if( report == NULL )
return( 0 );
397 if( report == NULL )
return( 0 );
405 if( report == NULL )
return( 0 );
416 if( smr == NULL )
return( 0 );
433 if( smr == NULL )
return( NULL );
449 if( report == NULL )
return( NULL );
450 return( report->
next );
465 if( report == NULL )
return( 0 );
473 if( report == NULL )
return( -1 );
474 return( report->
code );
481 if( report == NULL )
return( -1 );
482 return( report->
line );
489 if( report == NULL )
return( NULL );
497 if( report == NULL )
return( NULL );
505 if( report == NULL )
return( NULL );
513 if( report == NULL )
return( NULL );
522 if( report == NULL )
return( NULL );
538 if( smr == NULL )
return;
539 fprintf( f,
"======= Status message reports =======\n" );
548 if( report == NULL )
return;
578 return( statusStringInvalid );
588 va_start( args, fmt );
603 va_copy( args_, *args );
604 n = vsnprintf( message, size, fmt, args_ );
606 if( ( n > -1 ) && ( n < size ) )
break;
612 if( message == buffer ) message = NULL;
613 if( ( message = (
char *) realloc( message, size ) ) == NULL )
return( NULL );
615 if( message == buffer ) {
616 if( ( message = (
char *)
malloc( n + 1 ) ) == NULL )
return( NULL );
617 strcpy( message, buffer ); }
620 if( ( message = (
char *) realloc( message, n + 1 ) ) == NULL ) {
621 if( old != NULL )
free( old );
636 if( ( p != NULL ) && zero ) {
637 for( i = 0, l = (
long long *) p; i < size /
sizeof(
long long ); i++, l++ ) *l = 0;
638 for( i *=
sizeof(
long long ), c = (
char *) l; i < size; i++, c++ ) *c = 0;
648 void *p = realloc( pOld, size );
650 if( ( p == NULL ) && ( smr != NULL ) ) {
660 if( p == NULL )
return( NULL );
674 char *c = strdup( s );
677 strlen( s ), forItem );
687 size_t l = strlen( s );
691 if( ( c = (
char *)
smr_malloc( smr, l + 1, 0, forItem, file, line,
function ) ) != NULL ) {
G4double(*)(G4double) function
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)
statusMessageReporting * smr_clone(statusMessageReporting const *smr)
int smr_registerLibrary(char const *libraryName)
char * smr_allocateCopyString(statusMessageReporting *smr, char const *s, char const *forItem, char const *file, int line, char const *function)
int smr_getLine(statusMessageReport const *report)
char const * smr_getRegisteredLibrarysName(int ID)
int smr_isReportInfo(statusMessageReport const *report)
char * smr_vallocateFormatMessage(char const *fmt, va_list *args)
int smr_isReportWarning(statusMessageReport const *report)
char * smr_copyMessage(statusMessageReport const *report)
int smr_getLibraryID(statusMessageReport const *report)
void * smr_realloc(statusMessageReporting *smr, void *pOld, size_t size, char const *forItem, char const *file, int line, char const *function)
char const * smr_getFunction(statusMessageReport const *report)
void smr_reportWrite(statusMessageReport const *report, FILE *f)
int smr_getCode(statusMessageReport const *report)
int smr_initialize(statusMessageReporting *smr, enum smr_status verbosity)
statusMessageReport const * smr_firstReport(statusMessageReporting const *smr)
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)
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,...)
char const * smr_getMessage(statusMessageReport const *report)
void smr_print(statusMessageReporting *smr, int clear)
char const * smr_getFile(statusMessageReport const *report)
int smr_isInfo(statusMessageReporting const *smr)
enum smr_status smr_highestStatus(statusMessageReporting const *smr)
#define SMR_InitialMessageSize
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)
int smr_numberOfReports(statusMessageReporting const *smr)
void * smr_freeMemory(void **p)
int smr_isReportWarningOrError(statusMessageReport const *report)
void smr_write(statusMessageReporting *smr, FILE *f, int clear)
void * smr_malloc(statusMessageReporting *smr, size_t size, int zero, char const *forItem, char const *file, int line, char const *function)
void smr_reportPrint(statusMessageReport const *report)
enum smr_status smr_getVerbosity(statusMessageReporting const *smr)
int smr_setReportInfo(statusMessageReporting *smr, void *userInterface, char const *file, int line, char const *function, int libraryID, int code, char const *fmt,...)
int smr_isWarningOrError(statusMessageReporting const *smr)
int smr_setReportError(statusMessageReporting *smr, void *userInterface, char const *file, int line, char const *function, int libraryID, int code, char const *fmt,...)
statusMessageReport * smr_nextReport2(statusMessageReport const *report)
int smr_isReportError(statusMessageReport const *report)
statusMessageReporting * smr_new(statusMessageReporting *smr, enum smr_status verbosity)
void smr_release(statusMessageReporting *smr)
int smr_isOk(statusMessageReporting const *smr)
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)
statusMessageReport const * smr_nextReport(statusMessageReport const *report)
char * smr_copyFullMessage(statusMessageReport const *report)
int smr_isReportOk(statusMessageReport const *report)
int smr_isWarning(statusMessageReporting const *smr)
int smr_isError(statusMessageReporting const *smr)
char * smr_vallocateFormatMessage(char const *fmt, va_list *args)
#define smr_maximumFileNameSize
#define smr_realloc2(smr, old, size, forItem)
char *(* smr_userInterface)(void *userData)
#define smr_maximumNumberOfRegisteredLibraries
#define smr_malloc2(smr, size, zero, forItem)
#define smr_codeMemoryAllocating
char function[smr_maximumFileNameSize+1]
struct statusMessageReport * next
char fileName[smr_maximumFileNameSize+1]
enum smr_status verbosity
statusMessageReport report