home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Simtel MSDOS 1992 June
/
SIMTEL_0692.cdr
/
msdos
/
txtutl
/
unsoft11.arc
/
UNSOFT11.C
next >
Wrap
Text File
|
1984-06-09
|
6KB
|
245 lines
/************************************************************************/
/* Program to convert Wordstar Document-Mode */
/* files to plain-vanilla, non-document, ascii format. */
/* */
/* by Paul Homchick, One Radnor Station #300, Radnor, PA 19087 */
/* */
/* will compile with Software Toolworks C/80, or CI C86, */
/* or Digital Research C */
/* */
/* last edited: 15:33, 6/09/84 */
/************************************************************************/
#include <stdio.h>
#define VERSION "1.1C"
#define VDATE "09 Jun 84"
#define CR 0x0d
#define LF 0x0a
#define CPM_EOF 0x1a /* cp/m end of file mark */
#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 ERROR -1
#define TRUE 1
#define FALSE 0
#define BIGLINE 512 /* number of char in biggest line */
#define DRC /* define this to compile with Dig Res C*/
/* comment out if not DRC */
static int inptr, outptr, startline;
main(argc,argv)
int argc; char *argv[];
{
register int c;
startline= TRUE;
switch (argc)
{
case 1:
usage();
exit(0);
case 2:
if ( (!strcmp(argv[1],"?")) ||
(cmdeq(argv[1],"[HELP]")) ||
(cmdeq(argv[1],"[help]")) )
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);
}
#ifdef DRC
if (!(inptr= fopenb(argv[1],"r")))
#else
if (!(inptr= fopen(argv[1],"rb")))
#endif
{
printf("Can't open '%s' for input.\n",argv[1]);
exit(0);
}
#ifdef DRC
if (!(outptr=fopenb(argv[2],"w")))
#else
if (!(outptr=fopen(argv[2],"wb")))
#endif
{
printf("Can't open '%s' for output.",argv[2]);
printf(" The disk directory is probably full.\n");
exit(0);
}
/************************************************************************/
/* main loop */
/************************************************************************/
printf("processing... ");
while ((c=getc(inptr))!=ERROR && c!=CPM_EOF)
putc(translate(c),outptr);
putc(CPM_EOF,outptr);
fclose(inptr);
fclose(outptr);
printf("done.\n");
}
/************************************************************************/
/* wordstar translation routine */
/************************************************************************/
translate(c)
register int c;
{
char buf[BIGLINE];
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")) )
putc(FF,outptr);
startline= TRUE;
return(translate(c= getc(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(c);
case CPM_EOF:
return(CPM_EOF);
default:
c= getc(inptr);
return(translate(c));
}
}
else
return(c);
}
/************************************************************************/
/* short usage prompt routine */
/************************************************************************/
usage()
{
printf("unsoft version %s %s\n\n",VERSION,VDATE);
printf("usage: unsoft wordstar_input_name ascii_output_name\n");
printf(" or: unsoft (? | [help]) for help.\n");
printf("converts wordstar document-mode files ");
printf("to plain text format.\n");
}
/************************************************************************/
/* error print routine */
/************************************************************************/
error(s)
char *s;
{
printf("\007Error: %s\n",s);
}
/************************************************************************/
/* 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 CR, LF, FF, and TAB characters.\n");
printf("\to Filters out all other control characters.\n");
printf("\nUsage: unsoft wordstar_input_name");
printf(" ascii_output_name\n");
printf("where (names) are input and output file names. Unsoft ?,\n");
printf("or [help] will evoke this help message.\n");
exit(0);
}
/************************************************************************/
/* get a line from the input file */
/* (modified from CI C86 library) */
/************************************************************************/
fgets(line,maxline,fd)
char *line;
int maxline;
unsigned int fd;
{
int j,cc;
for (j= 0;j < maxline-1;)
{
if((cc= (getc(inptr)&0x7F)) == CPM_EOF)
return(CPM_EOF);
line[j]= cc;
if (cc<1)
break;
if (line[j++]=='\n')
break;
}
line[j]=0;
if (j)
return(line);
else
return(0);
}
/************************************************************************/
/* test input commands */
/************************************************************************/
cmdeq(s,p)
char *s, *p;
{
while(*p)
if(*s++ != *p++)
return(FALSE);
return(TRUE);
}