svn commit: trunk/busybox/miscutils

vda at busybox.net vda at busybox.net
Thu Oct 11 19:38:59 UTC 2007


Author: vda
Date: 2007-10-11 12:38:59 -0700 (Thu, 11 Oct 2007)
New Revision: 20224

Log:
mt: eliminate vector of structures with pointers (bad for libbusybox).
It's a win for static build too:

function                                             old     new   delta
opcode_name                                            -     213    +213
opcode_value                                           -      68     +68
mt_main                                              281     256     -25
opcodes                                              280       -    -280
------------------------------------------------------------------------------
(add/remove: 2/1 grow/shrink: 0/1 up/down: 281/-305)          Total: -24 bytes
   text    data     bss     dec     hex filename
 767403     974    9420  777797   bde45 busybox_old
 767224     974    9420  777618   bdd92 busybox_unstripped



Modified:
   trunk/busybox/miscutils/mt.c


Changeset:
Modified: trunk/busybox/miscutils/mt.c
===================================================================
--- trunk/busybox/miscutils/mt.c	2007-10-11 16:02:36 UTC (rev 20223)
+++ trunk/busybox/miscutils/mt.c	2007-10-11 19:38:59 UTC (rev 20224)
@@ -6,58 +6,87 @@
 #include "libbb.h"
 #include <sys/mtio.h>
 
-struct mt_opcodes {
-	const char *name;
-	short value;
-};
-
 /* missing: eod/seod, stoptions, stwrthreshold, densities */
-static const struct mt_opcodes opcodes[] = {
-	{"bsf", MTBSF},
-	{"bsfm", MTBSFM},
-	{"bsr", MTBSR},
-	{"bss", MTBSS},
-	{"datacompression", MTCOMPRESSION},
-	{"eom", MTEOM},
-	{"erase", MTERASE},
-	{"fsf", MTFSF},
-	{"fsfm", MTFSFM},
-	{"fsr", MTFSR},
-	{"fss", MTFSS},
-	{"load", MTLOAD},
-	{"lock", MTLOCK},
-	{"mkpart", MTMKPART},
-	{"nop", MTNOP},
-	{"offline", MTOFFL},
-	{"rewoffline", MTOFFL},
-	{"ras1", MTRAS1},
-	{"ras2", MTRAS2},
-	{"ras3", MTRAS3},
-	{"reset", MTRESET},
-	{"retension", MTRETEN},
-	{"rewind", MTREW},
-	{"seek", MTSEEK},
-	{"setblk", MTSETBLK},
-	{"setdensity", MTSETDENSITY},
-	{"drvbuffer", MTSETDRVBUFFER},
-	{"setpart", MTSETPART},
-	{"tell", MTTELL},
-	{"wset", MTWSM},
-	{"unload", MTUNLOAD},
-	{"unlock", MTUNLOCK},
-	{"eof", MTWEOF},
-	{"weof", MTWEOF},
-	{0, 0}
+static const short opcode_value[] = {
+	MTBSF,
+	MTBSFM,
+	MTBSR,
+	MTBSS,
+	MTCOMPRESSION,
+	MTEOM,
+	MTERASE,
+	MTFSF,
+	MTFSFM,
+	MTFSR,
+	MTFSS,
+	MTLOAD,
+	MTLOCK,
+	MTMKPART,
+	MTNOP,
+	MTOFFL,
+	MTOFFL,
+	MTRAS1,
+	MTRAS2,
+	MTRAS3,
+	MTRESET,
+	MTRETEN,
+	MTREW,
+	MTSEEK,
+	MTSETBLK,
+	MTSETDENSITY,
+	MTSETDRVBUFFER,
+	MTSETPART,
+	MTTELL,
+	MTWSM,
+	MTUNLOAD,
+	MTUNLOCK,
+	MTWEOF,
+	MTWEOF
 };
 
+static const char opcode_name[] ALIGN1 =
+	"bsf"             "\0"
+	"bsfm"            "\0"
+	"bsr"             "\0"
+	"bss"             "\0"
+	"datacompression" "\0"
+	"eom"             "\0"
+	"erase"           "\0"
+	"fsf"             "\0"
+	"fsfm"            "\0"
+	"fsr"             "\0"
+	"fss"             "\0"
+	"load"            "\0"
+	"lock"            "\0"
+	"mkpart"          "\0"
+	"nop"             "\0"
+	"offline"         "\0"
+	"rewoffline"      "\0"
+	"ras1"            "\0"
+	"ras2"            "\0"
+	"ras3"            "\0"
+	"reset"           "\0"
+	"retension"       "\0"
+	"rewind"          "\0"
+	"seek"            "\0"
+	"setblk"          "\0"
+	"setdensity"      "\0"
+	"drvbuffer"       "\0"
+	"setpart"         "\0"
+	"tell"            "\0"
+	"wset"            "\0"
+	"unload"          "\0"
+	"unlock"          "\0"
+	"eof"             "\0"
+	"weof"            "\0";
+
 int mt_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
 int mt_main(int argc, char **argv)
 {
 	const char *file = "/dev/tape";
-	const struct mt_opcodes *code = opcodes;
 	struct mtop op;
 	struct mtpos position;
-	int fd, mode;
+	int fd, mode, idx;
 
 	if (argc < 2) {
 		bb_show_usage();
@@ -72,24 +101,18 @@
 		argc -= 2;
 	}
 
-	while (code->name != 0) {
-		if (strcmp(code->name, argv[1]) == 0)
-			break;
-		code++;
-	}
+	idx = index_in_strings(opcode_name, argv[1]);
 
-	if (code->name == 0) {
-		bb_error_msg("unrecognized opcode %s", argv[1]);
-		return EXIT_FAILURE;
-	}
+	if (idx < 0)
+		bb_error_msg_and_die("unrecognized opcode %s", argv[1]);
 
-	op.mt_op = code->value;
+	op.mt_op = opcode_value[idx];
 	if (argc >= 3)
 		op.mt_count = xatoi_u(argv[2]);
 	else
 		op.mt_count = 1;		/* One, not zero, right? */
 
-	switch (code->value) {
+	switch (opcode_value[idx]) {
 		case MTWEOF:
 		case MTERASE:
 		case MTWSM:
@@ -104,10 +127,10 @@
 
 	fd = xopen(file, mode);
 
-	switch (code->value) {
+	switch (opcode_value[idx]) {
 		case MTTELL:
 			ioctl_or_perror_and_die(fd, MTIOCPOS, &position, "%s", file);
-			printf("At block %d.\n", (int) position.mt_blkno);
+			printf("At block %d\n", (int) position.mt_blkno);
 			break;
 
 		default:




More information about the busybox-cvs mailing list