@@ -721,22 +721,24 @@ static inline texture_type_t parseTextureType(
721721static tag_sizes parseTagTriple (const char **token) {
722722 tag_sizes ts;
723723
724+ (*token) += strspn ((*token), " \t " );
724725 ts.num_ints = atoi ((*token));
725726 (*token) += strcspn ((*token), " / \t\r " );
726727 if ((*token)[0 ] != ' /' ) {
727728 return ts;
728729 }
729- (*token)++;
730730
731+ (*token)++; // Skip '/'
732+
733+ (*token) += strspn ((*token), " \t " );
731734 ts.num_reals = atoi ((*token));
732735 (*token) += strcspn ((*token), " / \t\r " );
733736 if ((*token)[0 ] != ' /' ) {
734737 return ts;
735738 }
736- (*token)++;
739+ (*token)++; // Skip '/'
737740
738- ts.num_strings = atoi ((*token));
739- (*token) += strcspn ((*token), " / \t\r " ) + 1 ;
741+ ts.num_strings = parseInt (token);
740742
741743 return ts;
742744}
@@ -906,11 +908,18 @@ static bool ParseTextureNameAndOption(std::string *texname,
906908 parseReal2 (&(texopt->brightness ), &(texopt->contrast ), &token, 0.0 , 1.0 );
907909 } else {
908910 // Assume texture filename
911+ #if 0
909912 size_t len = strcspn(token, " \t\r"); // untile next space
910913 texture_name = std::string(token, token + len);
911914 token += len;
912915
913916 token += strspn(token, " \t"); // skip space
917+ #else
918+ // Read filename until line end to parse filename containing whitespace
919+ // TODO(syoyo): Support parsing texture option flag after the filename.
920+ texture_name = std::string (token);
921+ token += texture_name.length ();
922+ #endif
914923
915924 found_texname = true ;
916925 }
@@ -1762,33 +1771,25 @@ bool LoadObj(attrib_t *attrib, std::vector<shape_t> *shapes,
17621771 tag_t tag;
17631772
17641773 token += 2 ;
1765- std::stringstream ss;
1766- ss << token;
1767- tag.name = ss.str ();
17681774
1769- token += tag.name . size () + 1 ;
1775+ tag.name = parseString (&token) ;
17701776
17711777 tag_sizes ts = parseTagTriple (&token);
17721778
17731779 tag.intValues .resize (static_cast <size_t >(ts.num_ints ));
17741780
17751781 for (size_t i = 0 ; i < static_cast <size_t >(ts.num_ints ); ++i) {
1776- tag.intValues [i] = atoi (token);
1777- token += strcspn (token, " / \t\r " ) + 1 ;
1782+ tag.intValues [i] = parseInt (&token);
17781783 }
17791784
17801785 tag.floatValues .resize (static_cast <size_t >(ts.num_reals ));
17811786 for (size_t i = 0 ; i < static_cast <size_t >(ts.num_reals ); ++i) {
17821787 tag.floatValues [i] = parseReal (&token);
1783- token += strcspn (token, " / \t\r " ) + 1 ;
17841788 }
17851789
17861790 tag.stringValues .resize (static_cast <size_t >(ts.num_strings ));
17871791 for (size_t i = 0 ; i < static_cast <size_t >(ts.num_strings ); ++i) {
1788- std::stringstream sstr;
1789- sstr << token;
1790- tag.stringValues [i] = sstr.str ();
1791- token += tag.stringValues [i].size () + 1 ;
1792+ tag.stringValues [i] = parseString (&token);
17921793 }
17931794
17941795 tags.push_back (tag);
0 commit comments