/************************************************************************/ /* 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: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 #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"); } /************************************************************************/ /* wordstar translation routine */ /************************************************************************/ translate(c) 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")) ) 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 */ /************************************************************************/ usage() { printf("usage: unsoft wordstar_input_name ascii_output_name\n"); printf(" or: unsoft (h | H) 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 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 */ /************************************************************************/ cmdeq(s,p) char *s, *p; { while(*p) if(*s++ != *p++) return(FALSE); return(TRUE); }