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 |
|
|
}
|