44 static const size_t altNumMax = 4;
54 char *memCp, **memCpp;
57 enum { preName, inName, preValue, inValue } state;
60 if ( handle && (handle->
debug & 1) )
61 printf(
"macParseDefns( %s )\n", defns );
65 numMax = strlen( defns );
66 if ( numMax < altNumMax )
68 ptr = (
const char **) calloc( numMax,
sizeof(
char * ) );
69 end = (
const char **) calloc( numMax,
sizeof(
char * ) );
70 del = (
int *) calloc( numMax,
sizeof(
int ) );
71 if ( ptr ==
NULL || end ==
NULL || del ==
NULL )
goto error;
80 for ( c = (
const char *) defns; *c !=
'\0'; c++ ) {
84 quote = ( *c ==
quote ) ? 0 : quote;
85 else if ( *c ==
'\'' || *c ==
'"' )
89 escape = ( *c ==
'\\' && *( c + 1 ) !=
'\0' );
93 if ( !quote && !escape && ( isspace( (
int) *c ) || *c ==
',' ) )
break;
99 if ( quote || escape || ( *c !=
'=' && *c !=
',' ) )
break;
101 while ( end[num] > ptr[num] && isspace( (
int) *( end[num] - 1 ) ) )
106 if ( *c !=
',' )
break;
111 if ( !quote && !escape && isspace( (
int) *c ) )
break;
117 if ( quote || escape || *c !=
',' )
break;
119 while ( end[num] > ptr[num] && isspace( (
int) *( end[num] - 1 ) ) )
139 while ( end[num] > ptr[num] && isspace( (
int) *( end[num] - 1 ) ) )
147 while ( end[num] > ptr[num] && isspace( (
int) *( end[num] - 1 ) ) )
154 if ( handle !=
NULL && handle->
debug & 4 )
155 for ( i = 0; i < num; i += 2 )
156 printf(
"[%ld] %.*s = [%ld] %.*s (%s) (%s)\n",
157 (
long) (end[i+0] - ptr[i+0]), (
int) (end[i+0] - ptr[i+0]), ptr[i+0],
158 (
long) (end[i+1] - ptr[i+1]), (
int) (end[i+1] - ptr[i+1]), ptr[i+1],
159 del[i+0] ?
"del" :
"nodel",
160 del[i+1] ?
"del" :
"nodel" );
164 nbytes = ( num + 2 ) *
sizeof(
char * );
165 for ( i = 0; i < num; i++ )
166 nbytes += end[i] - ptr[i] + 1;
169 memCp = malloc( nbytes );
170 if ( memCp ==
NULL )
goto error;
171 memCpp = (
char ** ) memCp;
176 memCp += ( num + 2 ) *
sizeof(
char * );
177 for ( i = 0; i < num; i++ ) {
186 strncpy( memCp, (
const char *) ptr[i], end[i] - ptr[i] );
187 memCp += end[
i] - ptr[
i];
197 for ( p = *pairs; *p !=
NULL; p += 2 ) {
199 for ( s = d = *p; *s !=
'\0'; s++ ) {
208 else if ( *s ==
'\'' || *s ==
'"' ) {
214 if ( *s ==
'\\' && *( s + 1 ) !=
'\0' )
226 free( (
void * ) ptr );
227 free( (
void * ) end );
228 free( (
char * ) del );
231 if ( handle !=
NULL && handle->
debug & 1 )
232 printf(
"macParseDefns() -> %d\n", num / 2 );
239 errlogPrintf(
"macParseDefns: failed to allocate memory\n" );
240 if ( ptr !=
NULL ) free( (
void * ) ptr );
241 if ( end !=
NULL ) free( (
void * ) end );
242 if ( del !=
NULL ) free( (
char * ) del );
265 if ( handle->
debug & 1 )
266 printf(
"macInstallMacros( %s, %s, ... )\n",
267 pairs && pairs[0] ? pairs[0] :
"NULL",
268 pairs && pairs[1] ? pairs[1] :
"NULL" );
271 for ( n = 0, p = pairs; p !=
NULL && p[0] !=
NULL; n++, p += 2 ) {
277 if ( handle->
debug & 1 )
278 printf(
"macInstallMacros() -> %d\n", n );
long epicsStdCall macInstallMacros(MAC_HANDLE *handle, char *pairs[])
Install set of {name, value} pairs as definitions.
long epicsStdCall macParseDefns(MAC_HANDLE *handle, const char *defns, char **pairs[])
Parse macro definitions into an array of {name, value} pairs.
Miscellaneous macro definitions.
Macro substitution context, for use by macLib routines only.
int errlogPrintf(const char *pFormat,...)
Text macro substitution routines.
long epicsStdCall macPutValue(MAC_HANDLE *handle, const char *name, const char *value)
Sets the value of a specific macro.