/*******
** FILE Cnvrtwbl.c
**
** AUTHOR g.rossini
**
** COPYRIGHT Elsag Sistemi
**
** Operating system c compiler
**
** Description conversione di Files da EBCDIC ad ASCII o viceversa
** (usato per copia in ambiente win senza messaggi)
** par 1 tablefile (conversion table)
** par 2 inputfile (input file )
** par 3 inputmode (mode for fopen input file)
** par 4 outputfile (output file)
** par 5 outputmode (mode for fopen output file)
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <share.h>
#define FAIL (-1)
//#define NL 0x15 /* AS400 0x15 */
#define NL 0x0A /* PC lf 0x10 */
// #define BYTE char /* AS400 char */
#define BYTE unsigned char /* PC Dos */
/*******
Dichiarazione di dati
*******/
/** Tabella di conversione dati **/
BYTE x_conv[ 256];
char *pgm;
FILE *input;
FILE *output;
/** Converte un carattere di input in base alla tabella x_conv.
**/
BYTE convert( c)
BYTE c;
{
return ( x_conv[c]);
}
/**** Help su come usare il programma
****/
void Uso()
{
fprintf(stderr,"Uso: %s tablefile inputfile inputmode outputfile outputmode\n",
pgm);
exit(4);
}
void from()
{
int c_in;
BYTE c_out;
while( (c_in = fgetc( input)) != EOF)
{
c_out = convert( (BYTE) c_in);
fputc( (int) c_out, output);
}
}
/*** Lettura di una linea da un file di dati.
Se una linea e' piu' lunga di 80 caratteri si interrompe
con FAIL.
***/
int getline(fp, buf)
FILE *fp;
char buf[];
{
int c;
int nc = 0;
while ( (c = fgetc(fp)) != EOF ) {
*buf++ = c;
if (c == (int)NL) {
*--buf = 0x00;
return(nc);
}
nc++;
if( nc > 80)
return(FAIL);
}
return(FAIL);
}
/***
Caricamento della tabella di conversione dati
***/
void load_table( s)
char *s;
{
FILE *fp;
int n = 0, ret;
int nc;
char buf[100];
unsigned long c_val1, c_val2, c_val3, c_val4, c_val5, c_val6,
c_val7, c_val8;
//if ( ( fp = fopen( s, "r lrecl=80")) == NULL)
if ( ( fp = fopen( s, "rb")) == NULL)
{
perror("Errore open tabella di conversione");
exit(3);
}
while( ( nc = getline( fp, buf)) != FAIL)
{
if( (nc) && ( *buf != 'œ') )
{
if((ret = sscanf(buf,
" 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x",
&c_val1, &c_val2, &c_val3, &c_val4,
&c_val5, &c_val6, &c_val7, &c_val8
)) == 8)
{
x_conv[n++] = (BYTE) c_val1;
x_conv[n++] = (BYTE) c_val2;
x_conv[n++] = (BYTE) c_val3;
x_conv[n++] = (BYTE) c_val4;
x_conv[n++] = (BYTE) c_val5;
x_conv[n++] = (BYTE) c_val6;
x_conv[n++] = (BYTE) c_val7;
x_conv[n++] = (BYTE) c_val8;
if( n >= sizeof(x_conv))
break;
}
}
memset(buf, 0, sizeof(buf));
}
fclose(fp);
if( n != sizeof( x_conv))
{
printf("Tabella di conversione incompleta!! Non converto!\n");
exit(1);
}
// print table for check
// for (n=0;n<256;n++)
// printf ("%X ", x_conv[n]);
}
/******
******/
main( ac , av)
int ac;
char *av[];
{
pgm = av[0];
if( ac != 6)
Uso();
/* "r" */
//if ( ( input = fopen( av[2], av[3])) == NULL)
// modo = strlwr(av[3]);
if ( ( input = _fsopen( av[2], strlwr(av[3]), SH_DENYNO )) == NULL)
{
// perror( "Errore open input");
exit(1);
}
/* "w+b lrecl=1" */
//if ( ( output = fopen( av[4], av[5])) == NULL)
if ( ( output = fopen( av[4], strlwr(av[5]))) == NULL)
{
// perror( "Errore open output");
exit(2);
}
load_table( av[1]);
from();
fclose( input), fclose( output);
}