Restructurateur de fichiers cobol


Description

le langage COBOL (certain disent qu'il s'agit de Completely Obsolete Business Oriented Language... Mais j'ai un doute ^_^...) est toujours utilisé, nottement dans ma classe (et oui, c'est ça qu'on apprend ici...)
Mais je trouve assez frustrant de devoir à chaque fois faire soi-même les tabulation, indentation,... (par ex., certains trucs doivent se mettre en 8ème colonne, d'autres en 12ème ou +, d'autres en 7ème,...)
Ben ici, c'est automatique!

vous tapez :
line fichier_à_traiter
ou :
line source destination

Et il le fait pour vous! De plus, il indente aussi les IF, THEN, ...

Source / Exemple :


#include <stdio.h>
#include "fct_string.h"
#include "fct_file.h"

#define SPC_PAR_TAB 4

#define OS "\n"
// #define OS "\n" /* ?!! il semble prendre '\n' pour le DOS... */
// #define TMP "c:\\Windows\\Temp\\line-cob.tmp"
define TMP "/tmp/line-cob.tmp"
// #define CFG "c:\\Windows\\System\\line.cob"
#define CFG "/usr/line.cob"
#define MIN_SPC 7
#define BASE_SPC 11

#define ENT(tmp) (tmp=='\r' || tmp=='\n')
#define SPC(tmp) (tmp=='\t' || tmp==' ' )

main (int argc, char *arg[]) {
     FILE *src=NULL, *dest=NULL;
     char **dat=0, *ln=0, *eol=0, tmp=0;
     int i, num, err_num=0, last_spc=BASE_SPC, spc=BASE_SPC, next_spc=BASE_SPC;
     
                             if (argc<=1)   { printf("\nEt si vous précisiez un fichier, pour voir ?\n");                      return (0);}
     dat=file(CFG);          if (!dat)      { printf("\nLe Programme n'a pas pu trouver le fichier de configuration "CFG"\n"); return (0);}
     src=fopen(arg[1], "r"); if (!src)      { printf("\nErreur lors de l'ouverture du fichier source %s\n", arg[1]);           return (0);}
     dest=fopen(TMP, "w");   if (!dest)     { printf("\nErreur d'écriture sur le fichier temporaire "TMP"\n");                 return (0);}
     
     eol=concact(OS, 0);
     
     for(tmp=fgetc(src) ; tmp!=EOF ; ) {
               ln=0;
               for( ; tmp!=EOF && (ENT(tmp) || SPC(tmp)) ; tmp=fgetc(src));
               for(i=0 ; tmp!=EOF && !ENT(tmp) ; i++, tmp=fgetc(src)) {
                       ln=(char *)realloc(ln, (i+1)*sizeof(char));
                       ln[i]=tmp;
               }
               ln[i]='\0';
               ln=rtrim(ln);
               
               num=2;
               if (!search(" ", ln) && search(".", ln)) {
                             spc=MIN_SPC;
                             next_spc=BASE_SPC;
               }
               else {
                   if(ln[0]<='9' && ln[0]>='0') {
                                 num=a2i(ln);
                                 if (num==1) {spc=MIN_SPC; num=2;}
                                 if (num==88) { spc=last_spc+3; num=2;}
                   }
                   else {
                        for(i=0 ; dat[i] && dat[i+1] ; i+=2) {
                                switch(dat[i+1][0]) {
                                                    case 'R': if (!compare(dat[i], ln)) {
                                                         free(ln);
                                                         ln=tronque(dat[i+1], -1);
                                                    }
                                                    break;
                                                    case '0': if (search(toupper(dat[i]), toupper(ln)))
                                                         spc=MIN_SPC;
                                                    break;
                                                    case '+': if (search(toupper(dat[i]), toupper(ln))==1)
                                                         next_spc+=SPC_PAR_TAB;
                                                    break;
                                                    case '-': if (search(toupper(dat[i]), toupper(ln))==1)
                                                         spc-=SPC_PAR_TAB;
                                                    break;
                                                    case '.': if (search(toupper(dat[i]), toupper(ln)))
                                                         next_spc=BASE_SPC;
                                                    break;
                                                    case '/': if (search(toupper(dat[i]), toupper(ln))==1) {
                                                         spc-=SPC_PAR_TAB;
                                                         next_spc-=SPC_PAR_TAB;
                                                    }
                                                    break;
                                                    case 'r': if (search(dat[i], ln))
                                                         ln=replace(ln, dat[i], tronque(dat[i+1], -1));
                                                    break;
                                }
                        }
                   }                    
               }
               for( ; tmp!=EOF && (ENT(tmp) || SPC(tmp)) ; tmp=fgetc(src));
               
               if (ln[0]=='*') spc=MIN_SPC-1;
               if (num<2) num=2;
               num=spc+=(num-2)*SPC_PAR_TAB;
               for (i=0 ; i<num ; i++)
                   fputc(' ', dest);
               for (i=0 ; ln[i] ; i++)
                   fputc(ln[i], dest);
               for (i=0 ; eol[i] ; i++)
                   fputc(eol[i], dest);
               
               free(ln);
               last_spc=spc;
               spc=next_spc;
     } 
     
     fclose (src);
     fclose (dest);
     src=fopen(TMP, "r");
     if (!(argc>2))
         dest=fopen(arg[1], "w");
     else
         dest=fopen(arg[2], "w");
     
     if (!dest) { printf("\nErreur d'écriture sur le fichier de destination %s\n", arg[2]); return (0);}
     
     for (tmp=fgetc(src) ; tmp!=EOF ; tmp=fgetc(src))
         fputc(tmp, dest);     
     
}

Conclusion :


si, par hasard, j'avais oublié une structure ou l'autre, ce serait sympa de le dire, non? ^_^

PS : édité à l'origine sous LINUX... donc, pas de problème pour l'y faire tourner... SI vous trouvez une utilité à du code source COBOL sous LINUX...
PPS : fonctionne aussi sous Microsoft OS. J'ai testé.

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.