+++ /dev/null
-/*\r
- *************************************************************************\r
- *\r
- * PCX_EXAM.C - PCX_LIB File Header Examination Utility\r
- *\r
- * Version: 1.00B\r
- *\r
- * History: 91/02/14 - Created\r
- * 91/04/01 - Release 1.00A\r
- * 91/04/06 - Release 1.00B\r
- *\r
- * Compiler: Microsoft C V6.0\r
- *\r
- * Author: Ian Ashdown, P.Eng.\r
- * byHeart Software\r
- * 620 Ballantree Road\r
- * West Vancouver, B.C.\r
- * Canada V7S 1W3\r
- * Tel. (604) 922-6148\r
- * Fax. (604) 987-7621\r
- *\r
- * Copyright: Public Domain\r
- *\r
- *************************************************************************\r
- */\r
-\f\r
-/*\r
- *************************************************************************\r
- *\r
- * PORTABILITY NOTES\r
- *\r
- * 1. When porting this program to other processors, remember that words\r
- * are stored by 80x86-based machines in the big-endian format. That\r
- * is, the eight least significant bits (lower byte) are stored\r
- * first, followed by the eight most significant bits (upper byte).\r
- * If PCX-format files are transferred to little-endian machines\r
- * (such as those based on 680x0 and Z8000 processors), the order of\r
- * bytes within each word will have to be reversed before they can \r
- * be interpreted. (This applies to the file header only, since the\r
- * encoded image data and optional 256-color palette are stored as\r
- * bytes.)\r
- *\r
- ************************************************************************* \r
- */\r
-\f\r
-/* INCLUDE FILES */\r
-\r
-#include <stdio.h>\r
-#include <stdlib.h>\r
-#include "pcx_int.h"\r
-\f\r
-/* FORWARD REFERENCES */\r
-\f\r
-/* GLOBALS */\r
-\f\r
-/* PUBLIC FUNCTIONS */\r
-\r
-/*\r
- *************************************************************************\r
- *\r
- * MAIN - Executive Function\r
- *\r
- * Purpose: To read and display a PCX-format image file header.\r
- *\r
- * Setup: int main\r
- * (\r
- * int argc,\r
- * char **argv\r
- * )\r
- *\r
- * Where: argc is the number of command-line arguments.\r
- * argv is a pointer to an array of command-line argument\r
- * strings.\r
- *\r
- * Return: 0 if successful; otherwise 2.\r
- *\r
- * Result: The file header information is written to "stdout".\r
- *\r
- * Note: Usage is:\r
- *\r
- * PCX_EXAM filename\r
- *\r
- * where "filename" is the name of a PCX-format image file.\r
- *\r
- *************************************************************************\r
- */\r
-\r
-int main\r
-(\r
- int argc,\r
- char **argv\r
-)\r
-{\r
- char *vers; /* Version number string pointer */\r
- char *pal_type; /* Palette type string pointer */\r
- int range; /* Palette range */\r
- int indicator; /* Extended palette indicator byte */\r
- BOOL status = TRUE; /* Return status */\r
- BOOL ep_flag = FALSE; /* Extended palette flag */\r
- FILE *fp; /* File pointer */\r
- PCX_HDR *hdrp; /* File header structure pointer */\r
- PCX_PAL *ext_palettep; /* Extended palette pointer */\r
-\r
- /* Display program title */\r
-\r
- puts("\nPCX_EXAM - PCX Image File Examination Utility\n");\r
-\r
- /* Check for filename */\r
-\r
- if (argc < 2)\r
- {\r
- /* Display usage information */\r
-\r
- fputs(" Synopsis: This public domain utility displays inf", stderr);\r
- fputs("ormation contained in the\n header of a ", stderr);\r
- fputs("Paintbrush (R) PCX-format image file.\n\n Usage: ", stderr);\r
- fputs(" PCX_EXAM filename\n\n Example: PCX_EXAM picture", stderr);\r
- fputs(".pcx\n", stderr);\r
-\r
- return (2);\r
- }\r
-\r
- /* Allocate a PCX file header buffer */\r
-\r
- if ((hdrp = (PCX_HDR *) malloc(sizeof(PCX_HDR))) == (PCX_HDR *) NULL)\r
- {\r
- fputs("ERROR: out of memory\n", stderr);\r
- return (2);\r
- }\r
-\r
- /* Open the PCX image file in binary mode */\r
-\r
- if ((fp = fopen(argv[1], "rb")) == (FILE *) NULL)\r
- {\r
- fprintf(stderr, "ERROR: cannot open file %s\n", argv[1]);\r
-\r
- free(hdrp); /* Free the file header memory */\r
-\r
- return (2);\r
- }\r
-\r
- /* Read the file header */\r
-\r
- if (status == TRUE)\r
- if (fseek(fp, 0L, SEEK_SET) != 0)\r
- {\r
- fprintf(stderr, "ERROR: cannot read file %s\n", argv[1]);\r
- status = FALSE;\r
- }\r
-\r
- if (status == TRUE)\r
- if (fread(hdrp, sizeof(PCX_HDR), 1, fp) != 1)\r
- {\r
- fprintf(stderr, "ERROR: cannot read file %s\n", argv[1]);\r
- status = FALSE;\r
- }\r
-\r
- /* Validate the PCX file format */\r
-\r
- if (status == TRUE)\r
- if ((hdrp->pcx_id != 0x0a) || (hdrp->encoding != 1))\r
- {\r
- fprintf(stderr, "ERROR: file %s not valid PCX format\n", argv[1]);\r
- status = FALSE;\r
- }\r
-\r
- /* Determine the version number */\r
-\r
- switch (hdrp->version)\r
- {\r
- case 0:\r
-\r
- vers = "PC Paintbrush 2.5";\r
-\r
- break;\r
-\r
- case 2:\r
-\r
- vers = "PC Paintbrush 2.8 (with palette information)";\r
-\r
- break;\r
-\r
- case 3:\r
-\r
- vers = "PC Paintbrush 2.8 (without palette information)";\r
-\r
- break;\r
-\r
- case 4:\r
-\r
- vers = "PC Paintbrush for Windows (not 3.0)";\r
-\r
- break;\r
-\r
- case 5:\r
-\r
- vers = "PC Paintbrush 3.0 and greater";\r
-\r
- break;\r
-\r
- default:\r
-\r
- vers = "Unknown version";\r
-\r
- break;\r
- }\r
-\r
- /* Display the PCX file header information */\r
-\r
- printf("PCX filename: %s\n", argv[1]);\r
- printf("Version: %s\n", vers);\r
- printf("Encoding: %s\n", hdrp->encoding == 1 ? "Run length" :\r
- "Unknown");\r
- printf("%d bits per pixel\n", hdrp->bppixel);\r
- printf("Image from (%d, %d) to (%d, %d) pixels.\n", hdrp->xul,\r
- hdrp->yul, hdrp->xlr, hdrp->ylr);\r
- printf("Created on a device with %d x %d dpi resolution\n",\r
- hdrp->horz_res, hdrp->vert_res);\r
- printf("Number of color planes: %d\n", hdrp->nplanes);\r
- printf("Bytes per color plane scan line: %d\n", hdrp->bppscan);\r
-\r
- switch (hdrp->palette_type & PCX_PAL_MASK)\r
- {\r
- case 1:\r
-\r
- pal_type = "color or B&W";\r
-\r
- break;\r
-\r
- case 2:\r
-\r
- pal_type = "grayscale";\r
-\r
- break;\r
-\r
- default:\r
-\r
- pal_type = "unknown";\r
-\r
- break;\r
- }\r
-\r
- printf("Palette type: %s\n", pal_type);\r
-\r
- /* Check for extended (256-color) palette */\r
-\r
- if (hdrp->version == 5)\r
- {\r
- /* Check for valid palette indicator byte */\r
-\r
- if (fseek(fp, -769L, SEEK_END) != 0)\r
- {\r
- fprintf(stderr, "ERROR: cannot read file %s\n", argv[1]);\r
- status = FALSE;\r
- }\r
-\r
- if (status == TRUE)\r
- {\r
- if ((indicator = getc(fp)) == PCX_EPAL_FLAG)\r
- {\r
- /* Allocate an extended palette buffer */\r
-\r
- if ((ext_palettep = (PCX_PAL *) calloc(sizeof(PCX_PAL),\r
- PCX_EPAL_SIZE)) == (PCX_PAL *) NULL)\r
- {\r
- fputs("ERROR: out of memory\n", stderr);\r
- status = FALSE;\r
- }\r
-\r
- /* Read the extended palette */\r
-\r
- if (status == TRUE)\r
- {\r
- if (fread(ext_palettep, sizeof(PCX_PAL), PCX_EPAL_SIZE, fp) !=\r
- PCX_EPAL_SIZE)\r
- {\r
- free(ext_palettep); /* Free extended palette buffer */\r
- status = FALSE;\r
- }\r
- }\r
-\r
- ep_flag = TRUE; /* Indicate extended palette exists */\r
- }\r
- }\r
- }\r
-\r
- if (status == TRUE)\r
- if (ep_flag == TRUE)\r
- {\r
- /* Display extended (256-color) palette */\r
-\r
- puts("Extended 256-color palette:\n");\r
-\r
- puts("COLOR RED GREEN BLUE\n");\r
-\r
- for (range = 0; range < PCX_EPAL_SIZE; range++)\r
- printf(" %03d %2x %2x %2x\n", range,\r
- ext_palettep[range].red, ext_palettep[range].green,\r
- ext_palettep[range].blue);\r
-\r
- putchar('\n');\r
-\r
- free(ext_palettep); /* Free the extended palette */\r
- }\r
- else\r
- {\r
- /* Display file header palette */\r
-\r
- puts("File header color palette:\n");\r
-\r
- printf("RED ... ");\r
-\r
- for (range = 0; range < PCX_PAL_SIZE; range++)\r
- printf("%2x ", hdrp->palette[range].red);\r
-\r
- printf("\nGREEN ... ");\r
-\r
- for (range = 0; range < PCX_PAL_SIZE; range++)\r
- printf("%2x ", hdrp->palette[range].green);\r
-\r
- printf("\nBLUE ... ");\r
-\r
- for (range = 0; range < PCX_PAL_SIZE; range++)\r
- printf("%2x ", hdrp->palette[range].blue);\r
-\r
- putchar('\n');\r
- }\r
-\r
- if (fclose(fp) == EOF) /* Close the file */\r
- {\r
- fprintf(stderr, "Error: cannot close file %s\n", argv[1]);\r
- status = FALSE;\r
- }\r
-\r
- free (hdrp); /* Free the file header buffer */\r
-\r
- return (0);\r
-}\r
-\r