/************************************************************************/
/* Program to convert Wordstar Document-Mode */
/* files to plain-vanilla, non-document, ascii format. */
/* */
/* by Paul Homchick, One Radnor Station #300, Radnor, PA 19087 */
/* picked up by Richard McGee, BRL, from the SIMTEL archives under */
/* micro:<cpm.txtutl>unsoft1c.c */
/* and severely edited to compile under UNIX and to delete extra CR's. */
/* last edited on September 24, 1984 */
/* To Compile: cc -o unsoft -O unsoft.c */
/************************************************************************/
#include <stdio.h>
#define CR 0x0d
#define LF 0x0a
#define FF 0x0c /* form feed () */
#define TAB 0x09
#define CNTRL_O 0x0f /* non-break space */
#define END_HYP 0x1f /* soft hyphen at end of line */
#define TRUE 1
#define FALSE 0
#define BIGLINE 512 /* number of char in biggest line */
int startline;
FILE *inptr, *outptr, *fopen();
main(argc,argv)
int argc; char *argv[];
{
int c;
startline= TRUE;
switch (argc)
{
case 1:
usage();
exit(0);
case 2:
if ( (!strcmp(argv[1],"h")) ||
(!strcmp(argv[1],"H")) )
help();
else
{
usage();
error("Not enough arguments on command line.");
exit(0);
}
case 3:
break;
default:
usage();
error("Too many arguments on command line.");
exit(0);
}
if (strcmp(argv[1],argv[2])==0)
{
printf("Input and output filenames must differ.");
printf(" Aborting...\007\n");
exit(0);
}
if ((inptr= fopen(argv[1],"r")) == NULL)
{
printf("Can't open '%s' for input.\n",argv[1]);
exit(0);
}
if ((outptr=fopen(argv[2],"w")) == NULL)
{
printf("Can't open '%s' for output.",argv[2]);
exit(0);
}
/************************************************************************/
/* main loop */
/************************************************************************/
printf("processing... ");
while ((c=getc(inptr))!=EOF)
putc(translate(c),outptr);
printf("done.\n");
}
c&= 0x7f; /* strip high bit */
if (startline)
{
switch (c)
{
case '.': /* process dot commands */
fgets(buf,BIGLINE,inptr);
/* .pa to form feed */
if ((cmdeq(buf,"PA")) || (cmdeq(buf,"pa")) )
fputc(FF,outptr);
startline= TRUE;
return(translate(c= fgetc(inptr)));
case LF:
return(c);
default:
startline= FALSE;
}
}
if (c < ' ') /* check for control character */
{
switch (c)
{
case END_HYP:
return('-');
case CNTRL_O:
return(' ');
case LF:
case FF:
case TAB:
return(c);
case CR:
startline= TRUE;
return(NULL);
default:
c= fgetc(inptr);
return(translate(c));
}
}
else
return(c);
}
/************************************************************************/
/* short usage prompt routine */
/************************************************************************/
/************************************************************************/
/* on-line program help routine */
/************************************************************************/
help()
{
printf("\nUnsoft is a program to filter files prepared under Wordstar\n");
printf("document mode. Given a Wordstar document mode file as an\n");
printf("input, unsoft will output a file having made the following\n");
printf("transformations:\n\n");
printf("\to High bits stripped from all characters.\n");
printf("\to Converts '.pa' dot commands to form feed (^L).\n");
printf("\to Removes all other dot command lines from file.\n");
printf("\to Converts 'non-break-space' (^O) to a space.\n");
printf("\to Converts soft hyphen at end of line (1F hex) to '-'.\n");
printf("\to Passes through LF, FF, and TAB characters.\n");
printf("\to Filters out all other control characters and CR.\n");
printf("\nUsage: unsoft wordstar_input_name");
printf(" ascii_output_name\n");
printf("where (names) are input and output file names. Unsoft h,\n");
printf("or H will evoke this help message.\n");
exit(0);
}
/************************************************************************/
/* test input commands */
/************************************************************************/