| |
/* xbm2bin.c -- (c) Chris Gerber, 1998
*/
#include <stdio.h>
#include <stdlib.h>
#include "xbm2bin.h"
/*--- Constants ---*/
#define N_BITS 8
/*--- Types ---*/
typedef char byte[N_BITS];
/*--- Function Prototypes ---*/
int processArgs( int, char ** );
char *bits_to_char ( void );
void output( FILE *, char *);
void bintobyte (unsigned char, byte );
char *make_line( char *,char * );
char *xsize( char * );
int ysize( int );
/*--- Global Constants ---*/
const char *usage = "usage: %s filename [-r] [-xN] [-yN]\n";
/*--- Global Variables ---*/
char *oFile;
int reverse = 0;
int xResize = 1, yResize = 1;
int index = 0, rowIndex = 0;
unsigned char bindigit[2] = { '0', '1' };
int main(int argc, char *argv[])
{
char *p;
FILE *fp;
#ifdef DEBUG
printf( "DEBUG: DEBUG Mode ON.\n" );
#endif
if (processArgs( argc, argv ) == 0)
return 1;
p = bits_to_char();
if ((fp = fopen( oFile, "w" )) == NULL) {
printf( "Error: Couldn't open %s.\n", oFile );
return 1;
}
output( fp, p );
close( fp );
free( p );
return 0;
}
int processArgs( int argc, char *argv[] )
{
int i=2,x;
if (--argc < 1)
{
printf( usage, argv[0] );
return 0;
}
oFile = argv[1];
#ifdef DEBUG
printf("DEBUG: output file = %s\n", oFile );
#endif
while (i <= argc)
{
#ifdef DEBUG
printf( "DEBUG: Arg %d\n", i );
#endif
if (argv[i][0] == '-') {
switch (argv[i][1])
{
case 'r': case 'R': /* reverse video option */
reverse = 1;
bindigit[0] = '1', bindigit[1] = '0';
#ifdef DEBUG
printf( "DEBUG: Reverse mode ON.\n" );
#endif
break;
case 'x': case 'X': /* x resize option */
xResize = (int) (argv[i][2] - 0x30);
#ifdef DEBUG
printf( "DEBUG: X Scaling = %2X.\n", xResize );
#endif
break;
case 'y': case 'Y': /* y resize option */
yResize = (int) (argv[i][2] - 0x30);
#ifdef DEBUG
printf( "DEBUG: Y Scaling = %d.\n", yResize );
#endif
break;
}
}
i++;
}
return 1;
}
char *bits_to_char ()
{
int i;
byte thebyte;
unsigned char *data, *p, mask;
#ifdef DEBUG1
printf("\nDEBUG: bits_to_char()\n" );
#endif
p = data = (unsigned char *)malloc( WIDTH * HEIGHT );
if (data == NULL) {
printf("error: Could not malloc.\n");
exit( 1 );
}
for (i=0; i < ((WIDTH/N_BITS)*HEIGHT); i++) {
bintobyte( (unsigned char) BITS[i], thebyte );
memcpy( p, thebyte, N_BITS );
p += N_BITS;
}
#ifdef DEBUG1
printf("\nDEBUG: return\n" );
#endif
return (char *)data;
}
void bintobyte (unsigned char c, byte b)
{
int i=0;
unsigned char mask;
for (mask = 0x01, i=0; i < N_BITS; mask <<= 1, i++ ) {
b[i] = ((c & mask)==mask) ? bindigit[1] : bindigit[0];
}
}
void output( FILE *fp, char *data )
{
int row;
char *line = (char *)malloc( WIDTH + 1 );
if (line == NULL) return;
#ifdef DEBUG
printf("DEBUG: output() malloc'ed new char string.\n");
#endif
for (row = 0; row < HEIGHT; row++)
{
if (ysize(row)) {
make_line( line, data );
fprintf( fp, "%s\n", line );
#ifdef DEBUG1
printf( "DEBUG: wrote \"%s\"\n", line );
#endif
} else {
index += WIDTH;
#ifdef DEBUG
printf( "DEBUG: skipping row %d\n", row );
#endif
}
}
free( line );
}
char *make_line( char *where, char *fromwhat )
{
int i, realWidth;
for (i=0; i < WIDTH; i++, index++) {
where[i] = fromwhat[index];
}
where[i] = 0;
#ifdef DEBUG1
printf("DEBUG: make_line() line before resize = \"%s\"\n", where );
#endif
return xsize( where );
}
char *xsize( char *what )
{
char c;
int putIndex, getIndex;
if (xResize > 1)
{
putIndex = 0; getIndex = 0;
while (getIndex < WIDTH) {
c = what[getIndex];
what[putIndex] = c;
getIndex += xResize;
putIndex++;
}
what[putIndex] = 0;
#ifdef DEBUG1
printf("DEBUG: xsize() -> \"%s\"\n", what );
#endif
}
return what;
}
int ysize( int row )
{
int pIndex;
if (yResize > 1)
{
pIndex = 0;
while ( pIndex < row ) {
pIndex += yResize;
}
#ifdef DEBUG1
if (row == pIndex)
printf("DEBUG: ysize(%d ?= %d) = TRUE\n", row, pIndex );
else
printf("DEBUG: ysize(%d ?= %d) = FALSE\n", row, pIndex );
#endif
return ((row==pIndex) ? 1 : 0);
}
}
|
|