svn commit: trunk/busybox/networking

vda at busybox.net vda at busybox.net
Thu Nov 23 15:07:39 UTC 2006


Author: vda
Date: 2006-11-23 07:07:38 -0800 (Thu, 23 Nov 2006)
New Revision: 16646

Log:
ifupdown: save some 100+ bytes of code in addstr()


Modified:
   trunk/busybox/networking/ifupdown.c


Changeset:
Modified: trunk/busybox/networking/ifupdown.c
===================================================================
--- trunk/busybox/networking/ifupdown.c	2006-11-23 13:10:23 UTC (rev 16645)
+++ trunk/busybox/networking/ifupdown.c	2006-11-23 15:07:38 UTC (rev 16646)
@@ -125,6 +125,7 @@
 	/* Found a netmask...  Check if it is dotted quad */
 	if (sscanf(dotted_quad, "%u.%u.%u.%u", &a, &b, &c, &d) != 4)
 		return -1;
+	// FIXME: will be confused by e.g. 255.0.255.0
 	result = count_bits(a);
 	result += count_bits(b);
 	result += count_bits(c);
@@ -133,32 +134,27 @@
 }
 #endif
 
-static void addstr(char **buf, size_t *len, size_t *pos, const char *str, size_t str_length)
+static void addstr(char **bufp, const char *str, size_t str_length)
 {
-	if (*pos + str_length >= *len) {
-		char *newbuf;
-
-		newbuf = xrealloc(*buf, *len * 2 + str_length + 1);
-		*buf = newbuf;
-		*len = *len * 2 + str_length + 1;
-	}
-
-	while (str_length-- >= 1) {
-		(*buf)[(*pos)++] = *str;
-		str++;
-	}
-	(*buf)[*pos] = '\0';
+	/* xasprintf trick will be smaller, but we are often
+	 * called with str_length == 1 - don't want to have
+	 * THAT much of malloc/freeing! */
+	char *buf = *bufp;
+	int len = (buf ? strlen(buf) : 0);
+	str_length++;
+	buf = xrealloc(buf, len + str_length);
+	/* copies at most str_length-1 chars! */
+	safe_strncpy(buf + len, str, str_length);
+	*bufp = buf;
 }
 
 static int strncmpz(const char *l, const char *r, size_t llen)
 {
 	int i = strncmp(l, r, llen);
 
-	if (i == 0) {
+	if (i == 0)
 		return -r[llen];
-	} else {
-		return i;
-	}
+	return i;
 }
 
 static char *get_var(const char *id, size_t idlen, struct interface_defn_t *ifd)
@@ -168,31 +164,27 @@
 	if (strncmpz(id, "iface", idlen) == 0) {
 		char *result;
 		static char label_buf[20];
-		strncpy(label_buf, ifd->iface, 19);
-		label_buf[19]=0;
+		safe_strncpy(label_buf, ifd->iface, sizeof(label_buf));
 		result = strchr(label_buf, ':');
 		if (result) {
-			*result=0;
+			*result = '\0';
 		}
 		return label_buf;
-	} else if (strncmpz(id, "label", idlen) == 0) {
+	}
+	if (strncmpz(id, "label", idlen) == 0) {
 		return ifd->iface;
-	} else {
-		for (i = 0; i < ifd->n_options; i++) {
-			if (strncmpz(id, ifd->option[i].name, idlen) == 0) {
-				return ifd->option[i].value;
-			}
+	}
+	for (i = 0; i < ifd->n_options; i++) {
+		if (strncmpz(id, ifd->option[i].name, idlen) == 0) {
+			return ifd->option[i].value;
 		}
 	}
-
 	return NULL;
 }
 
 static char *parse(const char *command, struct interface_defn_t *ifd)
 {
-
 	char *result = NULL;
-	size_t pos = 0, len = 0;
 	size_t old_pos[MAX_OPT_DEPTH] = { 0 };
 	int okay[MAX_OPT_DEPTH] = { 1 };
 	int opt_depth = 1;
@@ -200,26 +192,26 @@
 	while (*command) {
 		switch (*command) {
 		default:
-			addstr(&result, &len, &pos, command, 1);
+			addstr(&result, command, 1);
 			command++;
 			break;
 		case '\\':
 			if (command[1]) {
-				addstr(&result, &len, &pos, command + 1, 1);
+				addstr(&result, command + 1, 1);
 				command += 2;
 			} else {
-				addstr(&result, &len, &pos, command, 1);
+				addstr(&result, command, 1);
 				command++;
 			}
 			break;
 		case '[':
 			if (command[1] == '[' && opt_depth < MAX_OPT_DEPTH) {
-				old_pos[opt_depth] = pos;
+				old_pos[opt_depth] = strlen(result);
 				okay[opt_depth] = 1;
 				opt_depth++;
 				command += 2;
 			} else {
-				addstr(&result, &len, &pos, "[", 1);
+				addstr(&result, "[", 1);
 				command++;
 			}
 			break;
@@ -227,12 +219,11 @@
 			if (command[1] == ']' && opt_depth > 1) {
 				opt_depth--;
 				if (!okay[opt_depth]) {
-					pos = old_pos[opt_depth];
-					result[pos] = '\0';
+					result[old_pos[opt_depth]] = '\0';
 				}
 				command += 2;
 			} else {
-				addstr(&result, &len, &pos, "]", 1);
+				addstr(&result, "]", 1);
 				command++;
 			}
 			break;
@@ -252,18 +243,17 @@
 				varvalue = get_var(command, nextpercent - command, ifd);
 
 				if (varvalue) {
-					addstr(&result, &len, &pos, varvalue, strlen(varvalue));
+					addstr(&result, varvalue, strlen(varvalue));
 				} else {
 #ifdef CONFIG_FEATURE_IFUPDOWN_IP
 					/* Sigh...  Add a special case for 'ip' to convert from
 					 * dotted quad to bit count style netmasks.  */
 					if (strncmp(command, "bnmask", 6)==0) {
-						int res;
+						unsigned res;
 						varvalue = get_var("netmask", 7, ifd);
-						if (varvalue && (res=count_netmask_bits(varvalue)) > 0) {
-							char argument[255];
-							sprintf(argument, "%d", res);
-							addstr(&result, &len, &pos, argument, strlen(argument));
+						if (varvalue && (res = count_netmask_bits(varvalue)) > 0) {
+							const char *argument = utoa(res);
+							addstr(&result, argument, strlen(argument));
 							command = nextpercent + 1;
 							break;
 						}
@@ -567,7 +557,7 @@
 	unsigned short length;
 	char *word;
 
-	if ((buf == NULL) || (*buf == NULL) || (**buf == '\0')) {
+	if (!buf || !*buf || !**buf) {
 		return NULL;
 	}
 




More information about the busybox-cvs mailing list