#include <stdio.h>
#include <stdbool.h>
#include <string.h>
//BEGIN CUT
#include <ctype.h>
#include <stdlib.h>
//END CUT

// TP 1 de IN330 -- exercices préparatoires
// LG et SM pour IN330, 2024
// BEGIN CUT
// 1. Registres xN, registres jolis noms (c.f. register_names), immédiats.
// 2. Il suffit de regarder le premier caractère :
//    x         --> registres xN
//    0..9 + -  --> immédiat
//    reste     --> registre joli nom
// 4. arg+1 est un char * (ou const char *), il pointe vers les caractères qui
//    suivent le 'x' (dans l'exemple '2', '8', '\0'). C'est une chaîne valide.
//    D'où atoi(arg+1) pour parser ces arguments-là.
// 5. Tableau (c.f. register_names) + boucle incitée. switch bof. 32 if nope.
// END CUT

//BEGIN CUT
const char *register_names[32] = {
    "zero", "ra", "sp",  "gp",  "tp", "t0", "t1", "t2",
    "s0",   "s1", "a0",  "a1",  "a2", "a3", "a4", "a5",
    "a6",   "a7", "s2",  "s3",  "s4", "s5", "s6", "s7",
    "s8",   "s9", "s10", "s11", "t3", "t4", "t5", "t6",
};
//END CUT

int parse_arg(const char *arg){
  //TODO : remplir
  //BEGIN CUT
  if (isdigit(arg[0])||arg[0]=='-'|| arg[0]=='+')
    return atoi(arg);
  else
    if (arg[0]=='x')
      return atoi(arg+1);
  // maintenant on cherche l'index dans le tableau register_names
    else
      for (int i=0; i<32; i++){
        if (strcmp(arg,register_names[i])==0) return i; // chaînes égales : 0
      }
  //END CUT
  return -1;
}

int main(void)
{
  // TODO : declarer un tableau d'exemples "representatifs"
  // AIDE : s'inspirer de l'exo précédent.

  //BEGIN CUT
  const char *exargs[6] = {
    "x1","x12","a0","zero","10","-32"
  };
  //END CUT

  //TODO : tester votre fonction parse_arg

  //BEGIN CUT
  for (int i=0; i<6; i++){
    printf("représentation entière de '%s': %d\n",
           exargs[i], parse_arg(exargs[i]));
  }
  
  //END CUT
  return 0;
}
