--- rpl/src/instructions_o1.c 2012/02/24 15:02:54 1.48 +++ rpl/src/instructions_o1.c 2012/02/29 12:07:47 1.49 @@ -1078,8 +1078,8 @@ instruction_open(struct_processus *s_eta printf(" { \"STREAM\" \"READWRITE\" } OPEN\n"); printf(" { \"FOREIGN\" \"DATAGRAM\" } OPEN\n"); printf(" { \"LOCAL\" { \"NAME\" \"socket.sock\" } } OPEN\n"); - printf(" { \"/dev/ttyS1\" { \"STTY\" { \"9600,8,N,1\" " - "\"NO ICANON\" \"IGNBRK\" } }\n"); + printf(" { { \"NAME\" \"/dev/ttyS1\" } { \"STTY\" { \"9600,8,N,1\" " + "\n { \"NO ICANON\" \"IGNBRK\" } } } OPEN\n"); return; } @@ -2272,7 +2272,7 @@ instruction_open(struct_processus *s_eta else if (strcmp(argument_majuscule, "STTY") == 0) { if ((*(*l_element_courant_sous_objet) - .donnee).type == LST) + .donnee).type == CHN) { if (type_arguments == ' ') { @@ -2289,8 +2289,7 @@ instruction_open(struct_processus *s_eta return; } - s_parametres_tty = - (*l_element_courant_sous_objet).donnee; + s_parametres_tty = (*l_element_courant).donnee; } } else @@ -2646,6 +2645,52 @@ instruction_open(struct_processus *s_eta free(argument_majuscule); } + else if (strcmp(argument_majuscule, "STTY") == 0) + { + if (type_arguments == ' ') + { + type_arguments = 'F'; + } + else if (type_arguments == 'S') + { + liberation(s_etat_processus, s_objet_argument); + free(argument_majuscule); + + (*s_etat_processus).erreur_execution = + d_ex_erreur_parametre_fichier; + return; + } + + free(argument_majuscule); + + l_element_courant_sous_objet = + (*l_element_courant_sous_objet).suivant; + + if ((*(*l_element_courant_sous_objet) + .donnee).type != CHN) + { + liberation(s_etat_processus, s_objet_argument); + + (*s_etat_processus).erreur_execution = + d_ex_erreur_parametre_fichier; + return; + } + + l_element_courant_sous_objet = + (*l_element_courant_sous_objet).suivant; + + if ((*(*l_element_courant_sous_objet) + .donnee).type != LST) + { + liberation(s_etat_processus, s_objet_argument); + + (*s_etat_processus).erreur_execution = + d_ex_erreur_parametre_fichier; + return; + } + + s_parametres_tty = (*l_element_courant).donnee; + } else { liberation(s_etat_processus, s_objet_argument); @@ -3537,7 +3582,11 @@ instruction_open(struct_processus *s_eta return; } - parametre_courant = (*s_parametres_tty).objet; + // Un test a déjà été fait pour vérifier que s_parametres_tty + // contient deux ou trois arguments. + + parametre_courant = ((*(struct_liste_chainee *) + (*s_parametres_tty).objet)).suivant; // Le premier paramètre concerne la vitesse du port. Il doit // toujours être présent. @@ -3600,10 +3649,10 @@ instruction_open(struct_processus *s_eta // Vitesse unsigned char *vitesses[] = - { "B0", "B50", "B75", "B110", "B134", "B150", - "B200", "B300", "B600", "B1200", "B1800", "B2400", - "B4800", "B9600", "B19200", "B38400", "B57600", - "B115200", "B230400", NULL }; + { "0", "50", "75", "110", "134", "150", + "200", "300", "600", "1200", "1800", "2400", + "4800", "9600", "19200", "38400", "57600", + "115200", "230400", NULL }; int vitesses_constantes[] = { B0, B50, B75, B110, B134, B150, B200, B300, B600, B1200, B1800, B2400, B4800, B9600, B19200, B38400, @@ -3757,6 +3806,8 @@ instruction_open(struct_processus *s_eta } } + position++; + if ((*position) != d_code_espace) { free(parametre_courant_majuscule); @@ -3809,6 +3860,8 @@ instruction_open(struct_processus *s_eta // S'il reste autre chose que des espaces, il y a un // problème de paramètres. + position++; + while((*position) != d_code_fin_chaine) { if ((*position) != d_code_espace) @@ -3830,6 +3883,11 @@ instruction_open(struct_processus *s_eta free(parametre_courant_majuscule); parametre_courant = (*parametre_courant).suivant; + if (parametre_courant != NULL) + { + parametre_courant = (*(*parametre_courant).donnee).objet; + } + while(parametre_courant != NULL) { if ((*(*parametre_courant).donnee).type != CHN) @@ -3876,15 +3934,12 @@ instruction_open(struct_processus *s_eta 4, ECHONL, 4, NOFLSH, 4, TOSTOP, 4, IEXTEN }; unsigned int fonction_courante; - if (isalnum((*position)) != 0) - { - // On vient de trouver quelque chose à interpréter. + // On vient de trouver quelque chose à interpréter. - if (strncmp(position, "NO ", 3) == 0) - { - position += 3; - negation = d_vrai; - } + if (strncmp(position, "NO ", 3) == 0) + { + position += 3; + negation = d_vrai; } for(fonction_courante = 0; @@ -3902,28 +3957,28 @@ instruction_open(struct_processus *s_eta case 1: { tc.c_iflag &= ~fonctions_constantes - [(fonction_courante * 2) - 1]; + [(fonction_courante * 2) + 1]; break; } case 2: { tc.c_oflag &= ~fonctions_constantes - [(fonction_courante * 2) - 1]; + [(fonction_courante * 2) + 1]; break; } case 3: { tc.c_cflag &= ~fonctions_constantes - [(fonction_courante * 2) - 1]; + [(fonction_courante * 2) + 1]; break; } case 4: { tc.c_lflag &= ~fonctions_constantes - [(fonction_courante * 2) - 1]; + [(fonction_courante * 2) + 1]; break; } } @@ -3936,28 +3991,28 @@ instruction_open(struct_processus *s_eta case 1: { tc.c_iflag |= fonctions_constantes - [(fonction_courante * 2) - 1]; + [(fonction_courante * 2) + 1]; break; } case 2: { tc.c_oflag |= fonctions_constantes - [(fonction_courante * 2) - 1]; + [(fonction_courante * 2) + 1]; break; } case 3: { tc.c_cflag |= fonctions_constantes - [(fonction_courante * 2) - 1]; + [(fonction_courante * 2) + 1]; break; } case 4: { tc.c_lflag |= fonctions_constantes - [(fonction_courante * 2) - 1]; + [(fonction_courante * 2) + 1]; break; } }