Annotation of rpl/src/instructions_r7.c, revision 1.2
1.1 bertrand 1: /*
2: ================================================================================
3: RPL/2 (R) version 4.1.5
4: Copyright (C) 1989-2011 Dr. BERTRAND Joël
5:
6: This file is part of RPL/2.
7:
8: RPL/2 is free software; you can redistribute it and/or modify it
9: under the terms of the CeCILL V2 License as published by the french
10: CEA, CNRS and INRIA.
11:
12: RPL/2 is distributed in the hope that it will be useful, but WITHOUT
13: ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14: FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL V2 License
15: for more details.
16:
17: You should have received a copy of the CeCILL License
18: along with RPL/2. If not, write to info@cecill.info.
19: ================================================================================
20: */
21:
22:
23: #include "rpl-conv.h"
24:
25:
26: /*
27: ================================================================================
28: Fonction 'restart'
29: ================================================================================
30: Entrées : pointeur sur une structure struct_processus
31: --------------------------------------------------------------------------------
32: Sorties :
33: --------------------------------------------------------------------------------
34: Effets de bord : néant
35: ================================================================================
36: */
37:
38: void
39: instruction_restart(struct_processus *s_etat_processus)
40: {
41: struct timespec attente;
42:
43: (*s_etat_processus).erreur_execution = d_ex;
44:
45: if ((*s_etat_processus).affichage_arguments == 'Y')
46: {
47: printf("\n RESTART ");
48:
49: if ((*s_etat_processus).langue == 'F')
50: {
51: printf("(réinitialisation du programme)\n\n");
52: printf(" Aucun argument\n");
53: }
54: else
55: {
56: printf("(program reinitialization)\n\n");
57: printf(" No argument\n");
58: }
59:
60: return;
61: }
62: else if ((*s_etat_processus).test_instruction == 'Y')
63: {
64: (*s_etat_processus).nombre_arguments = -1;
65: return;
66: }
67:
68: if (test_cfsf(s_etat_processus, 31) == d_vrai)
69: {
70: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
71: {
72: return;
73: }
74: }
75:
76: envoi_signal_processus((*s_etat_processus).pid_processus_pere,
77: rpl_sigabort);
78: (*s_etat_processus).requete_arret = 'Y';
79:
80: attente.tv_sec = 0;
81: attente.tv_nsec = GRANULARITE_us * 1000;
82:
83: while((*s_etat_processus).var_volatile_requete_arret == 0)
84: {
85: scrutation_interruptions(s_etat_processus);
86: nanosleep(&attente, NULL);
87: INCR_GRANULARITE(attente.tv_nsec);
88: }
89:
90: if ((*s_etat_processus).traitement_instruction_halt == d_vrai)
91: {
92: (*s_etat_processus).execution_pas_suivant = d_vrai;
93: }
94:
95: (*s_etat_processus).requete_redemarrage = d_vrai;
96: return;
97: }
98:
1.2 ! bertrand 99:
! 100: /*
! 101: ================================================================================
! 102: Fonction 'regex'
! 103: ================================================================================
! 104: Entrées : pointeur sur une structure struct_processus
! 105: --------------------------------------------------------------------------------
! 106: Sorties :
! 107: --------------------------------------------------------------------------------
! 108: Effets de bord : néant
! 109: ================================================================================
! 110: */
! 111:
! 112: void
! 113: instruction_regex(struct_processus *s_etat_processus)
! 114: {
! 115: regex_t expression;
! 116:
! 117: struct_liste_chainee *l_element_courant_ecriture;
! 118: struct_liste_chainee *l_element_courant_lecture;
! 119:
! 120: struct_objet *s_objet_argument_1;
! 121: struct_objet *s_objet_argument_2;
! 122: struct_objet *s_objet_resultat;
! 123:
! 124: (*s_etat_processus).erreur_execution = d_ex;
! 125:
! 126: if ((*s_etat_processus).affichage_arguments == 'Y')
! 127: {
! 128: printf("\n REGEX ");
! 129:
! 130: if ((*s_etat_processus).langue == 'F')
! 131: {
! 132: printf("(expression régulière)\n\n");
! 133: }
! 134: else
! 135: {
! 136: printf("(regular expression)\n\n");
! 137: }
! 138:
! 139: printf(" 1: %s, %s\n", d_LST);
! 140: printf("-> 1: %s\n\n", d_LST);
! 141:
! 142: printf(" 1: %s\n", d_CHN);
! 143: printf("-> 1: %s (0 or -1)\n", d_INT);
! 144:
! 145: return;
! 146: }
! 147: else if ((*s_etat_processus).test_instruction == 'Y')
! 148: {
! 149: (*s_etat_processus).nombre_arguments = 2;
! 150: return;
! 151: }
! 152:
! 153: if (test_cfsf(s_etat_processus, 31) == d_vrai)
! 154: {
! 155: if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
! 156: {
! 157: return;
! 158: }
! 159: }
! 160:
! 161: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 162: &s_objet_argument_1) == d_erreur)
! 163: {
! 164: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 165: return;
! 166: }
! 167:
! 168: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 169: &s_objet_argument_2) == d_erreur)
! 170: {
! 171: liberation(s_etat_processus, s_objet_argument_1);
! 172:
! 173: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 174: return;
! 175: }
! 176:
! 177: if (((*s_objet_argument_1).type == CHN) &&
! 178: ((*s_objet_argument_2).type == CHN))
! 179: {
! 180: // Renvoie 0 ou -1
! 181:
! 182: if (regcomp(&expression, (const char *) (*s_objet_argument_1).objet,
! 183: REG_EXTENDED | REG_NOSUB) != 0)
! 184: {
! 185: liberation(s_etat_processus, s_objet_argument_1);
! 186: liberation(s_etat_processus, s_objet_argument_2);
! 187:
! 188: (*s_etat_processus).erreur_execution = d_ex_expression_reguliere;
! 189: return;
! 190: }
! 191:
! 192: if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
! 193: {
! 194: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 195: return;
! 196: }
! 197:
! 198: if (regexec(&expression, (const char *) (*s_objet_argument_1).objet,
! 199: 0, NULL, 0) == 0)
! 200: {
! 201: (*((integer8 *) (*s_objet_resultat).objet)) = -1;
! 202: }
! 203: else // REG_NOMATCH
! 204: {
! 205: (*((integer8 *) (*s_objet_resultat).objet)) = 0;
! 206: }
! 207:
! 208: regfree(&expression);
! 209: }
! 210: else if (((*s_objet_argument_1).type == CHN) &&
! 211: ((*s_objet_argument_2).type == LST))
! 212: {
! 213: // Renvoie une liste de chaînes qui correspondent
! 214:
! 215: if (regcomp(&expression, (const char *) (*s_objet_argument_1).objet,
! 216: REG_EXTENDED | REG_NOSUB) != 0)
! 217: {
! 218: liberation(s_etat_processus, s_objet_argument_1);
! 219: liberation(s_etat_processus, s_objet_argument_2);
! 220:
! 221: (*s_etat_processus).erreur_execution = d_ex_expression_reguliere;
! 222: return;
! 223: }
! 224:
! 225: if ((s_objet_resultat = allocation(s_etat_processus, LST)) == NULL)
! 226: {
! 227: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 228: return;
! 229: }
! 230:
! 231: l_element_courant_lecture = (*s_objet_argument_2).objet;
! 232: l_element_courant_ecriture = NULL;
! 233:
! 234: while(l_element_courant_lecture != NULL)
! 235: {
! 236: if ((*(*l_element_courant_lecture).donnee).type != CHN)
! 237: {
! 238: liberation(s_etat_processus, s_objet_argument_1);
! 239: liberation(s_etat_processus, s_objet_argument_2);
! 240: liberation(s_etat_processus, s_objet_resultat);
! 241:
! 242: (*s_etat_processus).erreur_execution =
! 243: d_ex_erreur_type_argument;
! 244: return;
! 245: }
! 246:
! 247: if (regexec(&expression, (const char *)
! 248: (*(*l_element_courant_lecture).donnee).objet,
! 249: 0, NULL, 0) == 0)
! 250: {
! 251: if (l_element_courant_ecriture == NULL)
! 252: {
! 253: if (((*s_objet_resultat).objet =
! 254: allocation_maillon(s_etat_processus)) == NULL)
! 255: {
! 256: (*s_etat_processus).erreur_systeme =
! 257: d_es_allocation_memoire;
! 258: return;
! 259: }
! 260:
! 261: l_element_courant_ecriture = (*s_objet_resultat).objet;
! 262:
! 263: if (((*l_element_courant_ecriture).donnee =
! 264: copie_objet(s_etat_processus,
! 265: (*l_element_courant_lecture).donnee, 'P'))
! 266: == NULL)
! 267: {
! 268: (*s_etat_processus).erreur_systeme =
! 269: d_es_allocation_memoire;
! 270: return;
! 271: }
! 272:
! 273: (*l_element_courant_ecriture).suivant = NULL;
! 274: }
! 275: else
! 276: {
! 277: if (((*l_element_courant_ecriture).suivant =
! 278: allocation_maillon(s_etat_processus)) == NULL)
! 279: {
! 280: (*s_etat_processus).erreur_systeme =
! 281: d_es_allocation_memoire;
! 282: return;
! 283: }
! 284:
! 285: l_element_courant_ecriture =
! 286: (*l_element_courant_ecriture).suivant;
! 287:
! 288: if (((*l_element_courant_ecriture).donnee =
! 289: copie_objet(s_etat_processus,
! 290: (*l_element_courant_lecture).donnee, 'P'))
! 291: == NULL)
! 292: {
! 293: (*s_etat_processus).erreur_systeme =
! 294: d_es_allocation_memoire;
! 295: return;
! 296: }
! 297:
! 298: (*l_element_courant_ecriture).suivant = NULL;
! 299: }
! 300: }
! 301:
! 302: l_element_courant_lecture = (*l_element_courant_lecture).suivant;
! 303: }
! 304:
! 305: regfree(&expression);
! 306: }
! 307: else
! 308: {
! 309: liberation(s_etat_processus, s_objet_argument_1);
! 310: liberation(s_etat_processus, s_objet_argument_2);
! 311:
! 312: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
! 313: return;
! 314: }
! 315:
! 316: liberation(s_etat_processus, s_objet_argument_1);
! 317: liberation(s_etat_processus, s_objet_argument_2);
! 318:
! 319: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 320: s_objet_resultat) == d_erreur)
! 321: {
! 322: return;
! 323: }
! 324:
! 325: return;
! 326: }
! 327:
1.1 bertrand 328: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>