43 #if defined __cplusplus
48 static tpi_channelID *
_tpi_channelID_parse2( statusMessageReporting *smr,
char const *str,
char const *origStr,
int isDecayChannel,
char **EOP );
49 static tpi_spectralID *
_tpi_spectralID_parse2( statusMessageReporting *smr,
char const *str,
char const *origStr,
char **EOP );
58 if( ( channelID = (tpi_channelID*) xData_malloc2( smr,
sizeof( tpi_channelID ), 0,
"channelID" ) ) == NULL )
return( NULL );
68 memset( channelID, 0,
sizeof( tpi_channelID ) );
76 if( channelID != NULL ) {
87 tpi_spectralID *spectralID, *next;
89 for( spectralID = channelID->spectralIDs; spectralID != NULL; spectralID = next ) {
90 next = spectralID->next;
106 static tpi_channelID *
_tpi_channelID_parse2( statusMessageReporting *smr,
char const *str,
char const *origStr,
int isDecayChannel,
char **EOP ) {
109 tpi_spectralID *spectralID, *priorSpectral;
113 smr_setMessageError( smr, NULL, __FILE__, __LINE__, 1,
"Empty channel string to parse for '%s'", origStr );
117 priorSpectral= (tpi_spectralID *) &(channelID->spectralIDs);
121 priorSpectral->next = spectralID;
122 priorSpectral = spectralID;
124 if( **EOP == 0 )
break;
125 if( isDecayChannel && ( **EOP ==
')' ) )
break;
127 smr_setMessageError( smr, NULL, __FILE__, __LINE__, 1,
"Missing '+' (or maybe ')') in channelID at '%s' of '%s'", *EOP, origStr );
148 char *sans[] = { (
char*)
"revision", NULL };
157 tpi_spectralID *spectralID;
159 for( spectralID = channelID->spectralIDs; spectralID != NULL; spectralID = spectralID->next ) {
161 if( spectralID->next != NULL ) {
162 if( (
gString_addTo( smr, gStr,
" + " ) ) != 0 )
return( 1 );
172 tpi_spectralID *spectralID;
175 if( ( spectralID = (tpi_spectralID*) xData_malloc2( smr,
sizeof( tpi_spectralID ), 1,
"spectralID" ) ) == NULL )
return( NULL );
177 return( spectralID );
185 memset( spectralID, 0,
sizeof( tpi_spectralID ) );
193 if( spectralID != NULL ) {
204 tpi_spectralIDQualifier *qualifier, *next;
206 if( spectralID->name != NULL ) free( spectralID->name );
207 for( qualifier = spectralID->qualifiers; qualifier != NULL; qualifier = next ) {
208 next = qualifier->next;
211 if( spectralID->decayChannel != NULL )
tpi_channelID_free( smr, spectralID->decayChannel );
225 static tpi_spectralID *
_tpi_spectralID_parse2( statusMessageReporting *smr,
char const *str,
char const *origStr,
char **EOP ) {
227 int breakup = 0, i1, i2,
m;
232 tpi_spectralID *spectralID;
233 tpi_spectralIDQualifier *qualifier, *priorQualifier = NULL;
237 smr_setMessageError( smr, NULL, __FILE__, __LINE__, 1,
"Empty spectralID string to parse for '%s'", origStr );
245 if( !isalpha( **EOP ) ) {
246 smr_setMessageError( smr, NULL, __FILE__, __LINE__, 1,
"Invalid spectralID name '%s' in '%s'", *EOP, origStr );
249 for( s = *EOP, i1 = 0; ( isalnum( **EOP ) ) || ( **EOP ==
'_' ); (*EOP)++ ) i1++;
255 priorQualifier = (tpi_spectralIDQualifier *) &(spectralID->qualifiers);
257 while( **EOP == bOrC ) {
261 if( !isalpha( **EOP ) ) {
262 smr_setMessageError( smr, NULL, __FILE__, __LINE__, 1,
"Invalid qualifier name '%s' in '%s'", *EOP, origStr );
266 for( s = *EOP, i1 = 0; ( isalnum( **EOP ) ) || ( **EOP ==
'_' ); (*EOP)++ ) i1++;
270 smr_setMessageError( smr, NULL, __FILE__, __LINE__, 1,
"Missing ':' in qualifier defintion at '%s' in '%s'", *EOP, origStr );
277 if( ( **EOP !=
'"' ) && ( **EOP !=
'\'' ) ) {
278 smr_setMessageError( smr, NULL, __FILE__, __LINE__, 1,
"Missing start quote in qualifier defintion at '%s' in '%s'", *EOP, origStr );
284 for( q = *EOP, i2 = 0; ( **EOP != c ) && ( **EOP != 0 ); (*EOP)++ ) i2++;
286 smr_setMessageError( smr, NULL, __FILE__, __LINE__, 1,
"Missing end quote in qualifier defintion at '%s' in '%s'", *EOP, origStr );
294 if( ( qualifier = (tpi_spectralIDQualifier*) xData_malloc2( smr,
sizeof( tpi_spectralIDQualifier ) + i1 + i2 + 2, 1,
"qualifier" ) ) == NULL )
297 qualifier->next = NULL;
298 qualifier->name = (
char *) &(qualifier[1]);
299 qualifier->value = &(qualifier->name[i1+1]);
300 strncpy( qualifier->name, s, i1 );
301 qualifier->name[i1] = 0;
302 strncpy( qualifier->value, q, i2 );
303 qualifier->value[i2] = 0;
305 if( strcmp( qualifier->name,
"revision" ) == 0 ) {
306 spectralID->revision = qualifier->value; }
307 else if( strcmp( qualifier->name,
"multiplicity" ) == 0 ) {
308 spectralID->multiplicityStr = qualifier->value; }
309 else if( strcmp( qualifier->name,
"level" ) == 0 ) {
310 spectralID->levelStr = qualifier->value;
312 priorQualifier->next = qualifier;
313 priorQualifier = qualifier;
316 smr_setMessageError( smr, NULL, __FILE__, __LINE__, 1,
"Missing ']' for qualifier at '%s' in '%s'", *EOP, origStr );
321 if( spectralID->multiplicityStr != NULL ) {
322 m = strtol( spectralID->multiplicityStr, &e, 10 );
323 if( ( *e == 0 ) && ( e != spectralID->multiplicityStr ) ) spectralID->multiplicity =
m;
325 if( spectralID->levelStr != NULL ) {
326 d = strtod( spectralID->levelStr, &e );
327 if( ( *e == 0 ) && ( e != spectralID->levelStr ) ) spectralID->level = d;
332 if( ( **EOP !=
'-' ) || ( (*EOP)[1] !=
'>' ) ) {
333 smr_setMessageError( smr, NULL, __FILE__, __LINE__, 1,
"Missing '->' for breakup at '%s' in '%s'", *EOP, origStr );
342 smr_setMessageError( smr, NULL, __FILE__, __LINE__, 1,
"Missing ')' for breakup at '%s' in '%s'", *EOP, origStr );
348 return( spectralID );
363 char *sans[] = { (
char*)
"revision", NULL };
373 tpi_spectralIDQualifier *qualifier;
375 char **san, *sSan[] = { NULL };
377 if( sans == NULL ) sans = sSan;
378 if( spectralID->decayChannel != NULL )
if(
gString_addTo( smr, gStr,
"(" ) != 0 )
return( 1 );
379 if( (
gString_addTo( smr, gStr, spectralID->name ) ) != 0 )
return( 1 );
380 if( spectralID->qualifiers != NULL ) {
381 for( qualifier = spectralID->qualifiers, i = 0; qualifier != NULL; qualifier = qualifier->next ) i++;
382 for( qualifier = spectralID->qualifiers; qualifier != NULL; qualifier = qualifier->next ) {
383 for( san = (
char **) sans; *san != NULL; san++ ) {
384 if( strcmp( *san, qualifier->name ) == 0 ) {
392 for( qualifier = spectralID->qualifiers; qualifier != NULL; qualifier = qualifier->next ) {
393 for( san = (
char **) sans; *san != NULL; san++ )
if( strcmp( *san, qualifier->name ) == 0 )
break;
394 if( *san != NULL )
continue;
395 if(
gString_addTo( smr, gStr, qualifier->name ) != 0 )
return( 1 );
397 if(
gString_addTo( smr, gStr, qualifier->value ) != 0 )
return( 1 );
408 if( spectralID->decayChannel != NULL ) {
409 if( (
gString_addTo( smr, gStr,
" -> " ) ) != 0 )
return( 1 );
423 for( s = str; ( *s != 0 ) && isspace( *s ); s++ ) ;
434 if( ( s = (
char*) xData_malloc2( smr, n + 1, 0,
"s" ) ) == NULL )
return( NULL );
435 strncpy( s, str, n );
440 #if defined __cplusplus
tpi_channelID * tpi_channelID_parse(statusMessageReporting *smr, char const *str, char **EOP)
static tpi_channelID * _tpi_channelID_parse2(statusMessageReporting *smr, char const *str, char const *origStr, int isDecayChannel, char **EOP)
int smr_setMessageError(statusMessageReporting *smr, void *userInterface, const char *file, int line, int code, const char *fmt,...)
int tpi_spectralID_toStringSanRevision(statusMessageReporting *smr, tpi_spectralID *spectralID, gString *gStr)
int gString_addTo(statusMessageReporting *smr, gString *gStr, char const *str)
static tpi_spectralID * _tpi_spectralID_parse2(statusMessageReporting *smr, char const *str, char const *origStr, char **EOP)
int tpi_channelID_release(statusMessageReporting *smr, tpi_channelID *channelID)
tpi_spectralID * tpi_spectralID_parse(statusMessageReporting *smr, char const *str, char **EOP)
int tpi_spectralID_release(statusMessageReporting *smr, tpi_spectralID *spectralID)
struct channelID_s channelID
int tpi_spectralID_initialize(statusMessageReporting *, tpi_spectralID *spectralID)
int tpi_channelID_toStringSanRevision(statusMessageReporting *smr, tpi_channelID *channelID, gString *gStr)
tpi_channelID * tpi_channelID_allocate(statusMessageReporting *smr)
char * tpi_misc_allocateAndCopyNCharacters(statusMessageReporting *smr, char const *str, int n)
void * tpi_spectralID_free(statusMessageReporting *smr, tpi_spectralID *spectralID)
int tpi_spectralID_toStringSans(statusMessageReporting *smr, tpi_spectralID *spectralID, gString *gStr, char *sans[])
tpi_spectralID * tpi_spectralID_allocate(statusMessageReporting *smr)
void * xData_free(statusMessageReporting *, void *p)
void * tpi_channelID_free(statusMessageReporting *smr, tpi_channelID *channelID)
int tpi_spectralID_toString(statusMessageReporting *smr, tpi_spectralID *spectralID, gString *gStr)
int tpi_channelID_toString(statusMessageReporting *smr, tpi_channelID *channelID, gString *gStr)
int tpi_channelID_initialize(statusMessageReporting *, tpi_channelID *channelID)
int tpi_channelID_toStringSans(statusMessageReporting *smr, tpi_channelID *channelID, gString *gStr, char *sans[])
char const * tpi_misc_firstNonWhiteSpace(statusMessageReporting *, char const *str)