Skip to content

Commit 0b5ac83

Browse files
committed
Implement array-style dictionary access.
1 parent 535bac5 commit 0b5ac83

File tree

4 files changed

+42
-18
lines changed

4 files changed

+42
-18
lines changed

source/base/version.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
#define OFFICIAL_VERSION_STRING "3.7.1"
4646
#define OFFICIAL_VERSION_NUMBER 371
4747

48-
#define POV_RAY_PRERELEASE "x.dictionary.8790824"
48+
#define POV_RAY_PRERELEASE "x.dictionary.8790989"
4949

5050
#if (POV_RAY_IS_AUTOBUILD == 1) && ((POV_RAY_IS_OFFICIAL == 1) || (POV_RAY_IS_SEMI_OFFICIAL == 1))
5151
#ifdef POV_RAY_PRERELEASE

source/parser/parser.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,7 @@ class Parser : public SceneTask
236236
SYM_TABLE *table; ///< table or dictionary the token references an element of
237237
bool is_array_elem : 1; ///< true if token is actually an array element reference
238238
bool is_dictionary_elem : 1; ///< true if token is actually a dictionary element reference
239+
bool freeString : 1; ///< true if Token_String must be freed before being assigned a new value
239240
};
240241

241242
struct LValue

source/parser/parser_tokenizer.cpp

Lines changed: 39 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,7 @@ void Parser::pre_init_tokenizer ()
157157
Token.Token_File_Pos.offset = 0;
158158
Token.Token_Col_No = 0;
159159
Token.Token_String = NULL;
160+
Token.freeString = false;
160161
Token.Unget_Token = false;
161162
Token.End_Of_File = false;
162163
Token.Data = NULL;
@@ -1053,8 +1054,6 @@ void Parser::Read_String_Literal()
10531054
End_String();
10541055

10551056
Write_Token(STRING_LITERAL_TOKEN, col);
1056-
1057-
Token.Token_String = String;
10581057
}
10591058

10601059

@@ -1277,6 +1276,7 @@ void Parser::Read_Symbol()
12771276
POV_PARAM *Par;
12781277
DBL val;
12791278
SYM_TABLE *table;
1279+
char *dictIndex = NULL;
12801280

12811281
Begin_String_Fast();
12821282

@@ -1372,6 +1372,8 @@ void Parser::Read_Symbol()
13721372
bool breakLoop = false;
13731373
while (!breakLoop)
13741374
{
1375+
dictIndex = NULL;
1376+
13751377
switch (Token.Token_Id)
13761378
{
13771379
case ARRAY_ID_TOKEN:
@@ -1427,24 +1429,35 @@ void Parser::Read_Symbol()
14271429
c = Echo_getc();
14281430
Echo_ungetc(c);
14291431

1430-
if (c!='.')
1431-
{
1432-
breakLoop = true;
1433-
break;
1434-
}
1435-
1432+
dictIndex = NULL;
14361433
table = reinterpret_cast<SYM_TABLE *>(*(Token.DataPtr));
14371434

1438-
GET (PERIOD_TOKEN)
1439-
bool oldParseRawIdentifiers = parseRawIdentifiers;
1440-
parseRawIdentifiers = true;
1441-
Get_Token ();
1442-
parseRawIdentifiers = oldParseRawIdentifiers;
1435+
if (c =='.')
1436+
{
1437+
GET (PERIOD_TOKEN)
1438+
bool oldParseRawIdentifiers = parseRawIdentifiers;
1439+
parseRawIdentifiers = true;
1440+
Get_Token ();
1441+
parseRawIdentifiers = oldParseRawIdentifiers;
1442+
1443+
if (Token.Token_Id != IDENTIFIER_TOKEN)
1444+
Expectation_Error ("dictionary element identifier");
14431445

1444-
if (Token.Token_Id != IDENTIFIER_TOKEN)
1445-
Expectation_Error ("dictionary element identifier");
1446+
Temp_Entry = Find_Symbol (table, Token.Token_String);
1447+
}
1448+
else if (c == '[')
1449+
{
1450+
GET(LEFT_SQUARE_TOKEN)
1451+
dictIndex = Parse_C_String();
1452+
GET (RIGHT_SQUARE_TOKEN);
14461453

1447-
Temp_Entry = Find_Symbol (table, Token.Token_String);
1454+
Temp_Entry = Find_Symbol (table, dictIndex);
1455+
}
1456+
else
1457+
{
1458+
breakLoop = true;
1459+
break;
1460+
}
14481461

14491462
if (Temp_Entry)
14501463
{
@@ -1493,10 +1506,20 @@ void Parser::Read_Symbol()
14931506
}
14941507

14951508
Write_Token (IDENTIFIER_TOKEN, Token.Token_Col_No);
1509+
if (dictIndex != NULL)
1510+
{
1511+
Token.Token_String = dictIndex;
1512+
Token.freeString = true;
1513+
}
14961514
}
14971515

14981516
inline void Parser::Write_Token (TOKEN Token_Id, int col, SYM_TABLE *table)
14991517
{
1518+
if (Token.freeString)
1519+
{
1520+
POV_FREE (Token.Token_String);
1521+
Token.freeString = false;
1522+
}
15001523
Token.Token_File_Pos = Input_File->In_File->tellg();
15011524
Token.Token_Col_No = col;
15021525
Token.FileHandle = Input_File->In_File;

unix/VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
3.7.1-x.dictionary.8790824
1+
3.7.1-x.dictionary.8790989

0 commit comments

Comments
 (0)