Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/processes/hadronic/models/lend/src/statusMessageReporting.cc

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

Diff markup

Differences between /processes/hadronic/models/lend/src/statusMessageReporting.cc (Version 11.3.0) and /processes/hadronic/models/lend/src/statusMessageReporting.cc (Version 8.1.p2)


  1 #include <stdio.h>                                  1 
  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                                                   
 10 #include "statusMessageReporting.h"               
 11                                                   
 12 #if defined __cplusplus                           
 13 namespace GIDI {                                  
 14 using namespace GIDI;                             
 15 #endif                                            
 16                                                   
 17 #define SMR_InitialMessageSize 1024               
 18 #define SMR_IncrementMessageSize 1024             
 19                                                   
 20 static int smrIsSetup = 0;                        
 21 static char smr_mallocFailed[] = "statusMessag    
 22 static char statusStringOk[] = "Ok",  statusSt    
 23     statusStringWarning[] = "Warning", statusS    
 24                                                   
 25 static int numberOfRegisteredLibraries = 0;       
 26 static char unknownLibrary[] = "unknownID";       
 27 static char tooManyLibrary[] = "tooManyIDs";      
 28 static char invalidLibrary[] = "invalidID";       
 29 static char errnoLibrary[] = "errnoID";           
 30 static char smrLibrary[] = "statusMessageRepor    
 31 static char *registeredLibraries[smr_maximumNu    
 32                                                   
 33 static statusMessageReport *smr_reportNew( voi    
 34 static int smr_reportInitialize( statusMessage    
 35 static void smr_reportRelease( statusMessageRe    
 36 static int smr_setReport( statusMessageReporti    
 37     enum smr_status status, char const *fmt, v    
 38 static int smr_setAllocationFailure( statusMes    
 39 /*                                                
 40 ==============================================    
 41 */                                                
 42 int smr_setup( void ) {                           
 43                                                   
 44     int i;                                        
 45                                                   
 46     if( smrIsSetup ) return( 0 );                 
 47     smrIsSetup = 1;                               
 48     for( i = 0; i < smr_maximumNumberOfRegiste    
 49     registeredLibraries[smr_unknownID] = unkno    
 50     ++numberOfRegisteredLibraries;                
 51     registeredLibraries[smr_tooManyIDs] = tooM    
 52     ++numberOfRegisteredLibraries;                
 53     registeredLibraries[smr_invalidID] = inval    
 54     ++numberOfRegisteredLibraries;                
 55     registeredLibraries[smr_errnoID] = errnoLi    
 56     ++numberOfRegisteredLibraries;                
 57     registeredLibraries[smr_smrID] = smrLibrar    
 58     ++numberOfRegisteredLibraries;                
 59     return( 1 );                                  
 60 }                                                 
 61 /*                                                
 62 ==============================================    
 63 */                                                
 64 int smr_cleanup( void ) {                         
 65                                                   
 66     int i;                                        
 67                                                   
 68     if( smrIsSetup == 0 ) return( 0 );            
 69     for( i = smr_smrID + 1; i < numberOfRegist    
 70     numberOfRegisteredLibraries = 0;              
 71     smrIsSetup = 0;                               
 72                                                   
 73     return( 0 );                                  
 74 }                                                 
 75 /*                                                
 76 ==============================================    
 77 */                                                
 78 int smr_registerLibrary( char const *libraryNa    
 79                                                   
 80     int i;                                        
 81                                                   
 82     if( smrIsSetup == 0 ) return( -1 );           
 83     if( numberOfRegisteredLibraries == smr_max    
 84     for( i = 0; i < numberOfRegisteredLibrarie    
 85         if( strcmp( libraryName, registeredLib    
 86     }                                             
 87     if( ( registeredLibraries[numberOfRegister    
 88     ++numberOfRegisteredLibraries;                
 89     return( numberOfRegisteredLibraries - 1 );    
 90 }                                                 
 91 /*                                                
 92 ==============================================    
 93 */                                                
 94 int smr_numberOfRegisteredLibraries( void ) {     
 95                                                   
 96     return( numberOfRegisteredLibraries );        
 97 }                                                 
 98 /*                                                
 99 ==============================================    
100 */                                                
101 char const *smr_getRegisteredLibrariesName( in    
102                                                   
103     if( ( ID < 0 ) || ( ID >= smr_maximumNumbe    
104     return( registeredLibraries[ID] );            
105 }                                                 
106 /*                                                
107 ==============================================    
108 */                                                
109 statusMessageReporting *smr_new( statusMessage    
110                                                   
111     statusMessageReporting *new_SMR;              
112                                                   
113     if( ( new_SMR = (statusMessageReporting *)    
114     smr_initialize( new_SMR, verbosity, append    
115     return( new_SMR );                            
116 }                                                 
117 /*                                                
118 ==============================================    
119 */                                                
120 int smr_initialize( statusMessageReporting *sm    
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 */                                                
131 statusMessageReporting *smr_clone( statusMessa    
132                                                   
133     if( smr == NULL ) return( NULL );             
134     return( smr_new( NULL, smr->verbosity, smr    
135 }                                                 
136 /*                                                
137 ==============================================    
138 */                                                
139 void smr_release( statusMessageReporting *smr     
140                                                   
141     statusMessageReport *current, *next, *firs    
142                                                   
143     if( smr == NULL ) return;                     
144     for( current = first; current != NULL; cur    
145         next = smr_nextReport( current );         
146         smr_reportRelease( current );             
147         if( current != first ) smr_freeMemory(    
148     }                                             
149     smr_initialize( smr, smr->verbosity, smr->    
150 }                                                 
151 /*                                                
152 ==============================================    
153 */                                                
154 void *smr_free( statusMessageReporting **smr )    
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 */                                                
166 static statusMessageReport *smr_reportNew( voi    
167                                                   
168     statusMessageReport *report;                  
169                                                   
170     if( ( report = (statusMessageReport *) smr    
171     smr_reportInitialize( report );               
172     return( report );                             
173 }                                                 
174 /*                                                
175 ==============================================    
176 */                                                
177 static int smr_reportInitialize( statusMessage    
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 */                                                
192 static void smr_reportRelease( statusMessageRe    
193                                                   
194     if( report->message != NULL ) {               
195         if( report->message != smr_mallocFaile    
196     }                                             
197     smr_reportInitialize( report );               
198 }                                                 
199 /*                                                
200 ==============================================    
201 */                                                
202 static int smr_setReport( statusMessageReporti    
203     enum smr_status status, char const *fmt, v    
204                                                   
205     char *userMsg;                                
206     statusMessageReport *report, *next;           
207                                                   
208     if( smr == NULL ) return( 0 );                
209     if( (int) status < (int) smr->verbosity )     
210     if( status == smr_status_Ok ) return( 0 );    
211     if( ( smr->report.status != smr_status_Ok     
212         if( ( report = smr_reportNew( ) ) == N    
213         for( next = smr_firstReport( smr ); ne    
214         next->next = report; }                    
215     else {                                        
216         if( status <= smr->report.status ) ret    
217         smr_release( smr );                       
218         report = &(smr->report);                  
219     }                                             
220     report->status = status;                      
221     if( ( libraryID < 0 ) || ( libraryID >= nu    
222     report->libraryID = libraryID;                
223     report->code = code;                          
224     report->line = line;                          
225     if( file != NULL ) strncpy( report->fileNa    
226     report->fileName[smr_maximumFileNameSize]     
227     if( function != NULL ) strncpy( report->fu    
228     report->function[smr_maximumFileNameSize]     
229                                                   
230     if( ( report->message = smr_vallocateForma    
231     if( userInterface != NULL ) {                 
232         if( ( userMsg = (*(smr_userInterface *    
233             int userSize = (int) strlen( userM    
234             if( ( report->message = (char *) s    
235                 free( userMsg );                  
236                 return( smr_setAllocationFailu    
237             }                                     
238             strcat( report->message, userMsg )    
239             free( userMsg );                      
240         }                                         
241     }                                             
242     return( 0 );                                  
243 }                                                 
244 /*                                                
245 ==============================================    
246 */                                                
247 static int smr_setAllocationFailure( statusMes    
248                                                   
249     vfprintf( stderr, fmt, *args );               
250     va_end( *args );                              
251     fprintf( stderr, "\nAt line %d of %s in fu    
252     if( report != NULL ) {                        
253         report->status = smr_status_Error;        
254         report->message = (char *) smr_mallocF    
255         return( 1 );                              
256     }                                             
257     return( -1 );                                 
258 }                                                 
259 /*                                                
260 ==============================================    
261 */                                                
262 int smr_setReportInfo( statusMessageReporting     
263                                                   
264     int status;                                   
265     va_list args;                                 
266                                                   
267     va_start( args, fmt );                        
268     status = smr_setReport( smr, userInterface    
269     va_end( args );                               
270     return( status );                             
271 }                                                 
272 /*                                                
273 ==============================================    
274 */                                                
275 int smr_vsetReportInfo( statusMessageReporting    
276                                                   
277     return( smr_setReport( smr, userInterface,    
278 }                                                 
279 /*                                                
280 ==============================================    
281 */                                                
282 int smr_setReportWarning( statusMessageReporti    
283                                                   
284     int status;                                   
285     va_list args;                                 
286                                                   
287     va_start( args, fmt );                        
288     status = smr_setReport( smr, userInterface    
289     va_end( args );                               
290     return( status );                             
291 }                                                 
292 /*                                                
293 ==============================================    
294 */                                                
295 int smr_vsetReportWarning( statusMessageReport    
296                                                   
297     return( smr_setReport( smr, userInterface,    
298 }                                                 
299 /*                                                
300 ==============================================    
301 */                                                
302 int smr_setReportError( statusMessageReporting    
303                                                   
304     int status;                                   
305     va_list args;                                 
306                                                   
307     va_start( args, fmt );                        
308     status = smr_setReport( smr, userInterface    
309     va_end( args );                               
310     return( status );                             
311 }                                                 
312 /*                                                
313 ==============================================    
314 */                                                
315 int smr_vsetReportError( statusMessageReportin    
316                                                   
317     return( smr_setReport( smr, userInterface,    
318 }                                                 
319 /*                                                
320 ==============================================    
321 */                                                
322 enum smr_status smr_highestStatus( statusMessa    
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 ); repo    
329     return( status );                             
330 }                                                 
331 /*                                                
332 ==============================================    
333 */                                                
334 int smr_isOk( statusMessageReporting *smr ) {     
335                                                   
336     return( smr_highestStatus( smr ) == smr_st    
337 }                                                 
338 /*                                                
339 ==============================================    
340 */                                                
341 int smr_isInfo( statusMessageReporting *smr )     
342                                                   
343     return( smr_highestStatus( smr ) == smr_st    
344 }                                                 
345 /*                                                
346 ==============================================    
347 */                                                
348 int smr_isWarning( statusMessageReporting *smr    
349                                                   
350     return( smr_highestStatus( smr ) == smr_st    
351 }                                                 
352 /*                                                
353 ==============================================    
354 */                                                
355 int smr_isError( statusMessageReporting *smr )    
356                                                   
357     return( smr_highestStatus( smr ) == smr_st    
358 }                                                 
359 /*                                                
360 ==============================================    
361 */                                                
362 int smr_isWarningOrError( statusMessageReporti    
363                                                   
364     enum smr_status status = smr_highestStatus    
365                                                   
366     return( ( status == smr_status_Warning ) |    
367 }                                                 
368 /*                                                
369 ==============================================    
370 */                                                
371 int smr_isReportOk( statusMessageReport *repor    
372                                                   
373     if( report == NULL ) return( 0 );             
374     return( report->status == smr_status_Ok );    
375 }                                                 
376 /*                                                
377 ==============================================    
378 */                                                
379 int smr_isReportInfo( statusMessageReport *rep    
380                                                   
381     if( report == NULL ) return( 0 );             
382     return( report->status == smr_status_Info     
383 }                                                 
384 /*                                                
385 ==============================================    
386 */                                                
387 int smr_isReportWarning( statusMessageReport *    
388                                                   
389     if( report == NULL ) return( 0 );             
390     return( report->status == smr_status_Warni    
391 }                                                 
392 /*                                                
393 ==============================================    
394 */                                                
395 int smr_isReportError( statusMessageReport *re    
396                                                   
397     if( report == NULL ) return( 0 );             
398     return( report->status == smr_status_Error    
399 }                                                 
400 /*                                                
401 ==============================================    
402 */                                                
403 int smr_isReportWarningOrError( statusMessageR    
404                                                   
405     if( report == NULL ) return( 0 );             
406     return( ( report->status == smr_status_War    
407 }                                                 
408 /*                                                
409 ==============================================    
410 */                                                
411 int smr_numberOfReports( statusMessageReportin    
412                                                   
413     int n = 0;                                    
414     statusMessageReport *report;                  
415                                                   
416     if( smr == NULL ) return( 0 );                
417     if( smr->report.status == smr_status_Ok )     
418     for( report = smr_firstReport( smr ); repo    
419     return( n );                                  
420 }                                                 
421 /*                                                
422 ==============================================    
423 */                                                
424 statusMessageReport *smr_firstReport( statusMe    
425                                                   
426     if( smr == NULL ) return( NULL );             
427     if( smr->report.status == smr_status_Ok )     
428     return( &(smr->report) );                     
429 }                                                 
430 /*                                                
431 ==============================================    
432 */                                                
433 statusMessageReport *smr_nextReport( statusMes    
434                                                   
435     if( report == NULL ) return( NULL );          
436     return( report->next );                       
437 }                                                 
438 /*                                                
439 ==============================================    
440 */                                                
441 enum smr_status smr_getVerbosity( statusMessag    
442                                                   
443     if( smr == NULL ) return( smr_status_Ok );    
444     return( smr->verbosity );                     
445 }                                                 
446 /*                                                
447 ==============================================    
448 */                                                
449 int smr_getAppend( statusMessageReporting *smr    
450                                                   
451     if( smr == NULL ) return( 0 );                
452     return( smr->append );                        
453 }                                                 
454 /*                                                
455 ==============================================    
456 */                                                
457 int smr_getLibraryID( statusMessageReport *rep    
458                                                   
459     if( report == NULL ) return( 0 );             
460     return( report->libraryID );                  
461 }                                                 
462 /*                                                
463 ==============================================    
464 */                                                
465 int smr_getCode( statusMessageReport *report )    
466                                                   
467     if( report == NULL ) return( -1 );            
468     return( report->code );                       
469 }                                                 
470 /*                                                
471 ==============================================    
472 */                                                
473 int smr_getLine( statusMessageReport *report )    
474                                                   
475     if( report == NULL ) return( -1 );            
476     return( report->line );                       
477 }                                                 
478 /*                                                
479 ==============================================    
480 */                                                
481 char const *smr_getFile( statusMessageReport *    
482                                                   
483     if( report == NULL ) return( NULL );          
484     return( report->fileName );                   
485 }                                                 
486 /*                                                
487 ==============================================    
488 */                                                
489 char const *smr_getFunction( statusMessageRepo    
490                                                   
491     if( report == NULL ) return( NULL );          
492     return( report->function );                   
493 }                                                 
494 /*                                                
495 ==============================================    
496 */                                                
497 char const *smr_getMessage( statusMessageRepor    
498                                                   
499     if( report == NULL ) return( NULL );          
500     return( report->message );                    
501 }                                                 
502 /*                                                
503 ==============================================    
504 */                                                
505 char *smr_copyMessage( statusMessageReport *re    
506                                                   
507     if( report == NULL ) return( NULL );          
508     if( report->status == smr_status_Ok ) retu    
509     return( smr_allocateFormatMessage( report-    
510 }                                                 
511 /*                                                
512 ==============================================    
513 */                                                
514 char *smr_copyFullMessage( statusMessageReport    
515                                                   
516     if( report == NULL ) return( NULL );          
517     if( report->status == smr_status_Ok ) retu    
518     return( smr_allocateFormatMessage( "%s\nAt    
519 }                                                 
520 /*                                                
521 ==============================================    
522 */                                                
523 void smr_print( statusMessageReporting *smr, i    
524                                                   
525     smr_write( smr, stdout, clear );              
526 }                                                 
527 /*                                                
528 ==============================================    
529 */                                                
530 void smr_write( statusMessageReporting *smr, F    
531                                                   
532     statusMessageReport *report;                  
533                                                   
534     if( smr == NULL ) return;                     
535     for( report = smr_firstReport( smr ); repo    
536     if( clear ) smr_release( smr );               
537 }                                                 
538 /*                                                
539 ==============================================    
540 */                                                
541 void smr_reportPrint( statusMessageReport *rep    
542                                                   
543     smr_reportWrite( report, stderr );            
544 }                                                 
545 /*                                                
546 ==============================================    
547 */                                                
548 void smr_reportWrite( statusMessageReport *rep    
549                                                   
550     if( report->message != NULL ) fprintf( f,     
551 }                                                 
552 /*                                                
553 ==============================================    
554 */                                                
555 char const *smr_statusToString( enum smr_statu    
556                                                   
557     switch( status ) {                            
558     case smr_status_Ok : return( statusStringO    
559     case smr_status_Info : return( statusStrin    
560     case smr_status_Warning : return( statusSt    
561     case smr_status_Error : return( statusStri    
562     }                                             
563     return( statusStringInvalid );                
564 }                                                 
565 /*                                                
566 ==============================================    
567 */                                                
568 char *smr_allocateFormatMessage( char const *f    
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 */                                                
581 char *smr_vallocateFormatMessage( char const *    
582                                                   
583     int n, size = SMR_InitialMessageSize;         
584     char buffer[SMR_InitialMessageSize], *mess    
585     va_list args_;                                
586                                                   
587     while( 1 ) {                                  
588         va_copy( args_, *args );                  
589         n = vsnprintf( message, size, fmt, arg    
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 */       
595             size += SMR_IncrementMessageSize;     
596         }                                         
597         if( message == buffer ) message = NULL    
598         if( ( message = (char *) realloc( mess    
599     }  // Loop checking, 11.06.2015, T. Koi       
600     if( message == buffer ) {                     
601         if( ( message = (char *) malloc( n + 1    
602         strcpy( message, buffer ); }              
603     else {                                        
604         if( ( message = (char *) realloc( mess    
605     }                                             
606     return( message );                            
607 }                                                 
608 /*                                                
609 ==============================================    
610 */                                                
611 void *smr_malloc( statusMessageReporting *smr,    
612                                                   
613     void *p = smr_realloc( smr, NULL, size, fo    
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 < s    
620         for( i *= sizeof( long long ), c = (ch    
621     }                                             
622                                                   
623     return( p );                                  
624 }                                                 
625 /*                                                
626 ==============================================    
627 */                                                
628 void *smr_realloc( statusMessageReporting *smr    
629                                                   
630     void *p = realloc( pOld, size );              
631                                                   
632     if( ( p == NULL ) && ( smr != NULL ) ) {      
633         smr_setReportError( smr, NULL, file, l    
634     }                                             
635     return( p );                                  
636 }                                                 
637 /*                                                
638 ==============================================    
639 */                                                
640 void *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 */                                                
652 char *smr_allocateCopyString( statusMessageRep    
653 /*                                                
654 *   User must free returned string.               
655 */                                                
656     char *c = strdup( s );                        
657                                                   
658     if( c == NULL ) smr_setReportError( smr, N    
659                 strlen( s ), forItem );           
660     return( c );                                  
661 }                                                 
662 /*                                                
663 ==============================================    
664 */                                                
665 char *smr_allocateCopyStringN( statusMessageRe    
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,    
674         strncpy( c, s, n );                       
675         c[l] = 0;                                 
676     }                                             
677 /*                                                
678     c = strndup( s, l );        # Not standard    
679     if( c != NULL ) {                             
680         c[l] = 0; }                               
681     else {                                        
682          smr_setReportError( smr, NULL, file,     
683             strlen( s ), forItem );               
684     }                                             
685 */                                                
686     return( c );                                  
687 }                                                 
688                                                   
689 #if defined __cplusplus                           
690 }                                                 
691 #endif                                            
692