@@ -303,7 +303,7 @@ action_param (int argc, const char *argv[])
303303 else if (OIIO::Strutil::istarts_with (splits[0 ]," type=" ))
304304 type.fromstring (splits[0 ].c_str ()+5 );
305305 else if (OIIO::Strutil::istarts_with (splits[0 ]," lockgeom=" ))
306- unlockgeom = (strtol (splits[0 ]. c_str ()+ 9 , NULL , 10 ) == 0 );
306+ unlockgeom = (OIIO::Strutil::from_string< int > (splits[0 ]) == 0 );
307307 }
308308
309309 // If it is or might be a matrix, look for 16 comma-separated floats
@@ -313,8 +313,7 @@ action_param (int argc, const char *argv[])
313313 &f[0 ], &f[1 ], &f[2 ], &f[3 ],
314314 &f[4 ], &f[5 ], &f[6 ], &f[7 ], &f[8 ], &f[9 ], &f[10 ], &f[11 ],
315315 &f[12 ], &f[13 ], &f[14 ], &f[15 ]) == 16 ) {
316- params.push_back (ParamValue ());
317- params.back ().init (paramname, TypeDesc::TypeMatrix, 1 , f);
316+ params.emplace_back (paramname, TypeDesc::TypeMatrix, 1 , f);
318317 if (unlockgeom)
319318 params.back ().interp (ParamValue::INTERP_VERTEX);
320319 return ;
@@ -324,37 +323,28 @@ action_param (int argc, const char *argv[])
324323 && sscanf (stringval.c_str (), " %g, %g, %g" , &f[0 ], &f[1 ], &f[2 ]) == 3 ) {
325324 if (type == TypeDesc::UNKNOWN)
326325 type = TypeDesc::TypeVector;
327- params.push_back (ParamValue ());
328- params.back ().init (paramname, type, 1 , f);
326+ params.emplace_back (paramname, type, 1 , f);
329327 if (unlockgeom)
330328 params.back ().interp (ParamValue::INTERP_VERTEX);
331329 return ;
332330 }
333331 // If it is or might be an int, look for an int that takes up the whole
334332 // string.
335- if ((type == TypeDesc::UNKNOWN || type == TypeDesc::TypeInt)) {
336- char *endptr = NULL ;
337- int ival = strtol (stringval.c_str (),&endptr,10 );
338- if (endptr && *endptr == 0 ) {
339- params.push_back (ParamValue ());
340- params.back ().init (paramname, TypeDesc::TypeInt, 1 , &ival);
341- if (unlockgeom)
342- params.back ().interp (ParamValue::INTERP_VERTEX);
343- return ;
344- }
333+ if ((type == TypeDesc::UNKNOWN || type == TypeDesc::TypeInt)
334+ && OIIO::Strutil::string_is<int >(stringval)) {
335+ params.emplace_back (paramname, OIIO::Strutil::from_string<int >(stringval));
336+ if (unlockgeom)
337+ params.back ().interp (ParamValue::INTERP_VERTEX);
338+ return ;
345339 }
346340 // If it is or might be an float, look for a float that takes up the
347341 // whole string.
348- if ((type == TypeDesc::UNKNOWN || type == TypeDesc::TypeFloat)) {
349- char *endptr = NULL ;
350- float fval = (float ) strtod (stringval.c_str (),&endptr);
351- if (endptr && *endptr == 0 ) {
352- params.push_back (ParamValue ());
353- params.back ().init (paramname, TypeDesc::TypeFloat, 1 , &fval);
354- if (unlockgeom)
355- params.back ().interp (ParamValue::INTERP_VERTEX);
356- return ;
357- }
342+ if ((type == TypeDesc::UNKNOWN || type == TypeDesc::TypeFloat)
343+ && OIIO::Strutil::string_is<float >(stringval)) {
344+ params.emplace_back (paramname, OIIO::Strutil::from_string<float >(stringval));
345+ if (unlockgeom)
346+ params.back ().interp (ParamValue::INTERP_VERTEX);
347+ return ;
358348 }
359349
360350 // Catch-all for float types and arrays
@@ -365,8 +355,7 @@ action_param (int argc, const char *argv[])
365355 OIIO::Strutil::parse_float (stringval, vals[i]);
366356 OIIO::Strutil::parse_char (stringval, ' ,' );
367357 }
368- params.push_back (ParamValue ());
369- params.back ().init (paramname, type, 1 , &vals[0 ]);
358+ params.emplace_back (paramname, type, 1 , &vals[0 ]);
370359 if (unlockgeom)
371360 params.back ().interp (ParamValue::INTERP_VERTEX);
372361 return ;
@@ -380,8 +369,7 @@ action_param (int argc, const char *argv[])
380369 OIIO::Strutil::parse_int (stringval, vals[i]);
381370 OIIO::Strutil::parse_char (stringval, ' ,' );
382371 }
383- params.push_back (ParamValue ());
384- params.back ().init (paramname, type, 1 , &vals[0 ]);
372+ params.emplace_back (paramname, type, 1 , &vals[0 ]);
385373 if (unlockgeom)
386374 params.back ().interp (ParamValue::INTERP_VERTEX);
387375 return ;
@@ -395,17 +383,15 @@ action_param (int argc, const char *argv[])
395383 std::vector<ustring> strelements;
396384 for (auto && s : splitelements)
397385 strelements.push_back (ustring (s));
398- params.push_back (ParamValue ());
399- params.back ().init (paramname, type, 1 , &strelements[0 ]);
386+ params.emplace_back (paramname, type, 1 , &strelements[0 ]);
400387 if (unlockgeom)
401388 params.back ().interp (ParamValue::INTERP_VERTEX);
402389 return ;
403390 }
404391
405392 // All remaining cases -- it's a string
406393 const char *s = stringval.c_str ();
407- params.push_back (ParamValue ());
408- params.back ().init (paramname, TypeDesc::TypeString, 1 , &s);
394+ params.emplace_back (paramname, TypeDesc::TypeString, 1 , &s);
409395 if (unlockgeom)
410396 params.back ().interp (ParamValue::INTERP_VERTEX);
411397}
0 commit comments