@@ -1404,7 +1404,14 @@ void Parser::Read_Symbol()
14041404
14051405 if (k >= a->Sizes [i])
14061406 {
1407- Error (" Array subscript out of range" );
1407+ if (a->resizable )
1408+ {
1409+ POV_PARSER_ASSERT (a->Dims == 0 );
1410+ a->DataPtrs .resize (k+1 );
1411+ a->Sizes [0 ] = a->DataPtrs .size ();
1412+ }
1413+ else
1414+ Error (" Array subscript out of range" );
14081415 }
14091416 j += k * a->Mags [i];
14101417 GET (RIGHT_SQUARE_TOKEN)
@@ -1434,6 +1441,12 @@ void Parser::Read_Symbol()
14341441
14351442 if (c ==' .' )
14361443 {
1444+ if (table == NULL )
1445+ {
1446+ POV_PARSER_ASSERT (Token.is_array_elem );
1447+ Error (" Attempt to access uninitialized array element." );
1448+ }
1449+
14371450 GET (PERIOD_TOKEN)
14381451 bool oldParseRawIdentifiers = parseRawIdentifiers;
14391452 parseRawIdentifiers = true ;
@@ -1447,6 +1460,12 @@ void Parser::Read_Symbol()
14471460 }
14481461 else if (c == ' [' )
14491462 {
1463+ if (table == NULL )
1464+ {
1465+ POV_PARSER_ASSERT (Token.is_array_elem );
1466+ Error (" Attempt to access uninitialized array element." );
1467+ }
1468+
14501469 GET (LEFT_SQUARE_TOKEN)
14511470 dictIndex = Parse_C_String ();
14521471 GET (RIGHT_SQUARE_TOKEN);
@@ -3534,7 +3553,8 @@ Parser::POV_ARRAY *Parser::Parse_Array_Declare (void)
35343553 POV_ARRAY *New;
35353554 int i,j;
35363555
3537- New=reinterpret_cast <POV_ARRAY *>(POV_MALLOC (sizeof (POV_ARRAY)," array" ));
3556+ New = new POV_ARRAY;
3557+ New->resizable = false ;
35383558
35393559 i=0 ;
35403560 j=1 ;
@@ -3562,14 +3582,16 @@ Parser::POV_ARRAY *Parser::Parse_Array_Declare (void)
35623582 END_CASE
35633583 END_EXPECT
35643584
3565- if ( i < 1 ) {
3566- Error ( " An array declaration must have at least one dimension" );
3585+ if (i == 0 ) {
3586+ // new syntax: Dynamically sized one-dimensional array
3587+ i = 1 ;
3588+ New->Sizes [0 ] = 0 ;
3589+ New->resizable = true ;
35673590 }
35683591
35693592 New->Dims = i-1 ;
3570- New->Total = j;
35713593 New->Type = EMPTY_ARRAY_TOKEN;
3572- New->DataPtrs = reinterpret_cast < void **>( POV_MALLOC ( sizeof ( void *)*j, " array " ) );
3594+ New->DataPtrs . resize (j );
35733595
35743596 j = 1 ;
35753597
@@ -3579,9 +3601,9 @@ Parser::POV_ARRAY *Parser::Parse_Array_Declare (void)
35793601 j *= New->Sizes [i];
35803602 }
35813603
3582- for (i=0 ; i<New->Total ; i++)
3604+ for (i=0 ; i<New->DataPtrs . size () ; i++)
35833605 {
3584- New->DataPtrs [i] = NULL ;
3606+ POV_PARSER_ASSERT ( New->DataPtrs [i] == NULL ) ;
35853607 }
35863608
35873609 EXPECT
@@ -3672,9 +3694,17 @@ void Parser::Parse_Initalizer (int Sub, int Base, POV_ARRAY *a)
36723694 else
36733695 {
36743696 bool properlyDelimited = true ;
3675- for (i=0 ; i < a->Sizes [Sub]; i++)
3697+ bool finalParameter = (!a->resizable && (a->Sizes [Sub] == 0 ));
3698+ for (i=0 ; !finalParameter; i++)
36763699 {
3677- bool finalParameter = (i == a->Sizes [Sub]-1 );
3700+ if (a->resizable )
3701+ {
3702+ a->DataPtrs .push_back (NULL );
3703+ a->Sizes [Sub] = a->DataPtrs .size ();
3704+ }
3705+ else
3706+ finalParameter = (i == (a->Sizes [Sub]-1 ));
3707+
36783708 if (!Parse_RValue (a->Type , &(a->Type ), &(a->DataPtrs [Base+i]), NULL , false , false , true , false , true , MAX_NUMBER_OF_TABLES))
36793709 {
36803710 EXPECT_ONE
@@ -3685,12 +3715,17 @@ void Parser::Parse_Initalizer (int Sub, int Base, POV_ARRAY *a)
36853715 END_CASE
36863716
36873717 CASE (RIGHT_CURLY_TOKEN)
3688- if (!(finalParameter && properlyDelimited))
3689- // the parameter list was closed prematurely
3690- Error (" Expected %d initializers but only %d found." ,a->Sizes [Sub],i);
3691- // the parameter was left empty
3692- if (!optional)
3693- Error (" Cannot omit elements of non-optional array initializer." );
3718+ if (a->resizable )
3719+ finalParameter = true ;
3720+ else
3721+ {
3722+ if (!(finalParameter && properlyDelimited))
3723+ // the parameter list was closed prematurely
3724+ Error (" Expected %d initializers but only %d found." ,a->Sizes [Sub],i);
3725+ // the parameter was left empty
3726+ if (!optional)
3727+ Error (" Cannot omit elements of non-optional array initializer." );
3728+ }
36943729 UNGET
36953730 END_CASE
36963731
0 commit comments