hush: initial stab at brace expansion support
[oweals/busybox.git] / miscutils / fbsplash.c
index a0f7d0dc20b0cfbfe56f104f3fd6989c7e62d350..4560bb2e99e1a135907699f5501520797b38f5c7 100644 (file)
@@ -221,17 +221,36 @@ static void fb_drawimage(void)
        unsigned char *pixline;
        unsigned i, j, width, height, line_size;
 
-       theme_file = xfopen_stdin(G.image_filename);
+       if (LONE_DASH(G.image_filename))
+               theme_file = stdin;
+       else {
+               int fd = open_zipped(G.image_filename);
+               if (fd < 0)
+                       bb_simple_perror_msg_and_die(G.image_filename);
+               theme_file = xfdopen_for_read(fd);
+       }
        head = xmalloc(256);
 
-       // parse ppm header
+       /* parse ppm header
+        * - A ppm image’s magic number is the two characters "P6".
+        * - Whitespace (blanks, TABs, CRs, LFs).
+        * - A width, formatted as ASCII characters in decimal.
+        * - Whitespace.
+        * - A height, again in ASCII decimal.
+        * - Whitespace.
+        * - The maximum color value (Maxval), again in ASCII decimal. Must be
+        *   less than 65536.
+        * - Newline or other single whitespace character.
+        * - A raster of Width * Height pixels in triplets of rgb
+        *   in pure binary by 1 (or not implemented 2) bytes.
+        */
        while (1) {
                if (fgets(head, 256, theme_file) == NULL
                        /* do not overrun the buffer */
                        || strlen(bb_common_bufsiz1) >= sizeof(bb_common_bufsiz1) - 256)
                        bb_error_msg_and_die("bad PPM file '%s'", G.image_filename);
 
-               ptr = memchr(head, '#', 256);
+               ptr = memchr(skip_whitespace(head), '#', 256);
                if (ptr != NULL)
                        *ptr = 0; /* ignore comments */
                strcat(bb_common_bufsiz1, head);
@@ -245,7 +264,9 @@ static void fb_drawimage(void)
 
        if (ENABLE_FEATURE_CLEAN_UP)
                free(head);
-
+       if (width != G.scr_var.xres || height != G.scr_var.yres)
+               bb_error_msg_and_die("PPM %dx%d does not match screen %dx%d",
+                                                        width, height, G.scr_var.xres, G.scr_var.yres);
        line_size = width*3;
        if (width > G.scr_var.xres)
                width = G.scr_var.xres;
@@ -377,9 +398,7 @@ int fbsplash_main(int argc UNUSED_PARAM, char **argv)
                num = atoi(num_buf);
                if (isdigit(num_buf[0]) && (num <= 100)) {
 #if DEBUG
-                       char strVal[10];
-                       sprintf(strVal, "%d", num);
-                       DEBUG_MESSAGE(strVal);
+                       DEBUG_MESSAGE(itoa(num));
 #endif
                        fb_drawprogressbar(num);
                }