OpenCores
URL https://opencores.org/ocsvn/minimips/minimips/trunk

Subversion Repositories minimips

[/] [minimips/] [trunk/] [gasm/] [main.c] - Blame information for rev 15

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 poppy
/**********************************************************************************/
2
/*                                                                                */
3
/*    Copyright (c) 2003, Hangouet Samuel, Mouton Louis-Marie all rights reserved */
4
/*                                                                                */
5
/*    This file is part of gasm.                                                  */
6
/*                                                                                */
7
/*    gasm is free software; you can redistribute it and/or modify                */
8
/*    it under the terms of the GNU General Public License as published by        */
9
/*    the Free Software Foundation; either version 2 of the License, or           */
10
/*    (at your option) any later version.                                         */
11
/*                                                                                */
12
/*    gasm is distributed in the hope that it will be useful,                     */
13
/*    but WITHOUT ANY WARRANTY; without even the implied warranty of              */
14
/*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               */
15
/*    GNU General Public License for more details.                                */
16
/*                                                                                */
17
/*    You should have received a copy of the GNU General Public License           */
18
/*    along with gasm; if not, write to the Free Software                         */
19
/*    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA   */
20
/*                                                                                */
21
/**********************************************************************************/
22
 
23
 
24
/* If you encountered any problem, please contact :                               */
25
/*                                                                                */
26
/*   lmouton@enserg.fr                                                            */
27
/*   shangoue@enserg.fr                                                           */
28
/*                                                                                */
29
 
30
#include <debogueur.h>
31
#include <dialogue.h>
32
#include <formateur.h>
33
#include <parametres.h>
34
#include <preprocesseur.h>
35
#include <adaptateur.h>
36
#include <preparateur.h>
37
#include <analyseur.h>
38
#include <synthetiseur.h>
39
 
40
#include <stdio.h>
41
#include <string.h>
42
 
43
static char     nom_source[MAX_LONG_ALPHA+1]="";
44
static char     nom_syntaxe[MAX_LONG_ALPHA+1]="Syntaxe";
45
static char     nom_macro[MAX_LONG_ALPHA+1]="";
46
static char     nom_liste[MAX_LONG_ALPHA+1]="a.lst";
47
static char     nom_obj[MAX_LONG_ALPHA+1]="a.bin";
48
 
49
int gere_args(int argc, char * argv[])
50
{
51
        int i;
52
        char * cur_arg;
53
        nom_source[MAX_LONG_ALPHA]=nom_syntaxe[MAX_LONG_ALPHA]=nom_macro[MAX_LONG_ALPHA]='\0';
54
        for(i=1; i<argc; i++)
55
        {
56
                cur_arg=argv[i];
57
                if (*cur_arg=='-')
58
                {
59
                        while(*(++cur_arg)!='\0') switch (*cur_arg)
60
                        {
61
                                case 'v': /* Active le mode verbeux.                         */
62
                                        verbose=1;
63
                                        break;
64
                                case 'n': /* Désactive la liste d'assemblage.                */
65
                                        active_list=0;
66
                                        break;
67
                                case 's': /* Nom du fichier syntaxe (par défaut 'Syntaxe').  */
68
                                        if (cur_arg[1]!='\0' || i+1>=argc)
69
                                        {
70
                                                DIALOGUE(cur_arg, 0, W_ARG_INC);
71
                                                break;
72
                                        }
73
                                        strncpy(nom_syntaxe,argv[i+1],MAX_LONG_ALPHA);
74
                                        i++;
75
                                        break;
76
                                case 'm': /* Nom du fichier macro par défaut.                */
77
                                        if (cur_arg[1]!='\0' || i+1>=argc)
78
                                        {
79
                                                DIALOGUE(cur_arg, 0, W_ARG_INC);
80
                                                break;
81
                                        }
82
                                        strncpy(nom_macro,argv[i+1],MAX_LONG_ALPHA);
83
                                        i++;
84
                                        break;
85
                                case 'l': /* Nom du fichier liste d'assemblage.              */
86
                                        if (cur_arg[1]!='\0' || i+1>=argc)
87
                                        {
88
                                                DIALOGUE(cur_arg, 0, W_ARG_INC);
89
                                                break;
90
                                        }
91
                                        strncpy(nom_liste,argv[i+1],MAX_LONG_ALPHA);
92
                                        i++;
93
                                        break;
94
                                case 'o': /* Nom du fichier objet.                           */
95
                                        if (cur_arg[1]!='\0' || i+1>=argc)
96
                                        {
97
                                                DIALOGUE(cur_arg, 0, W_ARG_INC);
98
                                                break;
99
                                        }
100
                                        strncpy(nom_obj,argv[i+1],MAX_LONG_ALPHA);
101
                                        i++;
102
                                        break;
103
                                case '?':
104
                                case 'h': /* Aide en ligne.                                  */
105
                                        display_help();
106
                                        return 0;
107
                                        break;
108
                                case 'p': /* Utilise la sortie standard                      */
109
                                        nom_obj[0]='\0';
110
                                        break;
111
                                default:
112
                                        DIALOGUE(cur_arg, 0, W_ARG_INC);
113
                                        break;
114
                        }
115
                }
116
                else
117
                {
118
                        if (*nom_source!='\0') DIALOGUE(cur_arg, 0, W_ARG_INC)
119
                        else strncpy(nom_source,cur_arg,MAX_LONG_ALPHA);
120
                }
121
        }
122
        return 1;
123
}
124
 
125
int main(int argc, char * argv[])
126
{
127
        FILE * f_lst=NULL, * f_obj=NULL, * f_srceff=NULL;
128
        int err1, err2;
129
        int dst_std=0;
130
        type_lexeme * ptr_lex;
131
 
132
        if (!gere_args(argc, argv)) return 0; /* Détection du paramètre d'aide.              */
133
 
134
        /* Initialisation de la syntaxe de l'assembleur.                                     */
135
        DIALOGUE(NULL, 0, B_INIT_SYNTAX);
136
        init_arbre(nom_syntaxe);
137
 
138
        /* Initialisation des macros génériques (pseudo-instructions).                       */
139
        DIALOGUE(NULL, 0, B_INIT_MACRO);
140
        /* Si le nom du fichier de macros n'est pas spécifié en paramètre, on récupère le    */
141
        /* nom par défaut défini dans le fichier syntaxe.                                    */
142
        if (nom_macro[0]=='\0' && fich_macro_def)
143
                strcpy(nom_macro, fich_macro_def); /* nom_macro est assez long !             */
144
        if (nom_macro[0]!='\0')
145
        {
146
                if (init_preprocesseur(nom_macro)) DIALOGUE(NULL, 0, W_FICH_DEF_MACRO);
147
        }
148
        else DIALOGUE(NULL, 0, W_MACRO_MANQ);
149
        /* Vidange du fichier de définition des macros par défaut avant de poursuivre        */
150
        while ((ptr_lex=pop_lexeme())!=NULL) FREE_LEX(ptr_lex);
151
 
152
        /* Initialisation du préprocesseur avec le fichier asm donné en paramètre            */
153
        if (init_preprocesseur(nom_source)) DIALOGUE(nom_source, 0, F_ERR_OUV);
154
 
155
        /* Exécution de l'analyse.                                                           */
156
        DIALOGUE(NULL, 0, B_ANA);
157
        err1=analyse();
158
        if (verbose) liste_table_macro(stderr);
159
        clear_preprocesseur(); /* Nettoyage du préprocesseur.                                */
160
 
161
        /* Exécution de la synthèse.                                                         */
162
        DIALOGUE(NULL, 0, B_SYN);
163
        err2=synthese();
164
 
165
        /* Ouverture du flux de sortie.                                                      */
166
        if (nom_obj[0]!='\0')
167
        {
168
                f_obj=fopen(nom_obj, "wb");
169
                if (f_obj==NULL) DIALOGUE(nom_obj, 0, F_ERR_OUV);
170
        }
171
        else
172
        { /* Ecriture dans le stdout.                                                        */
173
                f_obj=stdout;
174
                strcpy(nom_obj, "stdout");
175
                dst_std=1;
176
        }
177
 
178
        /* Ecriture du fichier objet.                                                        */
179
        DIALOGUE(NULL, 0, B_STR_OBJ);
180
        write_objet(f_obj);
181
 
182
        if (!dst_std) fclose(f_obj); /* Fermeture du flux objet.                             */
183
 
184
        if (active_list)
185
        { /* Création de la liste d'assemblage.                                              */
186
                /* Ouverture du flux source effectif et du flux de la liste si besoin est.   */
187
                f_srceff=fopen(nom_source, "rb");
188
                if (f_srceff==NULL) DIALOGUE(nom_source, 0, F_ERR_OUV);
189
                f_lst=fopen(nom_liste, "wb");
190
                if (f_lst==NULL) DIALOGUE(nom_liste, 0, F_ERR_OUV);
191
                DIALOGUE(NULL, 0, B_STR_LST); /* Ecriture de la lsite d'assemblage.            */
192
                write_liste(f_lst, f_srceff);
193
                /* Fermeture des différents flux ouverts.                                    */
194
                fclose(f_srceff);
195
                fclose(f_lst);
196
        }
197
 
198
        if (verbose)
199
        { /* Affichage du nombre d'erreurs détectées aux cours des deux passes.              */
200
                char str_nbr[MAX_LONG_ALPHA];
201
                DIALOGUE(NULL, 0, B_ERR_REP);
202
                sprintf(str_nbr, "%d", err1);
203
                DIALOGUE(str_nbr, 0, B_NBR_ERR_ANA);
204
                sprintf(str_nbr, "%d", err2);
205
                DIALOGUE(str_nbr, 0, B_NBR_ERR_SYN);
206
        }
207
 
208
        /* Libération de l'espace réservé lors de l'initialisation des différents modules.   */
209
        clear_preparateur();
210
        clear_adaptateur();
211
        clear_analyseur();
212
 
213
 
214
#ifdef DEBUG
215
        /* Affichage des informations de debuging :                                          */
216
        print_mem(stderr);
217
#endif
218
 
219
        return 0;
220
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.