Explorar o código

* Fixed string variables dereferencing directly to the value instead of dereferencing to a copy of the value. (fixes bugreport:684 bugreport:641)

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@11976 54d463be-8e91-2dee-dedb-b68131a5f0ec
FlavioJS %!s(int64=17) %!d(string=hai) anos
pai
achega
214feac880
Modificáronse 2 ficheiros con 20 adicións e 8 borrados
  1. 3 0
      Changelog-Trunk.txt
  2. 17 8
      src/map/script.c

+ 3 - 0
Changelog-Trunk.txt

@@ -3,6 +3,9 @@ Date	Added
 AS OF SVN REV. 5091, WE ARE NOW USING TRUNK.  ALL UNTESTED BUGFIXES/FEATURES GO INTO TRUNK.
 IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
 
+2007/12/26
+	* Fixed string variables dereferencing directly to the value instead of 
+	  dereferencing to a copy of the value. (fixes bugreport:684 bugreport:641) [FlavioJS]
 2007/12/23
 	* Added a generic vector implementation (dynamic array) based on defines. [FlavioJS]
 	* Fixed horrible handling of skill_abra_db which leads to memory corruption

+ 17 - 8
src/map/script.c

@@ -2102,8 +2102,11 @@ TBL_PC *script_rid2sd(struct script_state *st)
 	return sd;
 }
 
-/// Retrieves the value of a script data
-int get_val(struct script_state* st, struct script_data* data)
+/// Dereferences a variable/constant, replacing it with a copy of the value.
+///
+/// @param st Script state
+/// @param data Variable/constant
+void get_val(struct script_state* st, struct script_data* data)
 {
 	char* name;
 	char prefix;
@@ -2111,7 +2114,7 @@ int get_val(struct script_state* st, struct script_data* data)
 	TBL_PC* sd = NULL;
 
 	if( !data_isreference(data) )
-		return 0;// not a variable
+		return;// not a variable/constant
 
 	name = reference_getname(data);
 	prefix = name[0];
@@ -2135,15 +2138,13 @@ int get_val(struct script_state* st, struct script_data* data)
 				data->type = C_INT;
 				data->u.num = 0;
 			}
-			return 0;
+			return;
 		}
 	}
 
 	if( postfix == '$' )
 	{// string variable
 
-		data->type = C_CONSTSTR;
-
 		switch( prefix )
 		{
 		case '@':
@@ -2172,8 +2173,16 @@ int get_val(struct script_state* st, struct script_data* data)
 			break;
 		}
 
-		if( data->u.str == NULL )
+		if( data->u.str == NULL || data->u.str[0] == '\0' )
+		{// empty string
+			data->type = C_CONSTSTR;
 			data->u.str = "";
+		}
+		else
+		{// duplicate string
+			data->type = C_STR;
+			data->u.str = aStrdup(data->u.str);
+		}
 
 	}
 	else
@@ -2220,7 +2229,7 @@ int get_val(struct script_state* st, struct script_data* data)
 
 	}
 
-	return 0;
+	return;
 }
 
 /// Retrieves the value of a reference identified by uid (variable, constant, param)