1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
|
PARTIE CONCERNEE DU FICHIER SHELL.C
#ifndef _SHELL_ /* SYMBOLE = NOM DU PT H*/
#define _SHELL_
#ifdef __cplusplus
extern "C" {
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "mips.h"
#include "chargement_memoire.h"
#include "relocation.h"
#include "simulation.h"
#include "lecture_code.h"
#include "identification.h"
#include "fonctions_I.h"
#include "fonctions_J.h"
#include "fonctions_R.h"
#include "commandes_simulateur.h"
#include "commandes_shell.h"
#include "shell.h"
#include "utils.h"
/*ICI <defines>
<typedefs>
<prototypes>
*/
#ifdef __cplusplus
}
#endif
#endif
void shell(void)
{
struct MIPS mips;
char chaine_utilisateur_shell[256]="vide";
/*
char commande[256];
char op1[256];
char op2[256];
*/
int numero_commande=0;
int cpt=0;
char * commande_shell=NULL ;
char * op1_shell=NULL;
char * op2_shell=NULL;
/*
gets(chaine_utilisateur_shell);
if (NULL==gets(chaine_utilisateur_shell))
printf("\n ERROR avec le gets\n");
*/
do
{
printf ("\nsim_mips$ ");
gets(chaine_utilisateur_shell);
commande_shell =calloc(256,sizeof(*commande_shell));
op1_shell =calloc(256,sizeof(*op1_shell));
op2_shell =calloc(256,sizeof(*op2_shell));
printf("\n indicateur 6 : juste avant le gets \n ");
fct_decoupage(chaine_utilisateur_shell,commande_shell,op1_shell,op2_shell);
numero_commande=reconnaissance_commande(commande_shell);
switch(numero_commande)
{
case 1: /* load */
printf("\n chargement en cours ...");
chargement_memoire(&mips,op1_shell);
printf("\n chargement reussi");
break;
case 2:/* clear */
printf("\n initialisation des reg et de la mem en cours ...");
fct_clear(&mips);
printf("\n initialisation terminée");
break;
case 3:/* dasm */
printf("\n A faire quand la simulation marche car c'est la meme fonction que la simu sauf qu'on lieu d'executer on affiche simplement ...");
break;
case 4: /* dreg */
/*Affichage de tous les registres */
/*Le if permet aussi de resoudre le pb des valeurs 0 et -1 */
/* strtol transforme les caracteres en nombres*/
if (0==strtol(op1_shell, (char **)NULL, 10) && 0!= strcmp("-1",op1_shell) &&( 0!= strcmp("0",op1_shell )))
{
fct_dreg(mips,-1);
}
/* Affichage du registre préciser seulement */
else
{
if( 0 == strcmp("-1",op1_shell))
printf("registre inexistant");
else
fct_dreg(mips,strtol(op1_shell, (char **)NULL, 10));
}
break;
......
......
PARTIE CONCERNEE DU FICHIER COMMANDES_SHELL.C
/* Fonction qui lit et decoupe ce que l'utilisateur entre en commande
dans le shell avec la structure suivante :
<commande> <argument_1> <argument_2>
Si l'utilisateur n'entre qu'une commande sans arguments, les 2 arguments seront vides
*/
void fct_decoupage(char * chaine_utilisateur, char * commande, char * op1, char * op2){
/* pointeur temporaire contenant les adresses des chaines de caracteres découpées qui peuvent aussi contenir NULL s'il n'y a rien dans la chaine*/
/*Cependant un NULL dans strcpy engendre un SEG_FAULT donc on passe par des pointeurs intermédiaires */
char * temp_commande=NULL;
char * temp_op1=NULL;
char * temp_op2=NULL;
char * separateur = { " " };
printf("\n indicateur 3 : entrée dans la fct de decoupage \n");
strdup(strtok(chaine_utilisateur,separateur));
strcpy(commande,temp_commande);
printf("\n indicateur 4 : premier strcpy passé \n");
temp_op1 =strtok(NULL,separateur);
strcpy(op1,temp_op1);
temp_op1 =strtok(NULL,separateur);
strcpy(op1,temp_op1);
temp_op2 =strtok(NULL,separateur);
strcpy(op2,temp_op2);
/*
if ( pt_commande != NULL)
if ( pt_op1 != NULL)
strcpy(op1,pt_op1) ;
if ( pt_op2 != NULL)
strcpy(op2,pt_op2) ;
*/
} |
Partager