/*
VFC2CR convert VFC to CR/LF */
/*From: "GWDVMS::MOELLER"
Subject: RE: Question: how to convert VFC to CR/LF
Date: Sun, 23 Feb 1997 05:45:47 +0100
Zafrir Benyehuda asks:
> How does one convert VFC files (created by COBOL ReportWriter) into
> plain CR/LF-spaced files. The intent is to be able to distribute
> reports, currently only printed, through email, or to be able to
> download them into PC-based applications.
The VMS C libraries know how to correctly interpret
the various RMS formats, including VFC print controls.
The (rather general) C program below is likely to solve your problem.
Wolfgang J. Moeller, Tel. +49 551 2011516 or -510, moeller@gwdvms.dnet.gwdg.de
GWDG, D-37077 Goettingen, F.R.Germany | Disclaimer: No claim intended!
----- -----
--------------------------------------------------------------------------------
*/
/* convert to "CR" format with a little help from VAXCRTL */
/* w.j.m. may 1993 */
/**** NOTE: input file must not contain s ("POSIX text files" only) ****/
#include
#include
#include
#include
#include
void sys$exit(unsigned long);
#define MAXLINE 32767 /* sort of maximum "record size" */
static error(char *,int/*logical*/); /* forward */
main(argc,argv)
int argc;
char **argv;
{
char line[MAXLINE+1]; /* room for fgets() & */
char oline[MAXLINE+2]; /* same, plus room for a '\n' */
char *cp,*ocp;
FILE *f1,*f2;
int nlines;
enum {
st_default, /* not at left margin */
st_cr, /* seen */
st_lf, /* at left margin, not top of page */
st_ff /* at top of page */
} state;
if(argc != 3) error("%-E-Need 2 parameters: inputfile outputfile\n",0);
if((f1 = fopen(argv[1],"r")) == NULL)
error("%-E-Error opening input",1);
strcpy(line,"dna="); strcat(line,argv[1]);
if((f2 = fopen(argv[2],"w","rfm=var","rat=cr",line)) == NULL)
error("%-E-Error opening output",1);
#define OUTPUT_oline \
do {\
*ocp++ = '\n'; *ocp++ = '\0';\
if(fputs(oline,f2) == EOF) error("%-E-Write error",1);\
nlines++;\
ocp = oline;\
} while(0)
line[MAXLINE] = '\0'; /* delimiter, untouched by fgets() */
nlines = 0;
state = st_lf; /* do honor leading */
ocp = oline;
while(fgets(line,MAXLINE,f1) != NULL) {
for(cp = line; *cp; cp++) {
switch(*cp) {
case '\r': /* */
switch(state) {
case st_ff:
case st_lf:
case st_cr:
break; /* redundant, ignore */
default:
state = st_cr;
break;
}
break;
case '\f': /* */
switch(state) {
case st_ff:
break; /* "redundant", ignore */
case st_cr:
default:
OUTPUT_oline;
/* drop thru */
case st_lf:
state = st_ff;
goto copyit;
}
break;
case '\n': /* */
OUTPUT_oline;
state = st_lf;
break;
default:
if(state == st_cr) *ocp++ = '\r';
state = st_default;
copyit:
*ocp++ = *cp;
break;
} /* switch(*cp) */
} /* for(cp...) */
if(state != st_lf) { /* i.e. line not terminated by '\n' */
OUTPUT_oline; /* => fake '\n' (avoid overflow) */
state = st_lf;
}
} /* while(fgets()...) */
if(ferror(f1)) error("%-E-Read error",1);
fprintf(stderr,"%%-S-Copied %d lines to %s\n",nlines,
fgetname(f2,line));
}
static error(char *str,int/*logical*/ k)
{
if(k) perror(str);
else fputs(str,stderr);
sys$exit(0x10000002); /* %-E-noname, noprint */
}