Pour chaque fichier DBF existant dans le dossier courrant, le programme fait un autre fichier, ayant meme nom et STR comme extension, qui contient code source C utilisable.
Source / Exemple :
//03-sep-2008 10:06:02
#include <dos.h>
#include <stdio.h>
#include <io.h>
#include <string.h>
#include <dir.h>
typedef unsigned short ushort;
typedef unsigned long ulong;
typedef unsigned char uchar;
#define O_BINARY 0x8000
#define O_RDONLY 1
struct date d;
ushort RCS,N,N1;
uchar nom_dbf[40];
uchar nom_str[40];
short nf;
FILE *fis;
ushort i,j,k;
uchar alfa[100];
struct DBF1
{
uchar version;
uchar aallzz[3];
ulong nart;
ushort lg_antet;
ushort RCS;
uchar rien[20];
} ant1;
struct DBF2
{
uchar nom[11];
uchar tip;
ushort depl;
ushort rien1;
uchar longueur;
uchar decimals;
uchar rien2[14];
} ant2;
struct ffblk a;
int I;
uchar man[1024];
uchar buf[BUFSIZ];
void main(void)
{
getdate(&d);
sprintf(man,"*.DBF");
I=findfirst(man,&a,0);
while(!I)
{
strcpy(nom_dbf,a.ff_name);
I=findnext(&a);
strcpy(nom_str,nom_dbf);
sprintf(nom_str+strlen(nom_str)-3,"str");
printf("\n%s ==> %s",nom_dbf,nom_str);
if((nf=open(nom_dbf,O_BINARY|O_RDONLY))<1)
{
printf("\nFichier %s absent.",nom_dbf);
return;
}
RCS=filelength(nf);
if(RCS<sizeof(ant1)+sizeof(ant2))
{
printf("\nFichier %s trop petit.",nom_dbf);
return;
}
RCS=sizeof(ant1);
read(nf,&ant1,RCS);
if(ant1.version<3)
{
printf("\nVersion %s incorrecte.",nom_dbf);
return;
}
fis=fopen(nom_str,"wt");
setbuf(fis,buf);
fprintf(fis,"//%s\n//RCS:%u NART:%lu\n",
nom_dbf,ant1.RCS,ant1.nart);
fprintf(fis,"struct DBF\n");
fprintf(fis,"{\n");
sprintf(man,"uchar efface;");
fprintf(fis,"\t%s\n",man);
N=(ant1.lg_antet-32)/32;
N1=0;
for(i=0;i<N;i++)
{
read(nf,&ant2,32);
if(ant2.nom[0]==0x0D) break;
N1++;
for(j=0;j<11;j++)
{
if(!ant2.nom[j]) break;
if(ant2.nom[j]==' ') break;
}
sprintf(man,"uchar %*.*s[%u];%100s",
j,j,ant2.nom,ant2.longueur,"");
sprintf(man+22," //%c",ant2.tip);
if(ant2.decimals) sprintf(man+strlen(man),
" %-2u DEC",ant2.decimals);
else sprintf(man+strlen(man)," %6s","");
sprintf(man+strlen(man)," C%u",i+1);
fprintf(fis,"\t%s\n",man);
}
N=N1;
N1=ant1.lg_antet-(N+1)*32;
fprintf(fis,"} dbf;\n");
fprintf(fis,"#define N %lu\n",N);
fprintf(fis,"struct ANTET_BASE\n");
fprintf(fis,"{\n");
fprintf(fis,"\tuchar version;\n");
fprintf(fis,"\tuchar annee;\n");
fprintf(fis,"\tuchar mois;\n");
fprintf(fis,"\tuchar jour;\n");
fprintf(fis,"\tulong nb_art;\n");
fprintf(fis,"\tushort lg_antet;\n");
fprintf(fis,"\tushort RCS;\n");
fprintf(fis,"\tuchar rien[20];\n");
fprintf(fis,"\tstruct\n");
fprintf(fis,"\t{\n");
fprintf(fis,"\t\tuchar den_champ[11];\n");
fprintf(fis,"\t\tuchar tip_champ;\n");
fprintf(fis,"\t\tulong adresse;\n");
fprintf(fis,"\t\tuchar lg_champ;\n");
fprintf(fis,"\t\tuchar nb_dec;\n");
fprintf(fis,"\t\tuchar rien[14];\n");
fprintf(fis,"\t} champs[N];\n");
fprintf(fis,"} a=\n");
fprintf(fis,"{\n");
lseek(nf,0l,SEEK_SET);
RCS=sizeof(ant1);
read(nf,man,RCS);
man[1]=d.da_year-1900;
man[2]=d.da_mon;
man[3]=d.da_day;
man[4]=man[5]=man[6]=man[7]=0;
fprintf(fis,"\t");
fprintf(fis,"%u,%u,%u,%u,0,%u,%u,\
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\n",
man[0],man[1],man[2],man[3],
man[9]*256+man[8],man[11]*256+man[10]);
for(i=0;i<N;i++)
{
read(nf,man,RCS);
fprintf(fis,"\t");
memset(alfa,0,12);
for(k=0;k<11;k++)
{
if(!man[k]) break;
alfa[k]=man[k];
}
k=11-k;
fprintf(fis,"\"%s\"%*s,'%c',%4lu,%3u,%2u,\
0,0,0,0,0,0,0,0,0,0,0,0,0,0",
alfa,k,"",man[11],man[12]+256l*(man[13]+
256l*(man[14]+256l*man[15])),man[16],man[17]);
if(i<N-1) fprintf(fis,",");
fprintf(fis,"\n");
}
fprintf(fis,"};\n");
if(N1)
{
N=N1/RCS;
fprintf(fis,"uchar b[%lu]=\n{",N1);
N1-=N*RCS;
for(i=0;i<N;i++)
{
read(nf,man,RCS);
fprintf(fis,"\n\t");
for(j=0;j<RCS;j++)
{
fprintf(fis,"%u",man[j]);
if(N1||j<RCS-1||i<N-1) fprintf(fis,",");
}
}
if(N1)
{
read(nf,man,N1);
fprintf(fis,"\n\t");
for(j=0;j<N1;j++)
{
fprintf(fis,"%u",man[j]);
if(j<N1-1) fprintf(fis,",");
}
}
fprintf(fis,"\n};\n");
}
fclose(fis);
close(nf);
}
}
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.