diag/geodsp: Avoid large intermediate files
authorH. Peter Anvin <hpa@zytor.com>
Mon, 25 Apr 2011 19:39:08 +0000 (12:39 -0700)
committerH. Peter Anvin <hpa@zytor.com>
Mon, 25 Apr 2011 19:39:08 +0000 (12:39 -0700)
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@zytor.com>
diag/geodsp/Makefile
diag/geodsp/mk-lba-img.c

index 6af0d2d..44002bb 100644 (file)
@@ -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)
index 795de1a..9de6624 100644 (file)
 
 #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;
 }