--- ./stage2/graphics.c.xpmjunk 2007-10-04 16:49:22.000000000 +0200 +++ ./stage2/graphics.c 2007-10-04 19:50:54.000000000 +0200 @@ -337,6 +337,35 @@ return 0; } +/* Open the file, and search for a valid XPM header. Return 1 if one is found, + * leaving the current position as the start of the next line. Else, + * return 0. + */ +int xpm_open(const char *s) { + char buf, prev, target[]="/* XPM */\n"; + int pos=0; + + if (!grub_open(s)) + return 0; + + prev='\n'; + buf=0; + do { + if (grub_read(&buf, 1) != 1) { + grub_close(); + return 0; + } + if ((pos == 0 && prev == '\n') || pos > 0) { + if (buf == target[pos]) + pos++; + else + pos=0; + } + prev=buf; + } while (target[pos]); + return 1; +} + /* Read in the splashscreen image and set the palette up appropriately. * Format of splashscreen is an xpm (can be gzipped) with 16 colors and * 640x480. */ @@ -346,14 +375,8 @@ unsigned char base, mask, *s1, *s2, *s4, *s8; unsigned i, len, idx, colors, x, y, width, height; - if (!grub_open(s)) - return 0; - - /* read header */ - if (!grub_read((char*)&buf, 10) || grub_memcmp(buf, "/* XPM */\n", 10)) { - grub_close(); + if (!xpm_open(s)) return 0; - } /* parse info */ while (grub_read(&c, 1)) {