Conversion de fichiers fortran 77 en fortran 95

Soyez le premier à donner votre avis sur cette source.

Vue 4 861 fois - Téléchargée 367 fois

Description

Tout est dans le titre !
C'est un petit convertisseur qui mets en forme le code Fortran 77 pour qu'il soit compilable et executable par un compilateur Fortran 95.

Par exemple :
- Il modifie les commentaires
- il réagence les lignes de code en repoussant la limite de 72 caractères à 132

Source / Exemple :


private void buttonConvertir_Click(object sender, EventArgs e)
        {

            if (listFiles.Items.Count == 0)
                MessageBox.Show("Pas de fichiers sélectionnés !");
            else
            {
                DialogResult result = MessageBox.Show("Attention !\nCe logiciel ne s'applique qu'au code écrit en Fortran 77 et destiné à être transformé en Fortran 95.\nEtes-vous sur que tous les fichiers sélectionnés contiennent uniquement du code fortran sans Beuge du à la syntaxe ?", "Important !", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button2);
                List<String> listFileDone = new List<string>();
                List<String> tamponLigne = new List<string>();
                if (result == DialogResult.Yes)
                {
                    int numberFileDone = 0;
                    progressBar1.Visible = true;
                    foreach (String fileName in listFiles.Items)
                    {
                        bool first = true;
                        StreamReader sr = new StreamReader(fileName);
                        String newFileName = rightName(fileName);
                        FileStream newFile = File.Create(newFileName);
                        newFile.Close();
                        StreamWriter sw = new StreamWriter(newFileName);
                        listFileDone.Add(newFileName);

                        String lastLigne = "";
                        while (!sr.EndOfStream)
                        {
                            String res = sr.ReadLine();
                            if (res.Length > 5 && res.Substring(0, 5) == "     " && res.Substring(5, 1) != " ")
                            {
                                tamponLigne.Add(res);
                            }
                            else if (tamponLigne.Count != 0)
                            {
                                String newLigne = lastLigne;
                                lastLigne = "";
                                foreach (String ligne in tamponLigne)
                                {
                                    if (ligne.Substring(6, 1) == " ")
                                    {
                                        int indice = 6;
                                        while (ligne.Substring(indice, 1) == " ")
                                        {
                                            indice++;
                                        }
                                        newLigne += " " + ligne.Substring(indice);
                                    }
                                    else
                                        newLigne += " " + ligne.Substring(6);
                                }
                                if (newLigne.Length > 132)
                                {
                                    tamponLigne.Clear();
                                    tamponLigne = decoupeLigne(newLigne);
                                    foreach (String ligne in tamponLigne)
                                    {
                                        sw.WriteLine(ligne);
                                    }
                                }
                                else
                                    sw.WriteLine(newLigne);

                                tamponLigne.Clear();

                                if (res.Length > 0 && (res.Substring(0, 1) == "c" || res.Substring(0, 1) == "*" || res.Substring(0, 1) == "C"))
                                    res = "!" + res.Substring(1);
                                lastLigne = res;
                            }
                            else
                            {
                                if (res.Length > 0 && (res.Substring(0, 1) == "c" || res.Substring(0, 1) == "*" || res.Substring(0,1) == "C"))
                                    res = "!" + res.Substring(1);
                                if(!first)
                                    sw.WriteLine(lastLigne);
                                else
                                    first = false;
                                lastLigne = res;
                            }
                        }
                        if (tamponLigne.Count != 0)
                        {
                            String newLigne = lastLigne;
                            lastLigne = "";
                            foreach (String ligne in tamponLigne)
                            {
                                if (ligne.Substring(6, 1) == " ")
                                {
                                    int indice = 6;
                                    while (ligne.Substring(indice, 1) == " ")
                                    {
                                        indice++;
                                    }
                                    newLigne += " " + ligne.Substring(indice);
                                }
                                else
                                    newLigne += " " + ligne.Substring(6);
                            }
                            if (newLigne.Length > 132)
                            {
                                tamponLigne.Clear();
                                tamponLigne = decoupeLigne(newLigne);
                                foreach (String ligne in tamponLigne)
                                {
                                    sw.WriteLine(ligne);
                                }
                            }
                            else
                                sw.WriteLine(newLigne);
                            tamponLigne.Clear();
                        }
                        sw.WriteLine(lastLigne);
                        tamponLigne.Clear();
                        sr.Close();
                        sw.Close();
                        numberFileDone++;
                        progressBar1.Value = (numberFileDone / listFiles.Items.Count) * 100;
                        progressBar1.Update();
                    }

                    if (!checkBoxDeleteFile.Checked)
                    {
                        foreach (String fileName in listFiles.Items)
                        {
                            if (!Directory.Exists(directoryPath(fileName) + "\\Fichier avant conversion"))
                            {
                                Directory.CreateDirectory(directoryPath(fileName) + "\\Fichier avant conversion");
                            }

                            String temp = directoryPath(fileName) + "\\Fichier avant conversion" + "\\" + fileName.Substring(fileName.LastIndexOf("\\") + 1);

                            if (File.Exists(directoryPath(fileName) + "\\Fichier avant conversion" + "\\" + fileName.Substring(fileName.LastIndexOf("\\") + 1)))
                                File.Delete(directoryPath(fileName) + "\\Fichier avant conversion" + "\\" + fileName.Substring(fileName.LastIndexOf("\\") + 1));
                            File.Move(fileName, directoryPath(fileName) + "\\Fichier avant conversion" + "\\" + fileName.Substring(fileName.LastIndexOf("\\") + 1));
                        }
                    }
                    else
                    {
                        foreach (String fileName in listFiles.Items)
                        {
                            File.Delete(fileName);
                        }
                    }

                    foreach (String fileName in listFileDone)
                    {
                        if (File.Exists(fileName.Substring(0, fileName.Length - 2)))
                            File.Delete(fileName.Substring(0, fileName.Length - 2));
                        File.Move(fileName, fileName.Substring(0, fileName.Length - 2));
                    }

                    listFiles.Items.Clear();
                    progressBar1.Value = 0;
                    progressBar1.Visible = false;
                }
            }
        
        }

        private String directoryPath(String fileName)
        {
            return fileName.Substring(0,fileName.LastIndexOf("\\"));
        }

        private String rightName(String name)
        {
            String newName;
            if (checkBoxRemplacer.Checked)
            {
                if (extension(name) == ".f")
                {
                    newName = name.Substring(0, name.Length - 2)+".f95"+"##";
                    return newName;
                }
                if (extension(name) == ".F")
                {
                    newName = name.Substring(0, name.Length - 2) + ".F95" + "##";
                    return newName;
                }
            }
            return name+"##";
        }

        private String extension(String name)
        {
            return name.Substring(name.LastIndexOf('.'));
        }

        private List<String> decoupeLigne(String ligne)
        {
            List<String> listLignes = new List<String>();
            int indiceDecalage = 0;
            while (ligne.Substring(indiceDecalage, 1) == " ")
            {
                indiceDecalage++;
            }
            String decalage = "";
            for (int i = 0; i < indiceDecalage; i++)
            {
                decalage += " ";
            }
            while(ligne.Length > 132) {
                char[] tab = ligne.Substring(0,130).ToCharArray();
                int indice;
                for (indice = 129-indiceDecalage; indice > 0 && (tab[indice] == '.' || Char.IsLetterOrDigit(tab[indice])); indice--) { }
                listLignes.Add(ligne.Substring(0, indice)+" &");
                ligne = decalage+"& "+ligne.Substring(indice);
            }
            listLignes.Add(ligne);
            return listLignes;
        }

Conclusion :


Have fun !

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
157
Date d'inscription
dimanche 15 octobre 2006
Statut
Membre
Dernière intervention
27 août 2010
4
Comme je te comprends !!
Il y a plus pratique syntaxiquement comme langage !
Messages postés
2
Date d'inscription
lundi 28 décembre 2009
Statut
Membre
Dernière intervention
22 mars 2010

merci en mon university en utilise fortron 77
.............
............................. Oo..................
Messages postés
157
Date d'inscription
dimanche 15 octobre 2006
Statut
Membre
Dernière intervention
27 août 2010
4
Merci,
C'est vrai oui, je n'ai absolument pas penser à l'optimisation. Il me fallait rapidement un bout de code pour ne pas faire se travail à la main mais dès que j'aurais le temps, je le mettrais à jour.
Messages postés
473
Date d'inscription
mercredi 7 août 2002
Statut
Membre
Dernière intervention
10 juin 2015

Salut,
Petits points importants pour améliorer ton programme :
- Utiliser des string pour accumuler des chaînes de caractère est un processus lourd et coûteux en mémoire, il est nettement plus efficace, soit d'utiliser des StringBuilder, soit d'écrir directement sur le flux de sortie.
- Pour concatener deux noms de répertoire, utilise System.IO.Path.Combine
- Pour créer une chaîne de x caractères identiques, utilise new string(' ', x) plutôt qu'une boucle
Messages postés
157
Date d'inscription
dimanche 15 octobre 2006
Statut
Membre
Dernière intervention
27 août 2010
4
Je suis bien conscient que c'est une horreur au niveau parsage ! J'aurais pu utiliser les expressions régulières ou d'autres subtilités mais là n'était pas le but !

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.