home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
443.lha
/
pcl2english_v2.0
/
main.c
< prev
next >
Wrap
C/C++ Source or Header
|
1990-12-02
|
5KB
|
241 lines
/* $RCSfile: main.c,v $ $Revision: 2.0 $ */
/*
Program: pcl2english
Author: Allen Norskog
Revision history:
V1.x: - (unreleased development versions)
V2.0: 9/16/90 - First release
This program released into the Public Domain.
*/
#include <stdio.h>
#include <string.h>
#include "gdefs.h"
#include "externals.h"
#include "protos.h"
FILE *fopen(),*ifile,*ofile;
#define ERR_USAGE 1
#define ERR_INFILE 2
#define ERR_OUTFILE 3
#define MODE_CHAR 0
#define MODE_ESC 1
extern int optind;
static char version[]="\npcl2english V2.0\n";
void init(void)
{
opt_e = FALSE;
opt_v = FALSE;
opt_x = FALSE;
first_col = current_col = 0;
last_col = 79;
num_lines = 0;
raster_mode = NO_RASTER;
raster_count = 0;
}
void main(int argc, char *argv[])
{
int c;
int done;
init();
/* Decode the options. */
while ((c = getopt (argc, argv, "evx")) != EOF) {
switch (c) {
case 'e':
/* Print escape sequences only. */
opt_e = TRUE;
break;
case 'v':
/* Print version number. */
opt_v = TRUE;
break;
case 'x':
/* Print hexadecimal equivalents. */
opt_x = TRUE;
break;
case '?':
/* Illegal option -- print usage message */
err_exit(ERR_USAGE);
break;
}
}
if (optind > argc - 1) {
if (opt_v) {
printf("%s\n\n",version);
exit(0);
}
else {
err_exit(ERR_USAGE);
}
}
ifile=fopen(argv[optind],"r");
if (!ifile) {
err_exit(ERR_INFILE);
}
if (optind <= argc - 2) {
ofile=fopen(argv[optind + 1],"w");
if (!ofile) {
err_exit(ERR_OUTFILE);
}
}
else ofile=stdout;
if (opt_v) {
fprintf(ofile, "%s\n\n",version);
}
mode = MODE_CHAR;
done = FALSE;
while (done == FALSE) {
c = getc(ifile);
if (c == EOF) {
done = TRUE;
}
switch (mode) {
case MODE_CHAR:
switch (c) {
case ESC:
if (char_count > 0) {
print_chars();
/* print_chars will make sure raster_mode
is cleared */
}
else {
}
mode = MODE_ESC;
esc_count = 0;
esc_string[esc_count] = c;
break;
case FORM_FEED:
print_chars();
fprintf(ofile,
"\n<Form feed> Move to first line at top of next page\n");
if (opt_x) {
fprintf(ofile,"0C");
}
else {
fprintf(ofile," ");
}
fprintf(ofile,
" while maintaining current column ");
fprintf(ofile,"at %d.\n", current_col);
break;
case SHIFT_IN:
print_chars();
fprintf(ofile,
"\n<Shift In> Select characters that follow from the\n");
if (opt_x) {
fprintf(ofile,"0F");
}
else {
fprintf(ofile," ");
}
fprintf(ofile," current primary font.\n");
break;
case SHIFT_OUT:
print_chars();
fprintf(ofile,
"\n<Shift Out> Select characters that follow from the\n");
if (opt_x) {
fprintf(ofile,"0E");
}
else {
fprintf(ofile," ");
}
fprintf(ofile," current secondary font.\n");
break;
case EOF:
print_chars();
fprintf(ofile,"\n");
break;
case CARRIAGE_RETURN:
current_col = first_col;
add_char(c);
break;
case LINE_FEED:
num_lines++;
add_char(c);
break;
case BACK_SPACE:
if (current_col > first_col) {
current_col--;
}
add_char(c);
break;
case TAB:
{
int i;
i = (current_col - first_col) / 8;
current_col = (i+1)*8 + first_col;
if (current_col > last_col) {
current_col = last_col;
}
add_char(c);
}
break;
default:
add_char(c);
if (((c >= 32) && (c <= 127)) ||
((c >= 161) && (c <= 254))) {
/* Ignore non-printing characters in
Roman-8 character set */
if (current_col < last_col) {
current_col++;
}
}
break;
}
break;
case MODE_ESC:
if (c == EOF) {
fprintf(ofile,
"\nEOF reached before completing last escape sequence.\n");
}
else {
esc_count++;
esc_string[esc_count] = c;
if (((esc_count == 1) && (c >= '0') && (c <= '~')) ||
/* A two character escape string */
((c >= '@') && (c <= 'Z'))) {
/* Look for terminating character.
@ is just before A */
esc_string[esc_count + 1] = 0;
if (raster_mode == NO_RASTER) {
print_esc_string();
}
else {
if (strncmp(esc_string, raster_header,
strlen(raster_header)) != 0) {
print_extra_rasters();
raster_mode = NO_RASTER;
print_esc_string();
}
}
decode_esc_string();
mode = MODE_CHAR;
char_count = 0;
}
}
break;
default:
break;
}
}
fclose(ifile);
fclose(ofile);
exit(0);
}