projects
/
rocksndiamonds.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
rnd-19990822-1-src
[rocksndiamonds.git]
/
src
/
pcx.c
diff --git
a/src/pcx.c
b/src/pcx.c
index 514d30de6041f7683a86e96cffed79e474767357..a5fd0c92819bef9931867f43d0eda76f744886b6 100644
(file)
--- a/
src/pcx.c
+++ b/
src/pcx.c
@@
-45,6
+45,9
@@
struct PCX_Header
unsigned char filler[58]; /* fill to struct size of 128 */
};
unsigned char filler[58]; /* fill to struct size of 128 */
};
+/* global PCX error value */
+int errno_pcx = PCX_Success;
+
static byte *PCX_ReadBitmap(Image *image, byte *buffer_ptr, byte *buffer_last)
{
/* Run Length Encoding: If the two high bits are set,
static byte *PCX_ReadBitmap(Image *image, byte *buffer_ptr, byte *buffer_last)
{
/* Run Length Encoding: If the two high bits are set,
@@
-127,21
+130,29
@@
Image *Read_PCX_to_Image(char *filename)
int width, height, depth;
int i;
int width, height, depth;
int i;
+ errno_pcx = PCX_Success;
+
if (!(file = fopen(filename, "r")))
if (!(file = fopen(filename, "r")))
+ {
+ errno_pcx = PCX_OpenFailed;
return NULL;
return NULL;
+ }
if (fseek(file, 0, SEEK_END) == -1)
{
fclose(file);
if (fseek(file, 0, SEEK_END) == -1)
{
fclose(file);
+ errno_pcx = PCX_ReadFailed;
return NULL;
}
file_length = ftell(file);
rewind(file);
return NULL;
}
file_length = ftell(file);
rewind(file);
- if (file_length < PCX_HEADER_SIZE
+ PCX_COLORMAP_SIZE
)
+ if (file_length < PCX_HEADER_SIZE)
{
{
+ /* PCX file is too short to contain a valid PCX header */
fclose(file);
fclose(file);
+ errno_pcx = PCX_FileInvalid;
return NULL;
}
return NULL;
}
@@
-150,6
+161,7
@@
Image *Read_PCX_to_Image(char *filename)
if (fread(file_buffer, 1, file_length, file) != file_length)
{
fclose(file);
if (fread(file_buffer, 1, file_length, file) != file_length)
{
fclose(file);
+ errno_pcx = PCX_ReadFailed;
return NULL;
}
return NULL;
}
@@
-176,6
+188,7
@@
Image *Read_PCX_to_Image(char *filename)
width < 0 || height < 0)
{
free(file_buffer);
width < 0 || height < 0)
{
free(file_buffer);
+ errno_pcx = PCX_FileInvalid;
return NULL;
}
return NULL;
}
@@
-185,6
+198,7
@@
Image *Read_PCX_to_Image(char *filename)
filename, pcx.xmax, pcx.ymax,
pcx.color_planes);
printf("depth: %d\n", pcx.bits_per_pixel);
filename, pcx.xmax, pcx.ymax,
pcx.color_planes);
printf("depth: %d\n", pcx.bits_per_pixel);
+ printf("color_planes: %d\n", pcx.color_planes);
printf("bytes_per_line: %d\n", pcx.bytes_per_line);
printf("palette type: %s\n",
(pcx.palette_type == 1 ? "color" :
printf("bytes_per_line: %d\n", pcx.bytes_per_line);
printf("palette type: %s\n",
(pcx.palette_type == 1 ? "color" :
@@
-202,6
+216,15
@@
Image *Read_PCX_to_Image(char *filename)
{
free(file_buffer);
freeImage(image);
{
free(file_buffer);
freeImage(image);
+ errno_pcx = PCX_FileInvalid;
+ return NULL;
+ }
+
+ if (file_length < PCX_HEADER_SIZE + PCX_COLORMAP_SIZE)
+ {
+ /* PCX file is too short to contain a valid 256 colors colormap */
+ fclose(file);
+ errno_pcx = PCX_ColorFailed;
return NULL;
}
return NULL;
}
@@
-210,6
+233,7
@@
Image *Read_PCX_to_Image(char *filename)
{
free(file_buffer);
freeImage(image);
{
free(file_buffer);
freeImage(image);
+ errno_pcx = PCX_ColorFailed;
return NULL;
}
return NULL;
}