10
10
* University of Stuttgart. All rights reserved.
11
11
* Copyright (c) 2004-2005 The Regents of the University of California.
12
12
* All rights reserved.
13
- * Copyright (c) 2015 Los Alamos National Security, LLC. All rights
13
+ * Copyright (c) 2015-2016 Los Alamos National Security, LLC. All rights
14
14
* reserved.
15
15
* $COPYRIGHT$
16
16
*
27
27
#include "opal/util/output.h"
28
28
#include "opal/threads/mutex.h"
29
29
#include <string.h>
30
+ #include <ctype.h>
30
31
31
32
int opal_util_keyval_parse_lineno = 0 ;
32
33
@@ -200,53 +201,58 @@ int opal_util_keyval_save_internal_envars(opal_keyval_parse_fn_t callback)
200
201
return OPAL_SUCCESS ;
201
202
}
202
203
203
- static int trim_name (char * * buffer , const char * prefix , const char * suffix )
204
+ static void trim_name (char * buffer , const char * prefix , const char * suffix )
204
205
{
205
- char * pchr , * echr , * tmp ;
206
- int size ;
207
- if (NULL == * buffer ) {
208
- return 1 ;
206
+ char * pchr , * echr ;
207
+ size_t buffer_len ;
208
+
209
+ if (NULL == buffer ) {
210
+ return ;
209
211
}
210
- pchr = * buffer ;
212
+
213
+ buffer_len = strlen (buffer );
214
+
215
+ pchr = buffer ;
211
216
if (NULL != prefix ) {
212
- pchr = strstr (* buffer , prefix );
213
- if (NULL != pchr ) {
214
- pchr += strlen (prefix );
215
- } else {
216
- pchr = * buffer ;
217
+ size_t prefix_len = strlen (prefix );
218
+
219
+ if (0 == strncmp (buffer , prefix , prefix_len )) {
220
+ pchr += prefix_len ;
217
221
}
218
222
}
223
+
219
224
/* trim spaces at the beginning */
220
- while (' ' == * pchr || '\t' == * pchr ) {
225
+ while (isspace ( * pchr ) ) {
221
226
pchr ++ ;
222
227
}
228
+
223
229
/* trim spaces at the end */
224
- echr = * buffer + strlen ( * buffer ) - 1 ;
225
- while (' ' == * echr || '\t' == * echr || '\n' == * echr ) {
230
+ echr = buffer + buffer_len - 1 ;
231
+ while (isspace ( * echr ) ) {
226
232
echr -- ;
227
233
}
228
- echr ++ ;
229
- * echr = '\0' ;
234
+ echr [ 1 ] = '\0' ;
235
+
230
236
if (NULL != suffix ) {
231
- if (!strncmp (echr - strlen (suffix ), suffix , strlen (suffix ))) {
232
- echr -= strlen (suffix )+ 1 ;
233
- while (' ' == * echr || '\t' == * echr ) {
237
+ size_t suffix_len = strlen (suffix );
238
+
239
+ echr -= suffix_len - 1 ;
240
+
241
+ if (0 == strncmp (echr , suffix , strlen (suffix ))) {
242
+ do {
234
243
echr -- ;
235
- }
236
- echr ++ ;
237
- * echr = '\0' ;
244
+ } while (isspace (* echr ));
245
+ echr [1 ] = '\0' ;
238
246
}
239
247
}
240
- size = strlen (pchr )+ 1 ;
241
- tmp = malloc (size );
242
- strncpy (tmp , pchr , size );
243
- * buffer = realloc (* buffer , size );
244
- strncpy (* buffer , tmp , size );
245
- free (tmp );
246
- return 0 ;
248
+
249
+ if (buffer != pchr ) {
250
+ /* move the trimmed string to the beginning of the buffer */
251
+ memmove (buffer , pchr , strlen (pchr ) + 1 );
252
+ }
247
253
}
248
254
249
- static int save_param_name ( const char * prefix , const char * suffix )
255
+ static int save_param_name ( void )
250
256
{
251
257
if (key_buffer_len < strlen (opal_util_keyval_yytext ) + 1 ) {
252
258
char * tmp ;
@@ -261,8 +267,8 @@ static int save_param_name(const char* prefix, const char* suffix)
261
267
key_buffer = tmp ;
262
268
}
263
269
264
- strncpy (key_buffer , opal_util_keyval_yytext , key_buffer_len );
265
- trim_name ( & key_buffer , prefix , suffix );
270
+ strncpy (key_buffer , opal_util_keyval_yytext , key_buffer_len );
271
+
266
272
return OPAL_SUCCESS ;
267
273
}
268
274
@@ -309,18 +315,26 @@ static int parse_line_new(opal_keyval_parse_state_t first_val)
309
315
{
310
316
opal_keyval_parse_state_t val ;
311
317
char * tmp ;
318
+ int rc ;
312
319
313
320
val = first_val ;
314
321
while (OPAL_UTIL_KEYVAL_PARSE_NEWLINE != val && OPAL_UTIL_KEYVAL_PARSE_DONE != val ) {
322
+ rc = save_param_name ();
323
+ if (OPAL_SUCCESS != rc ) {
324
+ return rc ;
325
+ }
326
+
315
327
if (OPAL_UTIL_KEYVAL_PARSE_MCAVAR == val ) {
316
- save_param_name ("-mca" , NULL );
328
+ trim_name (key_buffer , "-mca" , NULL );
329
+ trim_name (key_buffer , "--mca" , NULL );
330
+
317
331
val = opal_util_keyval_yylex ();
318
332
if (OPAL_UTIL_KEYVAL_PARSE_VALUE == val ) {
319
333
if (NULL != opal_util_keyval_yytext ) {
320
334
tmp = strdup (opal_util_keyval_yytext );
321
335
if ('\'' == tmp [0 ] || '\"' == tmp [0 ]) {
322
- trim_name ( & tmp , "\'" , "\'" );
323
- trim_name ( & tmp , "\"" , "\"" );
336
+ trim_name ( tmp , "\'" , "\'" );
337
+ trim_name ( tmp , "\"" , "\"" );
324
338
}
325
339
keyval_callback (key_buffer , tmp );
326
340
free (tmp );
@@ -330,7 +344,9 @@ static int parse_line_new(opal_keyval_parse_state_t first_val)
330
344
return OPAL_ERROR ;
331
345
}
332
346
} else if (OPAL_UTIL_KEYVAL_PARSE_ENVEQL == val ) {
333
- save_param_name ("-x" , "=" );
347
+ trim_name (key_buffer , "-x" , "=" );
348
+ trim_name (key_buffer , "--x" , NULL );
349
+
334
350
val = opal_util_keyval_yylex ();
335
351
if (OPAL_UTIL_KEYVAL_PARSE_VALUE == val ) {
336
352
add_to_env_str (key_buffer , opal_util_keyval_yytext );
@@ -339,7 +355,8 @@ static int parse_line_new(opal_keyval_parse_state_t first_val)
339
355
return OPAL_ERROR ;
340
356
}
341
357
} else if (OPAL_UTIL_KEYVAL_PARSE_ENVVAR == val ) {
342
- save_param_name ("-x" , "=" );
358
+ trim_name (key_buffer , "-x" , "=" );
359
+ trim_name (key_buffer , "--x" , NULL );
343
360
add_to_env_str (key_buffer , NULL );
344
361
} else {
345
362
/* we got something unexpected. Bonk! */
0 commit comments