[syslinux:master] diag/geodsp: Avoid large intermediate files

syslinux-bot for H. Peter Anvin hpa at zytor.com
Mon Apr 25 12:42:21 PDT 2011


Commit-ID:  5d138981b4666d39963dfeca0f1f33fcb16e26f0
Gitweb:     http://syslinux.zytor.com/commit/5d138981b4666d39963dfeca0f1f33fcb16e26f0
Author:     H. Peter Anvin <hpa at zytor.com>
AuthorDate: Mon, 25 Apr 2011 12:39:08 -0700
Committer:  H. Peter Anvin <hpa at zytor.com>
CommitDate: Mon, 25 Apr 2011 12:39:08 -0700

diag/geodsp: Avoid large intermediate files

Allow the generation program mk-lba-img to merge the prefix file and
output to stdout, so it can be fed directly to the compressor; that
way we avoid generating huge intermediate files on disk.

Signed-off-by: H. Peter Anvin <hpa at zytor.com>


---
 diag/geodsp/Makefile     |   18 +++++----------
 diag/geodsp/mk-lba-img.c |   53 ++++++++++++++++++++++++++++++---------------
 2 files changed, 41 insertions(+), 30 deletions(-)

diff --git a/diag/geodsp/Makefile b/diag/geodsp/Makefile
index 6af0d2d..44002bb 100644
--- a/diag/geodsp/Makefile
+++ b/diag/geodsp/Makefile
@@ -22,7 +22,7 @@ topdir = ../..
 # include $(topdir)/MCONFIG.embedded
 coredir = $(topdir)/core
 
-BTARGET = geodsp1s.bin geodspms.bin mk-lba-img \
+BTARGET = geodsp1s.bin geodspms.bin \
 	geodsp1s.img.xz geodspms.img.xz
 #	lba-1s.img.xz lba-ms.img.xz
   # lba-1s.img lba-ms.img
@@ -36,29 +36,23 @@ all: $(BTARGET)
 # .PRECIOUS: lba-%.img
 
 # Higher compression levels result in larger files
-%.img.xz: %.img
-	xz -k0f $<
+%.img.xz: %.bin mk-lba-img
+	./mk-lba-img < $< | xz -0f > $@ || ( rm -f $@ ; false )
 
 %.img.gz: %.img
-	gzip -9c $< > $@
-
-%.img: %.bin lba.img
-	(cp -a lba.img $@ && dd conv=notrunc if=$< of=$@) || rm -f $@
+	./mk-lba-img < $< | gzip -9 > $@ || ( rm -f $@ ; false )
 
 %.bin: %.asm $(coredir)/writehex.inc $(coredir)/macros.inc $(coredir)/diskboot.inc
 	nasm $(NASMOPT) -o $@ -l $(@:.bin=.lst) $<
 
 mk-lba-img: mk-lba-img.c
-	gcc -o $@ $<
-
-lba.img: mk-lba-img
-	./$< $@
+	gcc -g -O -o $@ $<
 
 tidy dist:
 	rm -Rf *.img
 
 clean: tidy
-	rm -f *.lst *.bin *_bin.c
+	rm -f *.lst *.bin *_bin.c mk-lba-img
 
 spotless: clean
 	rm -f $(BTARGET)
diff --git a/diag/geodsp/mk-lba-img.c b/diag/geodsp/mk-lba-img.c
index 795de1a..9de6624 100644
--- a/diag/geodsp/mk-lba-img.c
+++ b/diag/geodsp/mk-lba-img.c
@@ -24,16 +24,18 @@
 
 #define NUM_SECT (256*63+1)
 #define BPS (512)
-#define SECT_INT (512 / sizeof(int))
+#define SECT_INT (BPS / sizeof(unsigned int))
 
 typedef unsigned char uint8_t;
 typedef unsigned int uint32_t;
 
-const char DEF_FN[] = "lba.img";
+const char DEF_FN[] = "-";
 
 int main(int argc, char *argv[])
 {
-	int i, j, b[SECT_INT], rv = 0, one = 0;
+	int i, rv = 0, one = 0;
+	unsigned int lba, b[SECT_INT];
+	int len;
 	FILE *f;
 	uint8_t tt = 0;
 	const char *fn;
@@ -53,23 +55,38 @@ int main(int argc, char *argv[])
 		fn = DEF_FN;
 	}
 
-	f = fopen(fn, "w");
+	if (!strcmp(fn, "-"))
+		f = stdout;
+	else
+		f = fopen(fn, "w");
 
-	if (f) {
-		for (i = 0; i < NUM_SECT; i++) {
-			if (one) {
-				b[0] = i;
-			} else {
-				for (j = 0; j < (512 / sizeof(int)); j++) {
-					b[j] = i;
-				}
-			}
-			fwrite(b, 512, 1, f);
+	if (!f) {
+		fprintf(stderr, "%s: %s: unable to open for writing: %s\n",
+			argv[0], fn, strerror(errno));
+		return 1;
+	}
+
+	lba = 0;
+	while ((len = fread(b, BPS, 1, stdin))) {
+		if (len < BPS)
+			memset((char *)b + len, 0, BPS - len);
+		fwrite(b, BPS, 1, f);
+		lba++;
+	}
+
+	while (lba < NUM_SECT) {
+		if (one) {
+			b[0] = lba;
+		} else {
+			for (i = 0; i < SECT_INT; i++)
+				b[i] = lba;
 		}
-		fclose(f);
-	} else {
-		puts("Unable to open for writing");
-		rv = 1;
+		fwrite(b, BPS, 1, f);
+		lba++;
 	}
+
+	if (f != stdout)
+		fclose(f);
+
 	return rv;
 }



More information about the Syslinux-commits mailing list