diff options
-rw-r--r-- | converter/ppm/ilbmtoppm.c | 623 |
1 files changed, 321 insertions, 302 deletions
diff --git a/converter/ppm/ilbmtoppm.c b/converter/ppm/ilbmtoppm.c index bf9d826e..2b291a46 100644 --- a/converter/ppm/ilbmtoppm.c +++ b/converter/ppm/ilbmtoppm.c @@ -99,10 +99,9 @@ static bool debug = FALSE; static char * -ID2string(id) - IFF_ID id; -{ - static char str[] = "abcd"; +ID2string(IFF_ID const id) { + + static char str[4]; str[0] = (char)(id >> 24 & 0xff); str[1] = (char)(id >> 16 & 0xff); @@ -141,16 +140,15 @@ alloc_cmap(void) { static rawtype * -alloc_rawrow(cols) - int cols; -{ - rawtype *r; - int i; +alloc_rawrow(unsigned int const cols) { + + rawtype * r; + unsigned int col; MALLOCARRAY_NOFAIL(r, cols); - for( i = 0; i < cols; i++ ) - r[i] = 0; + for (col = 0; col < cols; ++col) + r[col] = 0; return r; } @@ -161,17 +159,17 @@ alloc_rawrow(cols) ****************************************************************************/ static void -readerr(f, iffid) - FILE *f; - IFF_ID iffid; -{ - if( ferror(f) ) +readerr(FILE * const fP, + IFF_ID const iffId) { + + if (ferror(fP)) pm_error("read error"); else - pm_error("premature EOF in %s chunk", ID2string(iffid)); + pm_error("premature EOF in %s chunk", ID2string(iffId)); } + static void read_bytes(FILE * const ifP, int const bytes, @@ -191,21 +189,20 @@ read_bytes(FILE * const ifP, static unsigned char -get_byte(ifP, iffid, counter) - FILE* ifP; - IFF_ID iffid; - long *counter; -{ +get_byte(FILE * const ifP, + IFF_ID const iffId, + unsigned long * const counterP) { + int i; - if( counter ) { - if( *counter == 0 ) - pm_error("insufficient data in %s chunk", ID2string(iffid)); - --(*counter); + if (counterP) { + if (*counterP == 0 ) + pm_error("insufficient data in %s chunk", ID2string(iffId)); + --(*counterP); } i = getc(ifP); - if( i == EOF ) - readerr(ifP, iffid); + if (i == EOF) + readerr(ifP, iffId); return (unsigned char) i; } @@ -273,114 +270,117 @@ chunk_end(FILE * const ifP, static void skip_chunk(FILE * const ifP, - IFF_ID const iffid, - unsigned long const chunksize) { - unsigned long remainingChunksize; + IFF_ID const iffId, + unsigned long const chunkSize) { - remainingChunksize = chunksize; /* initial value */ + unsigned long remainingChunkSize; - while (remainingChunksize > 0) - get_byte(ifP, iffid, &remainingChunksize); + for (remainingChunkSize = chunkSize; remainingChunkSize > 0; ) + get_byte(ifP, iffId, &remainingChunkSize); } static void display_chunk(FILE * const ifP, - IFF_ID const iffid, - unsigned long const chunksize) { + IFF_ID const iffId, + unsigned long const chunkSize) { int byte; - unsigned long remainingChunksize; + unsigned long remainingChunkSize; - pm_message("contents of %s chunk:", ID2string(iffid)); + pm_message("contents of %s chunk:", ID2string(iffId)); - remainingChunksize = chunksize; /* initial value */ - byte = '\0'; + for (remainingChunkSize = chunkSize, byte = '\0'; + remainingChunkSize > 0; ) { - while (remainingChunksize > 0) { - byte = get_byte(ifP, iffid, &remainingChunksize); + byte = get_byte(ifP, iffId, &remainingChunkSize); if (fputc(byte, stderr) == EOF) pm_error("write error"); } - if (byte != '\n') - if (fputc('\n', stderr) == EOF) + if (byte != '\n') { + int rc; + rc = fputc('\n', stderr); + if (rc == EOF) pm_error("write error"); + } } + static void -read_cmap(FILE * const ifP, - IFF_ID const iffid, - long const chunksize, - ColorMap * const cmap) { +read_cmap(FILE * const ifP, + IFF_ID const iffId, + unsigned long const chunkSize, + ColorMap * const cmapP) { - long colors; + unsigned long const colorCt = chunkSize / 3; - colors = chunksize / 3; - if( colors == 0 ) { - pm_error("warning - empty %s colormap", ID2string(iffid)); - skip_chunk(ifP, iffid, chunksize); + if (colorCt == 0) { + pm_error("warning - empty %s colormap", ID2string(iffId)); + skip_chunk(ifP, iffId, chunkSize); } else { unsigned int i; - if( cmap->color ) /* prefer CMAP-chunk over CMYK-chunk */ - ppm_freerow(cmap->color); - cmap->color = ppm_allocrow(colors); - cmap->ncolors = colors; - - for( i = 0; i < colors; ++i ) { - int r, g, b; - r = get_byte(ifP, iffid, &chunksize); - g = get_byte(ifP, iffid, &chunksize); - b = get_byte(ifP, iffid, &chunksize); - PPM_ASSIGN(cmap->color[i], r, g, b); + unsigned long remainingChunkSize; + + if (cmapP->color) /* prefer CMAP-chunk over CMYK-chunk */ + ppm_freerow(cmapP->color); + cmapP->color = ppm_allocrow(colorCt); + cmapP->ncolors = colorCt; + + for (i = 0, remainingChunkSize = chunkSize; i < colorCt; ++i ) { + int const r = get_byte(ifP, iffId, &remainingChunkSize); + int const g = get_byte(ifP, iffId, &remainingChunkSize); + int const b = get_byte(ifP, iffId, &remainingChunkSize); + PPM_ASSIGN(cmapP->color[i], r, g, b); } - chunk_end(ifP, iffid, chunksize); + chunk_end(ifP, iffId, remainingChunkSize); } } static void -read_cmyk(FILE * const ifP, - IFF_ID const iffid, - long const chunksize, - ColorMap * const cmap) { +read_cmyk(FILE * const ifP, + IFF_ID const iffId, + unsigned long const chunkSize, + ColorMap * const cmapP) { - if( HAS_COLORMAP(cmap) ) { /* prefer RGB color map */ - skip_chunk(ifP, iffid, chunksize); + if (HAS_COLORMAP(cmapP)) { /* prefer RGB color map */ + skip_chunk(ifP, iffId, chunkSize); } else { - long const colors = chunksize/4; - if( colors == 0 ) { - pm_error("warning - empty %s colormap", ID2string(iffid)); - skip_chunk(ifP, iffid, chunksize); + unsigned long const colorCt = chunkSize / 4; + if (colorCt == 0 ) { + pm_error("warning - empty %s colormap", ID2string(iffId)); + skip_chunk(ifP, iffId, chunkSize); } else { unsigned int i; - cmap->color = ppm_allocrow(colors); - cmap->ncolors = colors; + unsigned long remainingChunkSize; + + cmapP->color = ppm_allocrow(colorCt); + cmapP->ncolors = colorCt; - for( i = 0; i < colors; ++i ) { - int c, m, y, k; - c = get_byte(ifP, iffid, &chunksize); - m = get_byte(ifP, iffid, &chunksize); - y = get_byte(ifP, iffid, &chunksize); - k = get_byte(ifP, iffid, &chunksize); + for (i = 0, remainingChunkSize = chunkSize; i < colorCt; ++i) { + int const c = get_byte(ifP, iffId, &remainingChunkSize); + int const m = get_byte(ifP, iffId, &remainingChunkSize); + int const y = get_byte(ifP, iffId, &remainingChunkSize); + int const k = get_byte(ifP, iffId, &remainingChunkSize); { pixval const red = MAXCOLVAL - MIN(MAXCOLVAL, - c*(MAXCOLVAL-k)/MAXCOLVAL+k); + c * (MAXCOLVAL-k) / MAXCOLVAL+k); pixval const green = MAXCOLVAL - MIN(MAXCOLVAL, - m*(MAXCOLVAL-k)/MAXCOLVAL+k); + m * (MAXCOLVAL-k) / MAXCOLVAL+k); pixval const blue = MAXCOLVAL - MIN(MAXCOLVAL, - y*(MAXCOLVAL-k)/MAXCOLVAL+k); + y * (MAXCOLVAL-k) / MAXCOLVAL+k); - PPM_ASSIGN(cmap->color[i], red, green, blue); + PPM_ASSIGN(cmapP->color[i], red, green, blue); } } - chunk_end(ifP, iffid, chunksize); + chunk_end(ifP, iffId, remainingChunkSize); } } } @@ -389,43 +389,43 @@ read_cmyk(FILE * const ifP, static void read_clut(FILE * const ifP, - IFF_ID const iffid, - unsigned long const chunksize, - ColorMap * const cmap) { + IFF_ID const iffId, + unsigned long const chunkSize, + ColorMap * const cmapP) { - if (chunksize != CLUTSize) { + if (chunkSize != CLUTSize) { pm_message("invalid size for %s chunk - skipping it", - ID2string(iffid)); - skip_chunk(ifP, iffid, chunksize); + ID2string(iffId)); + skip_chunk(ifP, iffId, chunkSize); } else { long type; unsigned char * lut; - unsigned long remainingChunksize; + unsigned long remainingChunkSize; unsigned int i; - type = get_big_long(ifP, iffid, &remainingChunksize); - get_big_long(ifP, iffid, &remainingChunksize); /* skip reserved fld */ + type = get_big_long(ifP, iffId, &remainingChunkSize); + get_big_long(ifP, iffId, &remainingChunkSize); /* skip reserved fld */ MALLOCARRAY_NOFAIL(lut, 256); for( i = 0; i < 256; ++i ) - lut[i] = get_byte(ifP, iffid, &remainingChunksize); + lut[i] = get_byte(ifP, iffId, &remainingChunkSize); switch( type ) { case CLUT_MONO: - cmap->monolut = lut; + cmapP->monolut = lut; break; case CLUT_RED: - cmap->redlut = lut; + cmapP->redlut = lut; break; case CLUT_GREEN: - cmap->greenlut = lut; + cmapP->greenlut = lut; break; case CLUT_BLUE: - cmap->bluelut = lut; + cmapP->bluelut = lut; break; default: pm_message("warning - %s type %ld not recognized", - ID2string(iffid), type); + ID2string(iffId), type); free(lut); } } @@ -695,79 +695,82 @@ decode_mask(FILE * const ifP, static void -multi_adjust(cmap, row, palchange) - ColorMap *cmap; - int row; - PaletteChange *palchange; -{ - int i, reg; - - for( i = 0; palchange[i].reg != MP_REG_END; i++ ) { - reg = palchange[i].reg; - if( reg >= cmap->ncolors ) { +multi_adjust(ColorMap * const cmapP, + unsigned int const row, + const PaletteChange * const palchange) { + + unsigned int i; + + for (i = 0; palchange[i].reg != MP_REG_END; ++i) { + int const reg = palchange[i].reg; + if (reg >= cmapP->ncolors) { pm_message("warning - palette change register out of range"); - pm_message(" row %d change structure %d reg=%d (max %d)", - row, i, reg, cmap->ncolors-1); + pm_message(" row %u change structure %d reg=%d (max %d)", + row, i, reg, cmapP->ncolors-1); pm_message(" ignoring it... " "colors might get messed up from here"); - } - else - if( reg != MP_REG_IGNORE ) { - PPM_ASSIGN(cmap->color[reg], - palchange[i].r, palchange[i].g, palchange[i].b); + } else { + if (reg != MP_REG_IGNORE) { + PPM_ASSIGN(cmapP->color[reg], + palchange[i].r, palchange[i].g, palchange[i].b); + } } } } + + static void -multi_init(cmap, viewportmodes) - ColorMap *cmap; - long viewportmodes; -{ - if( cmap->mp_init ) - multi_adjust(cmap, -1, cmap->mp_init); - if( !(viewportmodes & vmLACE) ) - cmap->mp_flags &= ~(MP_FLAGS_SKIPLACED); +multi_init(ColorMap * const cmapP, + long const viewportmodes) { + + if (cmapP->mp_init) + multi_adjust(cmapP, -1, cmapP->mp_init); + if (!(viewportmodes & vmLACE) ) + cmapP->mp_flags &= ~(MP_FLAGS_SKIPLACED); } + + static void -multi_update(cmap, row) - ColorMap *cmap; - int row; -{ - if( cmap->mp_flags & MP_FLAGS_SKIPLACED ) { - if( ODD(row) ) +multi_update(ColorMap * const cmapP, + unsigned int const row) { + + if (cmapP->mp_flags & MP_FLAGS_SKIPLACED) { + if (ODD(row)) return; - if( row/2 < cmap->mp_rows && cmap->mp_change[row/2] ) - multi_adjust(cmap, row, cmap->mp_change[row/2]); - } - else { - if( row < cmap->mp_rows && cmap->mp_change[row] ) - multi_adjust(cmap, row, cmap->mp_change[row]); + if (row/2 < cmapP->mp_rows && cmapP->mp_change[row/2]) + multi_adjust(cmapP, row, cmapP->mp_change[row/2]); + } else { + if (row < cmapP->mp_rows && cmapP->mp_change[row]) + multi_adjust(cmapP, row, cmapP->mp_change[row]); } } + + static void -multi_free(cmap) - ColorMap *cmap; -{ - int i; +multi_free(ColorMap * const cmapP) { - if( cmap->mp_init ) { - free(cmap->mp_init); - cmap->mp_init = NULL; + if (cmapP->mp_init) { + free(cmapP->mp_init); + cmapP->mp_init = NULL; } - if( cmap->mp_change ) { - for( i = 0; i < cmap->mp_rows; i++ ) { - if( cmap->mp_change[i] ) - free(cmap->mp_change[i]); + + if (cmapP->mp_change) { + unsigned int i; + + for (i = 0; i < cmapP->mp_rows; ++i) { + if (cmapP->mp_change[i]) + free(cmapP->mp_change[i]); } - free(cmap->mp_change); - cmap->mp_change = NULL; + free(cmapP->mp_change); + cmapP->mp_change = NULL; } - cmap->mp_rows = 0; - cmap->mp_type = 0; - cmap->mp_flags = 0; + + cmapP->mp_rows = 0; + cmapP->mp_type = 0; + cmapP->mp_flags = 0; } @@ -907,70 +910,73 @@ prepareCmap(const BitMapHeader * const bmhdP, static pixval -lookup_red(cmap, oldval) - ColorMap *cmap; - int oldval; -{ - if( cmap && cmap->redlut && oldval < 256 ) - return cmap->redlut[oldval]; +lookup_red(ColorMap * const cmapP, + unsigned int const oldval) { + + if (cmapP && cmapP->redlut && oldval < 256) + return cmapP->redlut[oldval]; else return oldval; } + + static pixval -lookup_green(cmap, oldval) - ColorMap *cmap; - int oldval; -{ - if( cmap && cmap->greenlut && oldval < 256 ) - return cmap->greenlut[oldval]; +lookup_green(ColorMap * const cmapP, + unsigned int const oldval) { + + if (cmapP && cmapP->greenlut && oldval < 256) + return cmapP->greenlut[oldval]; else return oldval; } + + static pixval -lookup_blue(cmap, oldval) - ColorMap *cmap; - int oldval; -{ - if( cmap && cmap->bluelut && oldval < 256 ) - return cmap->bluelut[oldval]; +lookup_blue(ColorMap * const cmapP, + unsigned int const oldval) { + + if (cmapP && cmapP->bluelut && oldval < 256) + return cmapP->bluelut[oldval]; else return oldval; } + + static pixval -lookup_mono(cmap, oldval) - ColorMap *cmap; - int oldval; -{ - if( cmap && cmap->monolut && oldval < 256 ) - return cmap->monolut[oldval]; +lookup_mono(ColorMap * const cmapP, + unsigned int const oldval) { + + if (cmapP && cmapP->monolut && oldval < 256) + return cmapP->monolut[oldval]; else return oldval; } + + static ColorMap * -ehbcmap(cmap) - ColorMap *cmap; -{ - pixel *tempcolor = NULL; - int i, col; - - col = cmap->ncolors; - - tempcolor = ppm_allocrow(col * 2); - for( i = 0; i < col; i++ ) { - tempcolor[i] = cmap->color[i]; - PPM_ASSIGN(tempcolor[col + i], PPM_GETR(cmap->color[i]) / 2, - PPM_GETG(cmap->color[i]) / 2, - PPM_GETB(cmap->color[i]) / 2 ); +ehbcmap(ColorMap * const cmapP) { + + pixel * tempcolor; + unsigned int i; + + tempcolor = ppm_allocrow(cmapP->ncolors * 2); + + for (i = 0; i < cmapP->ncolors; ++i) { + tempcolor[i] = cmapP->color[i]; + PPM_ASSIGN(tempcolor[cmapP->ncolors + i], + PPM_GETR(cmapP->color[i]) / 2, + PPM_GETG(cmapP->color[i]) / 2, + PPM_GETB(cmapP->color[i]) / 2); } - ppm_freerow(cmap->color); - cmap->color = tempcolor; - cmap->ncolors *= 2; + ppm_freerow(cmapP->color); + cmapP->color = tempcolor; + cmapP->ncolors *= 2; - return cmap; + return cmapP; } @@ -1015,31 +1021,31 @@ lut_maxval(ColorMap * const cmap, static void -get_color(cmap, idx, red, green, blue) - ColorMap *cmap; - int idx; - pixval *red, *green, *blue; -{ - if( HAS_COLORMAP(cmap) ) { - pixval r, g, b; - - if( idx >= cmap->ncolors ) - pm_error("color index out of range: %d (max %d)", - idx, cmap->ncolors); - r = PPM_GETR(cmap->color[idx]); - g = PPM_GETG(cmap->color[idx]); - b = PPM_GETB(cmap->color[idx]); - - *red = lookup_red(cmap, r); - *green = lookup_green(cmap, g); - *blue = lookup_blue(cmap, b); - } - else { - *red = *green = *blue = lookup_mono(cmap, idx); - } +get_color(ColorMap * const cmapP, + unsigned int const idx, + pixval * const redP, + pixval * const greenP, + pixval * const blueP) { + + if (HAS_COLORMAP(cmapP)) { + if (idx >= cmapP->ncolors) + pm_error("color index out of range: %u (max %u)", + idx, cmapP->ncolors); + else { + pixval const r = PPM_GETR(cmapP->color[idx]); + pixval const g = PPM_GETG(cmapP->color[idx]); + pixval const b = PPM_GETB(cmapP->color[idx]); + + *redP = lookup_red (cmapP, r); + *greenP = lookup_green (cmapP, g); + *blueP = lookup_blue (cmapP, b); + } + } else + *redP = *greenP = *blueP = lookup_mono(cmapP, idx); } + /**************************************************************************** Conversion functions ****************************************************************************/ @@ -1401,7 +1407,7 @@ dcol_to_ppm(FILE * const ifP, static void cmapToPpm(FILE * const ofP, - ColorMap * const cmapP) { + ColorMap * const cmapP) { ppm_colorrowtomapfile(ofP, cmapP->color, cmapP->ncolors, MAXCOLVAL); } @@ -1673,40 +1679,46 @@ read_4bit_mp(FILE * const ifP, static void -PCHG_DecompHuff(src, dest, tree, origsize) - unsigned char *src, *dest; - short *tree; - unsigned long origsize; -{ - unsigned long i = 0, bits = 0; +PCHG_DecompHuff(const unsigned char * const src, + unsigned char * const dst, + short * const tree, + unsigned long const origsize) { + + const unsigned char * srcCursor; + unsigned char * dstCursor; + unsigned long i; + unsigned long bits; unsigned char thisbyte; - short *p; + short * p; - p = tree; - while( i < origsize ) { - if( bits == 0 ) { - thisbyte = *src++; + srcCursor = &src[0]; /* initial value */ + dstCursor = &dst[0]; /* initial value */ + i = 0; /* initial value */ + bits = 0; /* initial value */ + p = tree; /* initial value */ + + while (i < origsize) { + if (bits == 0) { + thisbyte = *srcCursor++; bits = 8; } - if( thisbyte & (1 << 7) ) { - if( *p >= 0 ) { - *dest++ = (unsigned char)*p; - i++; + if (thisbyte & (1 << 7)) { + if (*p >= 0) { + *dstCursor++ = (unsigned char)*p; + ++i; p = tree; - } - else + } else p += (*p / 2); - } - else { - p--; - if( *p > 0 && (*p & 0x100) ) { - *dest++ = (unsigned char )*p; - i++; + } else { + --p; + if (*p > 0 && (*p & 0x100)) { + *dstCursor++ = (unsigned char )*p; + ++i; p = tree; } } thisbyte <<= 1; - bits--; + --bits; } } @@ -1753,99 +1765,103 @@ PCHG_Decompress(PCHGHeader * const PCHG, static void -PCHG_ConvertSmall(PCHG, cmap, mask, datasize) - PCHGHeader *PCHG; - ColorMap *cmap; - unsigned char *mask; - unsigned long datasize; -{ +PCHG_ConvertSmall(PCHGHeader * const pchgP, + ColorMap * const cmapP, + unsigned char * const mask, + unsigned long const dataSize) { + unsigned char *data; + unsigned long remDataSize; unsigned char thismask; int bits, row, i, changes, masklen, reg; unsigned char ChangeCount16, ChangeCount32; unsigned short SmallChange; - unsigned long totalchanges = 0; - int changedlines = PCHG->ChangedLines; + unsigned long totalchanges; + int changedlines; + unsigned char * maskCursor; - masklen = 4 * MaskLongWords(PCHG->LineCount); - data = mask + masklen; datasize -= masklen; + totalchanges = 0; /* initial value */ + changedlines = pchgP->ChangedLines; /* initial value */ + masklen = 4 * MaskLongWords(pchgP->LineCount); + maskCursor = mask; + data = maskCursor + masklen; remDataSize = dataSize - masklen; bits = 0; - for( row = PCHG->StartLine; changedlines && row < 0; row++ ) { - if( bits == 0 ) { - if( masklen == 0 ) goto fail2; - thismask = *mask++; + for (row = pchgP->StartLine; changedlines && row < 0; ++row) { + if (bits == 0) { + if (masklen == 0) goto fail2; + thismask = *maskCursor++; --masklen; bits = 8; } - if( thismask & (1<<7) ) { - if( datasize < 2 ) goto fail; + if (thismask & (1<<7)) { + if (remDataSize < 2) goto fail; ChangeCount16 = *data++; ChangeCount32 = *data++; - datasize -= 2; + remDataSize -= 2; changes = ChangeCount16 + ChangeCount32; - for( i = 0; i < changes; i++ ) { - if( totalchanges >= PCHG->TotalChanges ) goto fail; - if( datasize < 2 ) goto fail; - SmallChange = BIG_WORD(data); data += 2; datasize -= 2; + for (i = 0; i < changes; ++i) { + if (totalchanges >= pchgP->TotalChanges) goto fail; + if (remDataSize < 2) goto fail; + SmallChange = BIG_WORD(data); data += 2; remDataSize -= 2; reg = ((SmallChange & 0xf000) >> 12) + (i >= ChangeCount16 ? 16 : 0); - cmap->mp_init[reg - PCHG->MinReg].reg = reg; - cmap->mp_init[reg - PCHG->MinReg].r = + cmapP->mp_init[reg - pchgP->MinReg].reg = reg; + cmapP->mp_init[reg - pchgP->MinReg].r = ((SmallChange & 0x0f00) >> 8) * FACTOR_4BIT; - cmap->mp_init[reg - PCHG->MinReg].g = + cmapP->mp_init[reg - pchgP->MinReg].g = ((SmallChange & 0x00f0) >> 4) * FACTOR_4BIT; - cmap->mp_init[reg - PCHG->MinReg].b = + cmapP->mp_init[reg - pchgP->MinReg].b = ((SmallChange & 0x000f) >> 0) * FACTOR_4BIT; ++totalchanges; } --changedlines; } thismask <<= 1; - bits--; + --bits; } - for( row = PCHG->StartLine; changedlines && row < cmap->mp_rows; row++ ) { - if( bits == 0 ) { - if( masklen == 0 ) goto fail2; - thismask = *mask++; + for (row = pchgP->StartLine; changedlines && row < cmapP->mp_rows; row++) { + if (bits == 0) { + if (masklen == 0) goto fail2; + thismask = *maskCursor++; --masklen; bits = 8; } - if( thismask & (1<<7) ) { - if( datasize < 2 ) goto fail; + if(thismask & (1<<7)) { + if (remDataSize < 2) goto fail; ChangeCount16 = *data++; ChangeCount32 = *data++; - datasize -= 2; + remDataSize -= 2; changes = ChangeCount16 + ChangeCount32; - MALLOCARRAY_NOFAIL(cmap->mp_change[row], changes + 1); - for( i = 0; i < changes; i++ ) { - if( totalchanges >= PCHG->TotalChanges ) goto fail; - if( datasize < 2 ) goto fail; - SmallChange = BIG_WORD(data); data += 2; datasize -= 2; + MALLOCARRAY_NOFAIL(cmapP->mp_change[row], changes + 1); + for (i = 0; i < changes; ++i) { + if (totalchanges >= pchgP->TotalChanges) goto fail; + if (remDataSize < 2) goto fail; + SmallChange = BIG_WORD(data); data += 2; remDataSize -= 2; reg = ((SmallChange & 0xf000) >> 12) + (i >= ChangeCount16 ? 16 : 0); - cmap->mp_change[row][i].reg = reg; - cmap->mp_change[row][i].r = + cmapP->mp_change[row][i].reg = reg; + cmapP->mp_change[row][i].r = ((SmallChange & 0x0f00) >> 8) * FACTOR_4BIT; - cmap->mp_change[row][i].g = + cmapP->mp_change[row][i].g = ((SmallChange & 0x00f0) >> 4) * FACTOR_4BIT; - cmap->mp_change[row][i].b = + cmapP->mp_change[row][i].b = ((SmallChange & 0x000f) >> 0) * FACTOR_4BIT; ++totalchanges; } - cmap->mp_change[row][changes].reg = MP_REG_END; + cmapP->mp_change[row][changes].reg = MP_REG_END; --changedlines; } thismask <<= 1; - bits--; + --bits; } - if( totalchanges != PCHG->TotalChanges ) + if (totalchanges != pchgP->TotalChanges) pm_message("warning - got %ld change structures, " "chunk header reports %ld", - totalchanges, PCHG->TotalChanges); + totalchanges, pchgP->TotalChanges); return; fail: pm_error("insufficient data in SmallLineChanges structures"); @@ -1870,16 +1886,16 @@ PCHG_ConvertBig(PCHGHeader * const PCHG, int reg; unsigned long totalchanges; int changedlines; - unsigned long dataRemaining; + unsigned long remDataSize; unsigned char * mask; mask = maskStart; /* initial value */ - dataRemaining = datasize; /* initial value */ + remDataSize = datasize; /* initial value */ changedlines = PCHG->ChangedLines; /* initial value */ totalchanges = 0; /* initial value */ masklen = 4 * MaskLongWords(PCHG->LineCount); - data = mask + masklen; dataRemaining -= masklen; + data = mask + masklen; remDataSize -= masklen; for (row = PCHG->StartLine, bits = 0; changedlines && row < 0; ++row) { if (bits == 0) { @@ -1892,16 +1908,16 @@ PCHG_ConvertBig(PCHGHeader * const PCHG, if (thismask & (1<<7)) { unsigned int i; - if (dataRemaining < 2) + if (remDataSize < 2) pm_error("insufficient data in BigLineChanges structures"); - changes = BIG_WORD(data); data += 2; dataRemaining -= 2; + changes = BIG_WORD(data); data += 2; remDataSize -= 2; for (i = 0; i < changes; ++i) { if (totalchanges >= PCHG->TotalChanges) pm_error("insufficient data in BigLineChanges structures"); - if (dataRemaining < 6) + if (remDataSize < 6) pm_error("insufficient data in BigLineChanges structures"); reg = BIG_WORD(data); data += 2; @@ -1910,7 +1926,7 @@ PCHG_ConvertBig(PCHGHeader * const PCHG, cmap->mp_init[reg - PCHG->MinReg].r = *data++; cmap->mp_init[reg - PCHG->MinReg].b = *data++; /* yes, RBG */ cmap->mp_init[reg - PCHG->MinReg].g = *data++; - dataRemaining -= 6; + remDataSize -= 6; ++totalchanges; } --changedlines; @@ -1931,17 +1947,17 @@ PCHG_ConvertBig(PCHGHeader * const PCHG, if (thismask & (1<<7)) { unsigned int i; - if (dataRemaining < 2) + if (remDataSize < 2) pm_error("insufficient data in BigLineChanges structures"); - changes = BIG_WORD(data); data += 2; dataRemaining -= 2; + changes = BIG_WORD(data); data += 2; remDataSize -= 2; MALLOCARRAY_NOFAIL(cmap->mp_change[row], changes + 1); for (i = 0; i < changes; ++i) { if (totalchanges >= PCHG->TotalChanges) pm_error("insufficient data in BigLineChanges structures"); - if (dataRemaining < 6) + if (remDataSize < 6) pm_error("insufficient data in BigLineChanges structures"); reg = BIG_WORD(data); data += 2; @@ -1950,7 +1966,7 @@ PCHG_ConvertBig(PCHGHeader * const PCHG, cmap->mp_change[row][i].r = *data++; cmap->mp_change[row][i].b = *data++; /* yes, RBG */ cmap->mp_change[row][i].g = *data++; - dataRemaining -= 6; + remDataSize -= 6; ++totalchanges; } cmap->mp_change[row][changes].reg = MP_REG_END; @@ -2490,3 +2506,6 @@ main(int argc, char *argv[]) { return 0; } + + + |