Selaa lähdekoodia

Fixed bugreport:6032 r15982's variable assignment should be fully functional now. Fixed the bug which prevented stuff such as "for (.@i = 0; .@i < 20; .@i++)" from working.

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@16555 54d463be-8e91-2dee-dedb-b68131a5f0ec
shennetsind 12 vuotta sitten
vanhempi
commit
41ea3a29c3
1 muutettua tiedostoa jossa 20 lisäystä ja 38 poistoa
  1. 20 38
      src/map/script.c

+ 20 - 38
src/map/script.c

@@ -1052,8 +1052,7 @@ static void parse_nextline(bool first, const char* p)
 /// Parse a variable assignment using the direct equals operator
 /// @param p script position where the function should run from
 /// @return NULL if not a variable assignment, the new position otherwise
-const char* parse_variable(const char* p)
-{
+const char* parse_variable(const char* p) {
 	int i, j, word;
 	c_op type = C_NOP;
 	const char *p2 = NULL;
@@ -1063,21 +1062,17 @@ const char* parse_variable(const char* p)
 	p = skip_word(p);
 	p = skip_space(p);
 
-	if( p == NULL )
-	{// end of the line or invalid buffer
+	if( p == NULL ) {// end of the line or invalid buffer
 		return NULL;
 	}
 
-	if( *p == '[' )
-	{// array variable so process the array as appropriate
-		for( p2 = p, i = 0, j = 1; p; ++ i )
-		{
+	if( *p == '[' ) {// array variable so process the array as appropriate
+		for( p2 = p, i = 0, j = 1; p; ++ i ) {
 			if( *p ++ == ']' && --(j) == 0 ) break;
 			if( *p == '[' ) ++ j;
 		}
 
-		if( !(p = skip_space(p)) )
-		{// end of line or invalid characters remaining
+		if( !(p = skip_space(p)) ) {// end of line or invalid characters remaining
 			disp_error_message("Missing right expression or closing bracket for variable.", p);
 		}
 	}
@@ -1102,29 +1097,24 @@ const char* parse_variable(const char* p)
 		return NULL;
 	}
 
-	switch( type )
-	{
-		case C_EQ:
-		{// incremental modifier
+	switch( type ) {
+		case C_EQ: {// incremental modifier
 			p = skip_space( &p[1] );
 		}
 		break;
 
 		case C_L_SHIFT:
-		case C_R_SHIFT:
-		{// left or right shift modifier
+		case C_R_SHIFT: {// left or right shift modifier
 			p = skip_space( &p[3] );
 		}
 		break;
 
-		default:
-		{// normal incremental command
+		default: {// normal incremental command
 			p = skip_space( &p[2] );
 		}
 	}
 
-	if( p == NULL )
-	{// end of line or invalid buffer
+	if( p == NULL ) {// end of line or invalid buffer
 		return NULL;
 	}
 	
@@ -1148,8 +1138,7 @@ const char* parse_variable(const char* p)
 		disp_error_message("Cannot modify a variable which has the same name as a function or label.", p);
 	}
 
-	if( p2 )
-	{// process the variable index
+	if( p2 ) {// process the variable index
 		const char* p3 = NULL;
 
 		// push the getelementofarray method into the stack
@@ -1161,29 +1150,22 @@ const char* parse_variable(const char* p)
 		p3 = parse_subexpr(p2 + 1, 1);
 		p3 = skip_space(p3);
 
-		if( *p3 != ']' )
-		{// closing parenthesis is required for this script
+		if( *p3 != ']' ) {// closing parenthesis is required for this script
 			disp_error_message("Missing closing ']' parenthesis for the variable assignment.", p3);
 		}
 
 		// push the closing function stack operator onto the stack
 		add_scriptc(C_FUNC);
 		p3 ++;
-	}
-	else
-	{// simply push the variable or value onto the stack
+	} else {// simply push the variable or value onto the stack
 		add_scriptl(word);
 	}
 	
-	add_scriptc(C_REF);
-
-	if( type == C_ADD_PP || type == C_SUB_PP )
-	{// incremental operator for the method
+	if( type == C_ADD_PP || type == C_SUB_PP ) {// incremental operator for the method
+		add_scriptc(C_REF);
 		add_scripti(1);
 		add_scriptc(type == C_ADD_PP ? C_ADD : C_SUB);
-	}
-	else
-	{// process the value as an expression
+	} else {// process the value as an expression
 		p = parse_subexpr(p, -1);
 
 		if( type != C_EQ )
@@ -3220,10 +3202,10 @@ void op_2(struct script_state *st, int op)
 	left = script_getdatatop(st, -2);
 	right = script_getdatatop(st, -1);
 
-	if (st->op2ref)
-	{
-		if (data_isreference(left))
+	if (st->op2ref) {
+		if (data_isreference(left)) {
 			leftref = *left;
+		}
 
 		st->op2ref = 0;
 	}
@@ -3392,7 +3374,7 @@ static void script_check_buildin_argtype(struct script_state* st, int func)
 				case 'l':
 					if( !data_islabel(data) && !data_isfunclabel(data) )
 					{// label
-						ShowWarning("Unexpected type for argument %d. Expected label.\n", idx-1);
+						ShowWarning("Unexpected type for argument %d. Expected label, got %s\n", idx-1,script_op2name(data->type));
 						script_reportdata(data);
 						invalid++;
 					}