Convertion d'un fichier GS vers un fichier PC

// conversion fichier GS en PC


#include "FCT_BASE.H"


void compacte (char *chaine)
// 11140
// a$ -> chaine
{
char tampon[LONG_ENR+1];

  strncpy (tampon, chaine, 4);         // numero d'enregistrement
  strncpy (tampon+4, chaine+5, 5);      // date op
  strncpy (tampon+9, chaine+11, 8);      // type op
  strncpy (tampon+17, chaine+20, 25);    // objet
  strncpy (tampon+42, chaine+46, 5);     // credit francs
  strncpy (tampon+47, chaine+52, 2);    // credit centimes
  strncpy (tampon+49, chaine+55, 6);    // debit francs
  strncpy (tampon+55, chaine+62, 2);    // centimes
  strncpy (tampon+57, chaine+65, 9);     // code compta
  if ( strlen (chaine) == LONG_VISU ) {
    strncpy(tampon+66, chaine+75, 5);
    tampon[71] = 0;
  }
  else
    tampon [66] = 0;
  strcpy (chaine, tampon);
}

void decompacte (char *chaine)
// 11120
// a$ ->chaine
{
char tampon[LONG_VISU+1];

  strncpy (tampon, chaine, 4);              // numero d'enregistrement
  tampon [4] = ' ';
  strncpy (tampon+5, chaine+4, 5);         // date op
  tampon [10] = ' ';
  strncpy (tampon+11, chaine+9, 8);         // type op
  tampon [19] = ' ';
  strncpy (tampon+20, chaine+17, 25);      // objet
  tampon [45] = ' ';
  strncpy (tampon+46, chaine+42, 5);       // credit francs
  if (chaine[42+4] != ' ')                 // Si pas de zero pas de point
    tampon [51] = '.';
  else
    tampon [51] = ' ';
  strncpy (tampon+52, chaine+47, 2);      // credit centimes
  tampon [54] = ' ';
  strncpy (tampon+55, chaine+49, 6);       // debit francs
  if (chaine[49+5] != ' ')            // Si pas de zero pas de point
    tampon [61] = '.';
  else
    tampon [61] = ' ';
  strncpy (tampon+62, chaine+55, 2);      // debit centimes
  tampon [64] = ' ';
  strncpy (tampon+65, chaine+57, 9);      // code compta
  if ( strlen (chaine) == LONG_ENR ) {
    tampon [74] = ' ';
    strncpy (tampon+75, chaine+66, 5);    // date marquage
    tampon [80] = 0;
  }
  else
    tampon [74] = 0;
  strcpy (chaine, tampon);
}



void Lecture_ligne_old (char* nom, int numero, char* ligne)
// 10300 -> 10310
// A$ = ligne
// FI$ = nom
// I= numero
{
FILE *fichier;

  fichier = fopen (nom, "rb");
  if (fichier != NULL) {
    if (numero == 0) {
      fseek (fichier, 0, SEEK_SET);
      fgets (ligne, LONG_ENR0+1, fichier);
    }
    else {
      fseek (fichier, ((long) numero - 1) * (LONG_ENR + 1)
                + LONG_ENR0 + 1, SEEK_SET);
      fgets (ligne, LONG_ENR+1, fichier);
      decompacte (ligne);
    }
    fclose (fichier);
  }
}


main ()
{
char ligne[LONG_VISU];
char nom[50];
char nom2[50];
int i;
ctxt Contexte;
int Mois, Mois_Prec=0, Jour, Annee;
char banque[13], reel[13], banque_init[13], reel_init[13];
int cr;
char debit[10], credit[9], Type[9];
Fiche fiche;


  printf ("Entrez le nom du fichier init ");
  scanf ("%s",nom);
  printf ("Année de départ et de création du compte ");
  scanf ("%i", &Annee);
  printf ("Entrez le nom du fichier resultat ");
  scanf ("%s",nom2);
  Lecture_ligne_old (nom, 0, ligne);
  // interprete l'enregistrement 0
  cr = sscanf (ligne, "%12c%2d/%2d%4d%11s%11s%11s%11s",
          Contexte.numero_compte,
          &Jour, &Mois,
          &Contexte.suivant,
          banque, reel, banque_init, reel_init);
  if (cr != 8) {
    printf ("Erreur Scanf ligne 0\n");
  }
  Contexte.date_creation = TDate (Mois, Jour, Annee);
  Contexte.rang_max = 1;
  Contexte.numero_compte[12] = 0;
  cr = strlen (banque);
  banque[cr+1] = 0;
  banque[cr] = banque[cr-1];
  banque[cr-1] = banque[cr-2];
  banque[cr-2] = '.';
  Contexte.solde_banque = TMontant(banque, 12);
  cr = strlen (reel);
  reel[cr+1] = 0;
  reel[cr] = reel[cr-1];
  reel[cr-1] = reel[cr-2];
  reel[cr-2] = '.';
  Contexte.solde_reel = TMontant (reel, 12);
  cr = strlen (banque_init);
  banque_init[cr+1] = 0;
  banque_init[cr] = banque_init[cr-1];
  banque_init[cr-1] = banque_init[cr-2];
  banque_init[cr-2] = '.';
  Contexte.solde_banque_init = TMontant (banque_init, 12);
  cr = strlen (reel_init);
  reel_init[cr+1] = 0;
  reel_init[cr] = reel_init[cr-1];
  reel_init[cr-1] = reel_init[cr-2];
  reel_init[cr-2] = '.';
  Contexte.solde_reel_init = TMontant (reel_init, 12);
  Contexte.num_chq=0;
  // Ecriture du contexte
  Ecriture_ligne (nom2, 0, Contexte);

  for (i=1; i < Contexte.suivant; i++) {
    Lecture_ligne_old (nom, i, ligne);
    printf ("%s\n", ligne);
    // Interprete la ligne
    cr = sscanf (ligne, "%4s %2d/%2d %8c %25c",
          banque_init,
          &Jour, &Mois,
          Type, fiche.libelle);
    if (cr != 5) {
      printf ("Erreur scanf ligne \n");
    }
    if ((Mois == 1) && (Mois_Prec == 12)) {
      Annee++;
    }
    Mois_Prec = Mois;
    fiche.Date_Op = TDate (Jour, Mois, Annee);
    Type[8] = 0;
    fiche.mode_paiement.numero_chq = atol (Type);
    if (strcmp (Type, "CB.     ") == 0) {
      fiche.mode_paiement.type = TYPE_CB;
    }
    else if (strcmp (Type, "PREL.   ") == 0) {
      fiche.mode_paiement.type = TYPE_PREL;
    }
    else if (strcmp (Type, "VIR.    ") == 0) {
      fiche.mode_paiement.type = TYPE_VIR;
    }
    else if (strcmp (Type, "AUTRE   ") == 0) {
      fiche.mode_paiement.type = TYPE_AUTRE;
    }
    else {
      fiche.mode_paiement.type = TYPE_CHEQUE;
    }
    fiche.libelle[25] = 0;
    strncpy (credit, ligne+46, 8);
    credit[8]=0;
    strncpy (debit, ligne+55, 9);
    debit[9]=0;
    fiche.montant = TMontant (credit, 8) + TMontant (debit, 9);
    strncpy (fiche.code, ligne+65, 9);
    fiche.code[9]=0;
    if (strlen (ligne) <= 79) {
      fiche.Date_Marquage = TDate (1, 1, ANNEE_NON_MARQ);
    }
    else {
      cr = sscanf (ligne+75, "%2d/%2d", &Jour, &Mois);
      if (cr != 2) {
        printf ("Erreur scanf Marquage\n");
      }
      fiche.Date_Marquage = TDate (Jour, Mois, Annee);
    }
    Ecriture_ligne (nom2, i, fiche);
  }
  return 0;
}