Structure des fichiers dbf

Description

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);
   }
}

Codes Sources

A voir également

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.