浏览代码

- Cleaned atcommand_param against overflows and also to make it standard C so it may compile with the Borland C.
- Modified Charcommand_stats to make it standard C as well.


git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@6037 54d463be-8e91-2dee-dedb-b68131a5f0ec

skotlex 19 年之前
父节点
当前提交
4d97159683
共有 3 个文件被更改,包括 58 次插入30 次删除
  1. 5 0
      Changelog-Trunk.txt
  2. 26 17
      src/map/atcommand.c
  3. 27 13
      src/map/charcommand.c

+ 5 - 0
Changelog-Trunk.txt

@@ -3,6 +3,11 @@ 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.
 
+
+2006/04/13
+	* atcommand_param and charcommand_stats to make them standard C (so it may
+	  compile with the Borland C). Also cleaned atcommand_param against
+	  overflows. [Skotlex]
 2006/04/12
 	* Removed the noteleport mapflags from two juperos maps [MasterOfMuppets]
 	- added the nopenalty mapflag to hugel.gat

+ 26 - 17
src/map/atcommand.c

@@ -4135,13 +4135,18 @@ int atcommand_param(
 	const int fd, struct map_session_data* sd,
 	const char* command, const char* message)
 {
-	int i, index, value = 0, new_value;
+	int index, value = 0, new_value, max;
 	const char* param[] = { "@str", "@agi", "@vit", "@int", "@dex", "@luk", NULL };
-	short* status[] = {
-		&sd->status.str,  &sd->status.agi, &sd->status.vit,
-		&sd->status.int_, &sd->status.dex, &sd->status.luk
-	};
+	short* status[6];
+ 	//We don't use direct initialization because it isn't part of the C standard.
 	nullpo_retr(-1, sd);
+	
+	status[0] = &sd->status.str;
+	status[1] = &sd->status.agi;
+	status[2] = &sd->status.vit;
+	status[3] = &sd->status.int_;
+	status[4] = &sd->status.dex;
+	status[5] = &sd->status.luk;
 
 	memset(atcmd_output, '\0', sizeof(atcmd_output));
 
@@ -4152,24 +4157,28 @@ int atcommand_param(
 	}
 
 	index = -1;
-	for (i = 0; param[i] != NULL; i++) {
-		if (strcmpi(command, param[i]) == 0) {
-			index = i;
+	for (index = 0; index < sizeof(param)/sizeof(param[0]); index++) {
+		if (strcmpi(command, param[index]) == 0)
 			break;
-		}
 	}
-	if (index < 0 || index > MAX_STATUS_TYPE) { // normaly impossible...
+	if (index == sizeof(param)/sizeof(param[0]) || index > MAX_STATUS_TYPE) {
+		// normaly impossible...
 		sprintf(atcmd_output, "Please, enter a valid value (usage: @str,@agi,@vit,@int,@dex,@luk <+/-adjustement>).");
 		clif_displaymessage(fd, atcmd_output);
 		return -1;
 	}
-
-	new_value = (int)*status[index] + value;
-	if (value > 0 && (value > pc_maxparameter(sd) || new_value > pc_maxparameter(sd))) // fix positiv overflow
-		new_value = pc_maxparameter(sd); 
-	else if (value < 0 && (value < -(int)pc_maxparameter(sd) || new_value < 1)) // fix negativ overflow
-		new_value = 1;
-
+	if (value >0) {
+		max = pc_maxparameter(sd);
+		if (*status[index] > max - value)
+			new_value = max;
+		else
+			new_value = *status[index] + value;
+	} else {
+		if (*status[index] <= -value)
+			new_value = 1;
+		else
+			new_value = *status[index] + value;
+	}
 	if (new_value != (int)*status[index]) {
 		*status[index] = new_value;
 		clif_updatestatus(sd, SP_STR + index);

+ 27 - 13
src/map/charcommand.c

@@ -480,21 +480,35 @@ int charcommand_stats(
 			const char* format;
 			int value;
 		} output_table[] = {
-			{ "Base Level - %d", pl_sd->status.base_level },
-			{ job_jobname, pl_sd->status.job_level },
-			{ "Hp - %d",    pl_sd->status.hp },
-			{ "MaxHp - %d", pl_sd->status.max_hp },
-			{ "Sp - %d",    pl_sd->status.sp },
-			{ "MaxSp - %d", pl_sd->status.max_sp },
-			{ "Str - %3d",  pl_sd->status.str },
-			{ "Agi - %3d",  pl_sd->status.agi },
-			{ "Vit - %3d",  pl_sd->status.vit },
-			{ "Int - %3d",  pl_sd->status.int_ },
-			{ "Dex - %3d",  pl_sd->status.dex },
-			{ "Luk - %3d",  pl_sd->status.luk },
-			{ "Zeny - %d",  pl_sd->status.zeny },
+			{ "Base Level - %d", 0 },
+			{ job_jobname, 0 },
+			{ "Hp - %d", 0 },
+			{ "MaxHp - %d", 0 },
+			{ "Sp - %d", 0 },
+			{ "MaxSp - %d", 0 },
+			{ "Str - %3d", 0 },
+			{ "Agi - %3d", 0 },
+			{ "Vit - %3d", 0 },
+			{ "Int - %3d", 0 },
+			{ "Dex - %3d", 0 },
+			{ "Luk - %3d", 0 },
+			{ "Zeny - %d", 0 },
 			{ NULL, 0 }
 		};
+		//direct array initialization with variables is not standard C compliant.
+		output_table[0].value = pl_sd->status.base_level;
+		output_table[1].value = pl_sd->status.job_level;
+		output_table[2].value = pl_sd->status.hp;
+		output_table[3].value = pl_sd->status.max_hp;
+		output_table[4].value = pl_sd->status.sp;
+		output_table[5].value = pl_sd->status.max_sp;
+		output_table[6].value = pl_sd->status.str;
+		output_table[7].value = pl_sd->status.agi;
+		output_table[8].value = pl_sd->status.vit;
+		output_table[9].value = pl_sd->status.int_;
+		output_table[10].value = pl_sd->status.dex;
+		output_table[11].value = pl_sd->status.luk;
+		output_table[12].value = pl_sd->status.zeny;
 		sprintf(job_jobname, "Job - %s %s", job_name(pl_sd->status.class_), "(level %d)");
 		sprintf(output, msg_table[53], pl_sd->status.name); // '%s' stats:
 		clif_displaymessage(fd, output);