home *** CD-ROM | disk | FTP | other *** search
- /************************************************************************/
- /* 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);
- }
-