#include <stdlib.h>
#include <stdio.h>
FILE *in, *out;
void AutoMorphToGuave(char *inputfile, char *outputfile);
void ConstWeightToGuave(char *inputfile, char *outputfile);
void EquivalentToGuave(char *inputfile, char *outputfile);
void WeightToGuave(char *inputfile, char *outputfile);
int main(int argc, char *argv[])
{
char *sw, *inputfile, *outputfile;
if (!(argc-1 == 3)) {
fprintf(stderr, "Error, usage: leonconv \n" );
exit (1);
}
sw = argv[1];
inputfile = argv[2];
outputfile = argv[3];
switch ((int ) sw[1]) {
case 97 : AutoMorphToGuave(inputfile, outputfile); break ;
case 99 : ConstWeightToGuave(inputfile, outputfile); break ;
case 101: EquivalentToGuave(inputfile, outputfile); break ;
case 119: WeightToGuave(inputfile, outputfile); break ;
default : fprintf(stderr, "Possible switches: -a, -c, -e, -w\n" );
exit (1);
}
return 0;
}
int ReadUntil(FILE *fl, char Sc, int Cnt) {
char bit;
int res, i;
res = fscanf(fl, "%c" , &bit);
i = 0;
if (bit == Sc) i++;
while ((i < Cnt) && (res != EOF)) {
res = fscanf(fl, "%c" , &bit);
if (bit == Sc) i++;
}
return res;
}
int OpenFiles(char *inputfile, char *outputfile) {
if ((in = fopen(inputfile, "r" )) == NULL)
{
fprintf(stderr, "Cannot open input file.\n" );
return 1;
}
if ((out = fopen(outputfile, "w" )) == NULL)
{
fprintf(stderr, "Cannot open output file.\n" );
return 1;
}
return 0;
}
void AutoMorphToGuave(char *inputfile, char *outputfile) {
char bit;
int res;
OpenFiles(inputfile, outputfile);
res = ReadUntil(in, '\n' , 6);
fprintf(out, "GUAVA_TEMP_VAR := Group(\n" );
res = fscanf(in, "%c" , &bit);
if (bit == 'F' )
fprintf(out, "()" );
else
while ((bit != ']' ) && (res != EOF)) {
fprintf(out, "%c" , bit);
res = fscanf(in, "%c" , &bit);
}
fprintf(out, ");\n" );
fclose(in);
in = fopen(inputfile, "r" );
res = ReadUntil(in, '\n' , 3);
res = ReadUntil(in, ':' , 1);
fprintf(out, "SetSize(GUAVA_TEMP_VAR, " );
res = fscanf(in, "%c" , &bit);
if (bit != ' ' ) {
res = ReadUntil(in, ':' , 1);
}
while ((bit != ';' ) && (res != EOF)) {
fprintf(out, "%c" , bit);
res = fscanf(in, "%c" , &bit);
}
fprintf(out, ");\n" );
fclose(in); fclose(out);
}
void ConstWeightToGuave(char *inputfile, char *outputfile) {
char bit;
int i, j, M, n, res, el;
OpenFiles(inputfile, outputfile);
res = ReadUntil(in, '\n' , 2);
res = ReadUntil(in, ',' , 1);
res = fscanf(in, "%i,%i" , &M, &n);
res = ReadUntil(in, '\n' , 1);
fprintf(out, "GUAVA_TEMP_VAR := [\n" );
for (i = 0; i < M; i++) {
fprintf(out, "[" );
for (j = 0; j < n; j++) {
res = fscanf(in, "%i%c" , &el, &bit);
if (j == 0) fprintf(out, "%i" , el);
else fprintf(out, ",%i" , el);
}
if (i < M-1) fprintf(out, "],\n" );
else fprintf(out, "]" );
}
fprintf(out, "];\n" );
fclose(in); fclose(out);
}
void EquivalentToGuave(char *inputfile, char *outputfile) {
char bit, is_valid;
int res, res2, noteq;
long start_offset, end_offset;
/*
* The variables is_valid, start_offset and end_offset are
* used to fix the bug reported by Klaus Lux.
*/
is_valid = 1;
if (!(in = fopen(inputfile, "rb" ))) is_valid = 0;
else {
start_offset = ftell(in);
fseek(in, 0L, SEEK_END);
end_offset = ftell(in);
rewind(in);
res2 = fread(&bit, 1, 1, in);
if (bit == 0x0A && (end_offset - start_offset <= 1))
is_valid = 0;
fclose(in);
}
noteq = ((in = fopen(inputfile, "r" )) == NULL);
if ((out = fopen(outputfile, "w" )) == NULL)
{
fprintf(stderr, "Cannot open output file.\n" );
exit (1);
}
fprintf(out, "GUAVA_TEMP_VAR := " );
if (noteq || !is_valid) {
fprintf(out, "false;" );
}
else {
res = ReadUntil(in, '=' , 1);
res = fscanf(in, "%c" , &bit);
while ((bit != 'F' ) && (res != EOF)) {
fprintf(out, "%c" , bit);
res = fscanf(in, "%c" , &bit);
}
}
fprintf(out, "\n" );
if (!noteq) fclose(in);
fclose(out);
}
void WeightToGuave(char *inputfile, char *outputfile) {
int i, Wt, Fr, CurWt, res;
OpenFiles(inputfile,outputfile);
res = ReadUntil(in, '\n' , 6);
fprintf(out, "GUAVA_TEMP_VAR := [" );
CurWt = 0;
res = fscanf(in, "%i " , &Wt);
while (res != EOF) {
if (CurWt > 0) fprintf(out, ", " );
res = fscanf(in, "%i" , &Fr);
for (i = CurWt; i < Wt; i++) fprintf(out, "0, " );
fprintf(out, "%i" , Fr);
CurWt = Wt+1;
res = ReadUntil(in, '\n' , 1);
res = fscanf(in, "%i" , &Wt);
}
fprintf(out, "];\n" );
fclose(in); fclose(out);
}
quality 85%
¤ Dauer der Verarbeitung: 0.11 Sekunden
(vorverarbeitet)
¤
*© Formatika GbR, Deutschland