// Edition des operations automatiques
#include "saisie.h"
#include "type_def.h"
#include "fct_base.h"
void Lecture_Op_Auto (char *nom_fich, int num, Op_Auto *code)
{
FILE *fichier;
fichier = fopen (nom_fich, "rb");
if (fichier != NULL) {
fseek (fichier, ((long) num) * sizeof(Op_Auto)), SEEK_SET);
fread (Op_Auto, sizeof(Op_Auto), 1, fichier);
fclose (fichier);
}
}
static Op_Auto* Ajout_code (pctxt contexte, Op_Auto &op_auto)
{
char tampon [LONG_CODE];
eff_esp_trav ();
if (contexte->nb_code == 500) {
gotoxy (1,16);
printf ("Plus de place disponible");
return NULL;
}
gotoxy (1,16);
printf ("Entrez le nouveau code compta");
Saisie_clavier (NON_VIDE, 9, tampon);
eff_esp_trav ();
if (tampon[0] == ESCAPE) {
return NULL;
}
sprintf (code, "%-9.9s", tampon);
strupr (code);
contexte->nb_code ++;
eff_esp_fich ();
return code;
}
void Modification_code (pctxt contexte, char tab_code[][LONG_CODE])
{
char tampon[LONG_CODE];
char tampon2[LONG_CODE];
int i;
eff_esp_trav ();
gotoxy (1,16);
printf ("Code compta … modifier ");
Saisie_clavier (NON_VIDE, 9, tampon);
if (tampon[0] == ESCAPE) {
eff_esp_trav ();
return;
}
sprintf (tampon2, "%-9.9s", tampon);
strupr (tampon2);
i=-1;
while ( (++i < contexte->nb_code) && (strcmp (tampon2, tab_code[i])));
if (i >= contexte->nb_code) {
eff_esp_trav ();
gotoxy (1,15);
printf ("Code compta inexistant");
return;
}
gotoxy (1,18);
printf ("Nouveau code ");
Saisie_clavier (NON_VIDE, 9, tampon, tab_code[i]);
if (tampon[0] == ESCAPE) {
eff_esp_trav ();
return;
}
sprintf (tab_code[i], "%-9.9s", tampon);
strupr (tab_code[i]);
eff_esp_trav ();
return;
}
void Listing (pctxt contexte, char tab_code[][LONG_CODE])
{
int i;
eff_esp_trav ();
gotoxy (1,15);
printf ("Impression en cours");
fprintf (stdprn, "\n *** LISTING DES CODES COMPTA **\n\n");
for (i = 0; i < contexte->nb_code; i++) {
fprintf (stdprn, "Code Nø%3i : %s ",i+1,tab_code[i]);
if (i%2 == 1) {
fprintf (stdprn, "\n");
}
}
fprintf (stdprn, "\n\n\n\n");
eff_esp_trav ();
gotoxy (1,15);
printf ("Impression termin‚e");
return;
}
void Enregistre_codes (pctxt contexte, char tab_code[][LONG_CODE])
{
FILE* flux;
int i;
char longueur[LONG_CODE+1];
flux = fopen (contexte->nom_fich_code, "w");
if (flux != NULL) {
sprintf (longueur, "%-9.9i\n", contexte->nb_code);
fputs (longueur, flux);
for (i=0; i< contexte->nb_code; i++) {
fputs (tab_code[i], flux);
fputc ('\n', flux);
}
fclose (flux);
}
}
int fct_comparaison (const void *chaine1, const void *chaine2)
{
return (strcmp ((char *) chaine1, (char *) chaine2));
}
void edite_op_auto (pctxt contexte)
{
FILE *flx_code;
int n;
char tampon[LONG_CODE], code[500][LONG_CODE];
int mini;
int i,k;
char pm[4][13] = {"AJOUT ", "MODIFICATION",
"LISTING ", "RETOUR MENU "};
int c=0;
int ky;
int pos;
clrscr ();
gotoxy (10,25);
textattr (INVERSE);
cprintf ("Edition des Codes Compta.");
textattr (NORMAL);
if ((flx_code = fopen (contexte->nom_fich_code, "rt")) == NULL) {
// Fichier code inexistant
n = 0;
gotoxy (1,19);
printf ("Tapez ECHAPEMENT … la fin");
do {
gotoxy (1,16);
clreol ();
printf ("Code %i (9 Caracts Max)",n+1);
Saisie_clavier (NON_VIDE, LONG_CODE-1, tampon);
if (tampon[0] == ESCAPE) {
if (n > 0) {
eff_esp_trav ();
contexte->nb_code = n;
break;
}
}
else {
sprintf (code[n],"%-9.9s",tampon);
strupr (code[n]);
n++;
if (n >= 500) {
printf ("Fin de l'entr‚e des codes compta. Impossible d'en entrer plus");
contexte->nb_code = 500;
break;
}
}
}
while (1);
}
else {
fclose (flx_code);
Lecture_code (contexte->nom_fich_code, 0, tampon);
contexte->nb_code = strtod (tampon, NULL);
for (n=0; n<contexte->nb_code; n++) {
Lecture_code (contexte->nom_fich_code, n+1, code[n]);
}
}
do {
mini = max (1, contexte->nb_code - 87);
for (i = mini, pos = 1; i <= contexte->nb_code; i++, pos += LONG_CODE) {
for (k = 0; (k <= 10) && (k+(i-1)*11 < contexte->nb_code); k++) {
gotoxy (pos, k+1);
printf ("%9.9s", code[k+(i-1)*11]);
}
}
do {
c += 4;
c %= 4;
for (i=0; i<4; i++) {
gotoxy (1 + 20*(i%2), 16 + i/2);
if (i==c)
textattr (INVERSE);
cprintf ("%s", pm[i]);
textattr (NORMAL);
}
ky = getch ();
if (ky == 0) {
ky = 1000 + getch ();
}
switch (ky) {
case FL_DR :
c++;
break;
case FL_GA :
c--;
break;
case FL_HA :
case FL_BA :
case ESPACE :
c += 2;
break;
case ESCAPE :
clrscr ();
return;
case RETURN :
break;
default :
break;
}
}
while (ky!=RETURN);
switch (c) {
case 0 :
Ajout_code (contexte, code[contexte->nb_code]);
break;
case 1 :
Modification_code (contexte, code);
break;
case 2 :
Listing (contexte, code);
break;
case 3 :
Enregistre_codes (contexte, code);
clrscr();
return;
}
qsort (code, contexte->nb_code, LONG_CODE, fct_comparaison);
}
while (1);
}