codice:
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <windows.h>
const MaxFogliPerBusta=99;
struct StrutturaStatistica
{
long QtaBuste;
}Stat[MaxFogliPerBusta];
struct DescrizioneAfp
{
int QtaPerFile;
int QtaBuste;
char *NomeFile;
}*DescAfp;
char Percorso[]="B:\\999999\\";
char **ElencoFileInput;
int NumeroDiFile=0;
char *NomeFileOutput;
char *NomeFileStatistica;
//*********************************************************************
// FUNZIONE PER CALCOLARE LA LUNGHEZZA DEL FILE
int get_filesize( char* filename )
{
struct stat file_info;
if( !stat( filename, &file_info ) )
return file_info.st_size;
return -1;
}
//
//____________________________________________________________________
//*********************************************************************
// CONVERTITORE ASCII TO HEX
char* AsciiToHex(char* sAscii,int Lunghezza)
{
char *StringaEsadecimale, *Hex;
int i;
StringaEsadecimale=(char*)malloc(Lunghezza*2+1);
StringaEsadecimale[0]='\0';
Hex=(char*)malloc(sizeof(char)*1);
for(i=0;i<Lunghezza;i++)
{
itoa((unsigned char)sAscii[i],Hex,16);
//sprintf(Hex2,"%x",sAscii[i]);
//printf("%s",Hex2);
strcat(StringaEsadecimale,Hex);
}
return StringaEsadecimale;
}
//
//____________________________________________________________________
//*********************************************************************
// FUNZIONE PER RICERCA DEI FILE AFP PRESENTI IN UNA CARTELLA
bool CreaListaFile()
{
char *sTmp;
WIN32_FIND_DATA fd;
HANDLE hFind;
sTmp=(char*)malloc(sizeof(char)*strlen(Percorso)+1);
strcpy(sTmp,Percorso);
strcat(sTmp,"*.afp");
hFind=FindFirstFile(sTmp,&fd);
if(hFind==INVALID_HANDLE_VALUE)
{
fputs("Nessun file trovato o percorso inesistente.",stderr);
return false;
}
ElencoFileInput=(char**)malloc(sizeof(char*));
do
{
ElencoFileInput=(char**)realloc(ElencoFileInput,(NumeroDiFile+2)*sizeof(char*));
ElencoFileInput[NumeroDiFile]=(char*)malloc(strlen(fd.cFileName)*sizeof(char));
strcpy(ElencoFileInput[NumeroDiFile],fd.cFileName);
NumeroDiFile++;
} while(FindNextFile(hFind,&fd));
FindClose(hFind);
return true;
}
//
//____________________________________________________________________
//*********************************************************************
// FUNZIONE PER IMPOSTARE IL NOME DEL FILE DI OUTPUT
void ImpostaNomeFileOutput()
{
char *sTmp,*sLast,*sPercorso;
sPercorso=(char*)malloc(sizeof(char)*strlen(Percorso)+1);
strcpy(sPercorso,Percorso);
sTmp=strtok(sPercorso,"\\");
sLast=(char*)malloc(sizeof(char)*strlen(sTmp)+1);
strcpy(sLast,sTmp);
while(sTmp!=NULL)
{
sLast=(char*)malloc(sizeof(char)*strlen(sTmp)+1);
strcpy(sLast,sTmp);
sTmp=strtok(NULL,"\\");
}
NomeFileOutput=(char*)malloc(strlen(Percorso) + strlen("\\") + strlen(sLast) + strlen(".AFP") + 1);
strcpy(NomeFileOutput,Percorso);
strcat(NomeFileOutput,"\\");
strcat(NomeFileOutput,sLast);
strcat(NomeFileOutput,".AFP");
}
//
//____________________________________________________________________
//*********************************************************************
// FUNZIONE PER IMPOSTARE IL NOME DEL FILE STATISTICA
void ImpostaNomeFileStatistica()
{
char *sTmp,*sLast,*sPercorso;
sPercorso=(char*)malloc(sizeof(char)*strlen(Percorso)+1);
strcpy(sPercorso,Percorso);
sTmp=strtok(sPercorso,"\\");
sLast=(char*)malloc(sizeof(char)*strlen(sTmp)+1);
strcpy(sLast,sTmp);
while(sTmp!=NULL)
{
sLast=(char*)malloc(strlen(sTmp)+1);
strcpy(sLast,sTmp);
sTmp=strtok(NULL,"\\");
}
NomeFileStatistica=(char*)malloc(strlen(Percorso) + strlen("\\") + strlen(sLast) + strlen("_stat.txt") + 1);
strcpy(NomeFileStatistica,Percorso);
strcat(NomeFileStatistica,"\\");
strcat(NomeFileStatistica,sLast);
strcat(NomeFileStatistica,"_stat.txt");
}
//
//____________________________________________________________________
//*********************************************************************
// FUNZIONE PER INIZIALIZZARE LA STRUTTURA STATISTICA
void InizializzaStrutturaStat()
{
for(int i=0;i<=MaxFogliPerBusta;i++)
{
Stat[i].QtaBuste=0;
}
}
//
//____________________________________________________________________
//*********************************************************************
// FUNZIONE PER INIZIALIZZARE LA STRUTTURA DESCRIZIONE FILE
void InizializzaStrutturaDescAfp()
{
//printf("%d\n",sizeof(DescrizioneAfp));
DescAfp=(struct DescrizioneAfp*)malloc(sizeof(struct DescrizioneAfp)*(NumeroDiFile+1));
for(int i=0;i<NumeroDiFile;i++)
{
DescAfp[i].NomeFile=(char*)malloc(strlen(ElencoFileInput[i])+1);
strcpy(DescAfp[i].NomeFile,ElencoFileInput[i]);
DescAfp[i].QtaBuste=0;
DescAfp[i].QtaPerFile=0;
}
}
//
//____________________________________________________________________
void main(void)
{
FILE *fpi;
FILE *fpo;
int i;
int ContatoreFile;
int ParzialePagine=0;
int PagineTotali=0;
int TotBuste=0;
long ByteLetti=0;
long RecordAfp=0;
long LenRecord;
char *s5A;
char *NomeFileInput;
char *StrApp;
char *BufferRecord;
char *Record;
char *TipoRecord;
char *TipoRecordHex;
char TipoRecordBDT[] ="D3A8A8"; // begin document
char TipoRecordEDT[] ="D3A9A8"; // end document
char TipoRecordBPG[] ="D3A8AF"; // begin page
char TipoRecordEPG[] ="D3A9AF"; // end page
char TipoRecordBNG[] ="D3A8AD"; // begin named page group
char TipoRecordENG[] ="D3A9AD"; // end named page group
bool ScriviRecord;
StrutturaStatistica StatFile[MaxFogliPerBusta];
CreaListaFile();
ImpostaNomeFileOutput();
ImpostaNomeFileStatistica();
InizializzaStrutturaStat();
InizializzaStrutturaDescAfp();
s5A=(char*)malloc(1);
fpo=fopen(NomeFileOutput,"wb");
for(ContatoreFile=0;ContatoreFile<NumeroDiFile;ContatoreFile++)
{
RecordAfp=0;
ParzialePagine=0;
for (i=0;i<=MaxFogliPerBusta;i++)
{
StatFile[i].QtaBuste=0;
}
NomeFileInput=(char*)malloc(strlen(Percorso) + strlen(ElencoFileInput[ContatoreFile]) + 1);
strcpy(NomeFileInput,Percorso);
strcat(NomeFileInput,ElencoFileInput[ContatoreFile]);
ByteLetti=0;
fpi=fopen(NomeFileInput,"rb");
while((!feof(fpi)) && (get_filesize(ElencoFileInput[ContatoreFile])<ByteLetti))
{
//inizio record 5a, leggo un byte e mi aspetto il 5A
RecordAfp++;
ScriviRecord=true;
fread(s5A,1,1,fpi);
ByteLetti++;
if(s5A[0]!='\x5A')
{
printf("manca 5A al record afp n. %d del file %s\n",RecordAfp,ElencoFileInput[ContatoreFile]);
return;
}
//calcolo la lunghezza del record 5A e inizio a riempire il buffer di output
StrApp=(char*)malloc(2);
fread(StrApp,2,1,fpi);
ByteLetti+=2;
LenRecord=(unsigned char)StrApp[0]*256+(unsigned char)StrApp[1];
BufferRecord=(char*)malloc(sizeof(char)*(3 + LenRecord));
//printf("%c\n",StrApp[0]);
//printf("%c\n",BufferRecord[0]);
BufferRecord[0]=s5A[0];
BufferRecord[1]=StrApp[0];
BufferRecord[2]=StrApp[1];
//leggo tutto il record 5A
Record=(char*)malloc(LenRecord-2);
fread(Record,(LenRecord-2),1,fpi);
ByteLetti+=sizeof(Record);
//trovo il tipo record 5A
TipoRecord=(char*)malloc(3);
TipoRecordHex=(char*)malloc(7);
TipoRecord[0]=Record[0];
TipoRecord[1]=Record[1];
TipoRecord[2]=Record[2];
TipoRecordHex=AsciiToHex(TipoRecord,3);
//faccio varie operazioni a seconda del record 5A
if(stricmp(TipoRecordHex,TipoRecordBDT)==0) //inizio del file. Solo se è il primo file allora scrivo il record
{
for(i=0;i<LenRecord-2;i++)
BufferRecord[i+3]=Record[i];
if(ContatoreFile>0)
ScriviRecord=false;
}
else if(stricmp(TipoRecordHex,TipoRecordEDT)==0) //fine del file. Solo se è l'ultimo file allora scrivo il record
{
for(i=0;i<LenRecord-2;i++)
BufferRecord[i+3]=Record[i];
if(ContatoreFile<(NumeroDiFile-1))
ScriviRecord=false;
}
else if(stricmp(TipoRecordHex,TipoRecordBPG)==0) //nuova pagina, conto le pagine di ogni file
{
for(i=0;i<LenRecord-2;i++)
BufferRecord[i+3]=Record[i];
DescAfp[ContatoreFile].QtaPerFile++;
PagineTotali++;
}
else if(stricmp(TipoRecordHex,TipoRecordEPG)==0) //fine pagina
{
for(i=0;i<LenRecord-2;i++)
BufferRecord[i+3]=Record[i];
ParzialePagine++;
}
else if(stricmp(TipoRecordHex,TipoRecordBNG)==0) //nuova anagrafica
{
for(i=0;i<LenRecord-2;i++)
BufferRecord[i+3]=Record[i];
DescAfp[ContatoreFile].QtaBuste++;
TotBuste++;
}
else if(stricmp(TipoRecordHex,TipoRecordENG)==0) //fine anagrafica
{
for(i=0;i<LenRecord-2;i++)
BufferRecord[i+3]=Record[i];
if(ParzialePagine%2!=0)
{
puts("Pagine non pari");
return;
}
Stat[ParzialePagine/2].QtaBuste++;
StatFile[ParzialePagine/2].QtaBuste++;
ParzialePagine=0;
}
else
{
for(i=0;i<LenRecord-2;i++)
BufferRecord[i+3]=Record[i];
}
// scrivo il record nel file
if(ScriviRecord==true)
{
fwrite(BufferRecord,LenRecord+1,1,fpo);
}
}
fclose(fpi);
}
fcloseall();
}