diff options
Diffstat (limited to 'converter')
-rw-r--r-- | converter/ppm/ppmtoterm.c | 138 |
1 files changed, 70 insertions, 68 deletions
diff --git a/converter/ppm/ppmtoterm.c b/converter/ppm/ppmtoterm.c index 81df614e..a6c6d844 100644 --- a/converter/ppm/ppmtoterm.c +++ b/converter/ppm/ppmtoterm.c @@ -22,29 +22,33 @@ #include <string.h> #include "pm_c_util.h" -#include "ppm.h" +#include "mallocvar.h" #include "shhopt.h" +#include "ppm.h" struct cmdlineInfo { /* All the information the user supplied in the command line, in a form easy for the program to use. */ - const char *inputFilespec; /* Filespec of input file */ + const char * inputFileName; /* Name of input file */ unsigned int verbose; }; static void -parseCommandLine(int argc, char **argv, - struct cmdlineInfo *cmdlineP) { - optEntry *option_def = malloc(100*sizeof(optEntry)); +parseCommandLine(int argc, const char ** argv, + struct cmdlineInfo * const cmdlineP) { + + optEntry * option_def; /* Instructions to OptParseOptions3 on how to parse our options */ optStruct3 opt; unsigned int option_def_index; + MALLOCARRAY_NOFAIL(option_def, 100); + option_def_index = 0; /* incremented by OPTENTRY */ OPTENT3(0, "verbose", OPT_FLAG, NULL, &cmdlineP->verbose, 0); @@ -52,117 +56,115 @@ parseCommandLine(int argc, char **argv, opt.short_allowed = FALSE; /* We have no short (old-fashioned) options */ opt.allowNegNum = FALSE; /* We have no parms that are negative numbers */ - optParseOptions3(&argc, argv, opt, sizeof(opt), 0); + optParseOptions3(&argc, (char **)argv, opt, sizeof(opt), 0); /* Uses and sets argc, argv, and some of *cmdlineP and others. */ - switch (argc-1) { - case 0: - cmdlineP->inputFilespec = "-"; - break; - case 1: - cmdlineP->inputFilespec = argv[1]; - break; - case 2: - break; + if (argc-1 < 1) + cmdlineP->inputFileName = "-"; + else { + cmdlineP->inputFileName = argv[1]; + + if (argc-1 > 1) + pm_error("Too many arguments: %u. The only possible argument " + "is the input file name", argc-1); } } + #define ESC "\x1B\x5B" #define NUM_COLORS 128 #define MAX_ANSI_STR_LEN 16 -static int __inline__ sqr(const int x) { - return x*x; -} -/* - Generates some sort of color palette mixing the available - colors as different values of background, foreground & brightness. -*/ -static int -generate_palette(unsigned char rgb[NUM_COLORS][3], - char ansi_code[NUM_COLORS][MAX_ANSI_STR_LEN]) { - int code, col=0, cd2=0; +static void +generatePalette(unsigned char rgb[NUM_COLORS][3], + char ansiCode[NUM_COLORS][MAX_ANSI_STR_LEN], + unsigned int * const paletteSizeP) { +/*---------------------------------------------------------------------------- + Generate some sort of color palette mixing the available colors as different + values of background, foreground & brightness. +-----------------------------------------------------------------------------*/ + unsigned int code; + unsigned int col; + unsigned int cd2; memset((void *)rgb, 0, NUM_COLORS*3); - memset((void *)ansi_code, 0, NUM_COLORS*MAX_ANSI_STR_LEN); + memset((void *)ansiCode, 0, NUM_COLORS*MAX_ANSI_STR_LEN); - for(col=cd2=0; cd2<8; cd2++) { + for( col = cd2 =0; cd2 < 8; ++cd2) { unsigned int b; - for(b=0;b<2;b++) { - for(code=0; code<8; code++) { + for (b = 0; b < 2; ++b) { + for (code = 0; code < 8; ++code) { unsigned int c; - for(c=0;c<3;c++) { - if(code&(1<<c)) { - rgb[col][c]=(192|(b?63:0)); - } - if(cd2&(1<<c)) { - rgb[col][c]|=(128); - } + for (c = 0; c < 3; ++c) { + if ((code & (0x1 << c)) != 0) + rgb[col][c] = (192 | (b ? 63 : 0)); + if ((cd2 & (0x1 << c)) != 0) + rgb[col][c] |= 0x80; } - sprintf(ansi_code[col], + sprintf(ansiCode[col], ESC"%dm"ESC"3%dm"ESC"4%dm", b, code, cd2); - col++; + ++col; } } } - return col; + *paletteSizeP = col; } -int main(int argc, char **argv) -{ - FILE *ifp; - pixel **pixels; - int rows, row, cols, col, - pal_len, i; +int +main(int argc, const char ** argv) { + + FILE * ifP; + pixel ** pixels; + int rows, cols; + unsigned int row; + unsigned int palLen; pixval maxval; - struct cmdlineInfo - cmdline; + struct cmdlineInfo cmdline; unsigned char rgb[NUM_COLORS][3]; - char ansi_code[NUM_COLORS][MAX_ANSI_STR_LEN]; + char ansiCode[NUM_COLORS][MAX_ANSI_STR_LEN]; - - ppm_init(&argc, argv); + pm_proginit(&argc, argv); parseCommandLine(argc, argv, &cmdline); - ifp = pm_openr(cmdline.inputFilespec); + ifP = pm_openr(cmdline.inputFileName); - pixels = ppm_readppm(ifp, &cols, &rows, &maxval); + pixels = ppm_readppm(ifP, &cols, &rows, &maxval); - pm_close(ifp); + pm_close(ifP); - pal_len=generate_palette(rgb, ansi_code); + generatePalette(rgb, ansiCode, &palLen); for (row = 0; row < rows; ++row) { - for (col = 0; col < cols; col++) { + unsigned int col; + for (col = 0; col < cols; ++col) { pixval const r=(int)PPM_GETR(pixels[row][col])*255/maxval; pixval const g=(int)PPM_GETG(pixels[row][col])*255/maxval; pixval const b=(int)PPM_GETB(pixels[row][col])*255/maxval; int val, dist; + unsigned int i; - /* - The following loop calculates the index that - corresponds to the minimum color distance - between the given RGB values and the values - available in the palette. + /* The following loop calculates the index that corresponds to the + minimum color distance between the given RGB values and the + values available in the palette. */ - for(i=0, dist=sqr(255)*3, val=0; i<pal_len; i++) { + for (i = 0, dist = SQR(255)*3, val = 0; i < palLen; ++i) { pixval const pr=rgb[i][0]; pixval const pg=rgb[i][1]; pixval const pb=rgb[i][2]; - unsigned int j; - if( (j=sqr(r-pr)+sqr(b-pb)+sqr(g-pg))<dist ) { - dist=j; - val=i; + unsigned int const j = SQR(r-pr) + SQR(b-pb) + SQR(g-pg); + if (j < dist) { + dist = j; + val = i; } } - printf("%s%c", ansi_code[val],0xB1); + printf("%s%c", ansiCode[val], 0xB1); } printf(ESC"\x30m\n"); } @@ -170,5 +172,5 @@ int main(int argc, char **argv) ppm_freearray(pixels, rows); - exit(0); + return 0; } |