Conversion de fichiers fortran 77 en fortran 95

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

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.