jimomura@lsuc.on.ca (Jim Omura) (06/03/89)
I'm posting a number of data files on BIX that start from
Dynacalc on my CoCo3 but are meant for general consumption. As
such, I finally got around to writing this Q&D conversion program.
You will notice from the sources that I plan to add many features
to it. Don't count on it. It took me over a year to get around
to writing this much. I write what I need when I need it, and
sometimes not even then. But if anybody else feels like finishing
it, great!
Cheers! -- Jim O.
# This is a shell archive.
# Remove everything above and including the cut line.
# Then run the rest of the file through sh.
#----cut here-----cut here-----cut here-----cut here----#
#!/bin/sh
# shar: Shell Archiver
# Run the following text with /bin/sh to create:
# dynacon.doc
# dymake.09
# dynacon.c
# sample.dat
# sample.out
# This archive created:
# By: Jim Omura ()
cat << \SHAR_EOF > dynacon.doc
89/06/02
Dynacon
version 0.1
This is a quick and dirty converter which ONLY handles
one type of conversion. It will read a Dynacalc Data file
and output a Comma Separated Value file. With this much
many BIX users will find that they'll be able to read a lot
of datafiles I'll be uploading to BIX in the future and
use the information in their programs and spreadsheets.
The files in this Sharfile should unpack as follows:
dymake.09 (Makefile for Dynacalc for OS-9 6809)
dynacon.doc (this file)
dynacon.c
sample.dat
sample.out
The 'sample.out' file is the output result that you
should get if your run this program with 'sample.dat' as your
sample input file.
Cheers! -- Jim Omura
BIX 'jimomura'
SHAR_EOF
cat << \SHAR_EOF > dymake.09
* Makefile for Dynacon.C
CFLAGS = -r
dynacon: dynacon.r
cc1 dynacon.r
del c.com
dynacon.r: dynacon.c
cc1 $(CFLAGS) dynacon.c
SHAR_EOF
cat << \SHAR_EOF > dynacon.c
/* Dynacon.C */
/* Converts DynaCalc data format
* to standard Comma Separated Value format.
*/
/* Version 0.1 Public Domain
* 1989/06/02 By Jim Omura
*
* *** ONLY DEFAULT CONVERSION CURRENTLY WORKING ***
*
* Usage: dynacon [-?] [-i=t] [-o=t] [infile] [outfile]
* ? Short Help
* i Input file type
* o Output file type
* For 'i' and 'o', 't' denotes a type as follows:
* c = Comma Separated Value
* d * Dynacalc
* s = Super Data Interchange Format/DIF file
* Default -i=d -o=c
*/
#include <stdio.h>
#include <modes.h>
#include <ctype.h>
#define ERROR -1
#define FALSE 0
#define STDIN 0
#define STDOUT 1
#define STDERR 2
#define TRUE 1
#define BUFLEN 256
/* Constants: */
char comma[]={',',0};
char dquote[]={'"',0};
char eol[]={EOL,0};
main(argc,argv)
int argc;
char **argv;
{
char chrbuffer; /* Character Buffer */
int eorflg; /* End of Row Flag */
FILE *infile;
char lnbuffer[BUFLEN]; /* Line Buffer */
int newlnflg; /* New Output Line Flag */
int numflg; /* Number flag */
int orientflg; /* Orientation Flag */
FILE *outfile;
int report; /* Returned values */
char *rdpntr; /* Read Pointer */
int wrtlen; /* Length of buffer to write */
char *wrtpntr; /* Write Pointer */
/* Set Defaults: */
eorflg = FALSE;
infile = stdin;
newlnflg = TRUE;
outfile = stdout;
orientflg = -1; /* -1=unassigned, 0=default, 1=rows, 2=columns */
for(;argc > 1;)
{
++argv;
--argc;
if(**argv== '-')
{
for(;;)
{
++*argv;
switch((int) **argv)
{
case NULL:
break;
case '?':
fprintf(stdout, "dynacon [-?] [inpath] [outpath]\n");
fprintf(stdout, "Switches Not Implimented.\n");
exit(0);
default:
continue;
} /* Endswitch */
} /* Endloop */
continue;
} /* Endif A Dash */
if(infile == stdin)
{
infile = fopen(*argv,"r");
if (infile == NULL)
{
fprintf(stderr,"DynaCon: No such file %s.\n",*argv);
exit(-1);
}
continue;
} /* Endif inpath openner */
if(outfile == stdout)
{
report=access(*argv,S_IWRITE);
if(report == 0)
{
fprintf(stderr,"DynaCon: File %s exists.\n",*argv);
exit(-1);
}
outfile=fopen(*argv,"w");
if(outfile == NULL)
{
fprintf(stderr,"DynaCon: Cannot create %s\n",*argv);
exit(-1);
} /* Endif */
} /* Endif outpath creator */
} /* Endloop Parameter Handler */
for(;;)
{
report = (int) fgets(lnbuffer,BUFLEN,infile);
if(report == NULL)
{
exit(0);
}
wrtlen = strlen(lnbuffer);
/* File Header and Comment Handing */
if(*lnbuffer == '*')
{
continue;
}
/* First non-comment line *must* be orientation if any */
if(orientflg == -1)
{
if(*lnbuffer != '/')
{
orientflg = 0; /* Default orientation */
}
else
{
chrbuffer = lnbuffer[1]; /* 2nd char */
switch((int)chrbuffer)
{
case 'C':
orientflg = 1; /* Columns */
continue;
case 'R':
orientflg = 2; /* Rows */
continue;
default:
orientflg = 0; /* Default */
break;
} /* Endswitch */
} /* Endcondition orientation defline */
} /* Endif first non-Comment line */
chrbuffer = *lnbuffer; /* 1st Char */
if((chrbuffer == '.') || (isdigit(chrbuffer)) || (chrbuffer == '-'))
{
numflg = TRUE;
} /* Endcondition Number */
else
{
numflg = FALSE;
if(wrtlen == 2) /* NULL terminator is counted */
{
switch ((int) *lnbuffer)
{
case '>':
*lnbuffer = 0; /* Blank Line */
break;
case '@':
*lnbuffer = 0;
eorflg = TRUE;
break;
default:
break;
} /* Endswitch */
} /* Endif DynaFlags */
} /* Endcondition not number */
/* Strip double-quotes and EOL */
rdpntr = lnbuffer;
report = wrtlen;
wrtlen = 0; /* Inefficient, but easier to understand */
wrtpntr = lnbuffer;
for(;report > 0;)
{
chrbuffer = *rdpntr;
if((chrbuffer != '"') && (chrbuffer != EOL))
{
*wrtpntr = chrbuffer;
++wrtlen;
++wrtpntr;
}
++rdpntr;
--report;
} /* Endloop double quote stripper */
*wrtpntr = NULL; /* Terminate Line */
/* Write output */
if (eorflg == FALSE)
{
if (newlnflg == TRUE)
{
newlnflg = FALSE;
}
else
{
fprintf(outfile,"%s",comma);
}
if(numflg == FALSE)
{
fprintf(outfile,"%s",dquote);
}
fputs(lnbuffer,outfile); /* *** Write Actual Data *** */
if(numflg == FALSE)
{
fprintf(outfile,"%s",dquote);
}
}
else
{
fprintf(outfile,"\n");
eorflg = FALSE;
newlnflg = TRUE;
}
} /* Endloop Conversion */
} /* End of Main() */
/* End of dynacon.c */
SHAR_EOF
cat << \SHAR_EOF > sample.dat
*DYNACALC Data File
* June 2, 1989
/Col
Sample File
Blank Column
>
>
>
>
>
@
>
Text Column
Label 1
"Label 2"
label 3
'4th Label
>
@
>
Numbers
1234
1.234
12.34
-1234
.1234
@
SHAR_EOF
cat << \SHAR_EOF > sample.out
"Sample File","Blank Column","","","","",""
"","Text Column","Label 1","Label 2","label 3","'4th Label",""
"","Numbers",1234,1.234,12.34,-1234,.1234
SHAR_EOF
# End of shell archive
exit 0
--
Jim Omura, 2A King George's Drive, Toronto, (416) 652-3880
lsuc!jimomura
Byte Information eXchange: jimomura