Changes in / [05f8761:1665ee5]
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Parser/ExpressionNode.cpp
r05f8761 r1665ee5 9 9 // Author : Peter A. Buhr 10 10 // Created On : Sat May 16 13:17:07 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Wed Sep 11 16:28:06202413 // Update Count : 108 911 // Last Modified By : Andrew Beach 12 // Last Modified On : Fri Aug 23 10:22:00 2024 13 // Update Count : 1088 14 14 // 15 15 … … 461 461 } // build_constantChar 462 462 463 static bool isoctal( char ch ) {464 return ('0' <= ch && ch <= '7');465 }466 467 static bool ishexadecimal( char ch ) {468 return (('0' <= ch && ch <= '9')469 || ('a' <= ch && ch <= 'f')470 || ('A' <= ch && ch <= 'F'));471 }472 473 // A "sequence" is the series of characters in a character/string literal474 // that becomes a single character value in the runtime value.475 static size_t sequenceLength( const std::string & str, size_t pos ) {476 // Most "sequences" are just a single character, filter those out:477 if ( '\\' != str[pos] ) return 1;478 switch ( str[pos + 1] ) {479 // Simple Escape Sequence (\_ where _ is one of the following):480 case '\'': case '\"': case '?': case '\\':481 case 'a': case 'b': case 'f': case 'n': case 'r': case 't': case 'v':482 // GCC Escape Sequence (as simple, just some different letters):483 case 'e':484 return 2;485 // Numeric Escape Sequence (\___ where _ is 1-3 octal digits):486 case '0': case '1': case '2': case '3':487 case '4': case '5': case '6': case '7':488 return ( !isoctal( str[pos + 2] ) ) ? 2 :489 ( !isoctal( str[pos + 3] ) ) ? 3 : 4;490 // Numeric Escape Sequence (\x_ where _ is 1 or more hexadecimal digits):491 case 'x': {492 size_t length = 2;493 while ( ishexadecimal( str[pos + length] ) ) ++length;494 return length;495 }496 // Universal Character Name (\u____ where _ is 4 decimal digits):497 case 'u':498 return 6;499 // Universal Character Name (\U________ where _ is 8 decimal digits):500 case 'U':501 return 10;502 default:503 assertf( false, "Unknown escape sequence (start %c).", str[pos] );504 return 1;505 }506 }507 508 463 ast::Expr * build_constantStr( 509 464 const CodeLocation & location, … … 530 485 strtype = new ast::BasicType( ast::BasicKind::Char ); 531 486 } // switch 532 533 // The dimension value of the type is equal to the number of "sequences"534 // not including the openning and closing quotes in the literal plus 1535 // for the implicit null terminator.536 size_t dimension = 1;537 for ( size_t pos = 1 ; pos < str.size() - 1 ;538 pos += sequenceLength( str, pos ) ) {539 dimension += 1;540 }541 542 487 ast::ArrayType * at = new ast::ArrayType( 543 488 strtype, 544 ast::ConstantExpr::from_ulong( location, dimension ), 489 // Length is adjusted: +1 for '\0' and -2 for '"' 490 ast::ConstantExpr::from_ulong( location, str.size() + 1 - 2 ), 545 491 ast::FixedLen, 546 492 ast::DynamicDim );
Note: See TracChangeset
for help on using the changeset viewer.