1: /*
2: ================================================================================
3: RPL/2 (R) version 4.0.14
4: Copyright (C) 1989-2010 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 'kill'
29: ================================================================================
30: Entrées :
31: --------------------------------------------------------------------------------
32: Sorties :
33: --------------------------------------------------------------------------------
34: Effets de bord : néant
35: ================================================================================
36: */
37:
38: void
39: instruction_kill(struct_processus *s_etat_processus)
40: {
41: (*s_etat_processus).erreur_execution = d_ex;
42:
43: if ((*s_etat_processus).affichage_arguments == 'Y')
44: {
45: printf("\n KILL ");
46:
47: if ((*s_etat_processus).langue == 'F')
48: {
49: printf("(abandon du processus en cours)\n\n");
50: printf(" Aucun argument\n");
51: }
52: else
53: {
54: printf("(current process abort)\n\n");
55: printf(" No argument\n");
56: }
57:
58: return;
59: }
60: else if ((*s_etat_processus).test_instruction == 'Y')
61: {
62: (*s_etat_processus).nombre_arguments = -1;
63: return;
64: }
65:
66: if (test_cfsf(s_etat_processus, 31) == d_vrai)
67: {
68: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
69: {
70: return;
71: }
72: }
73:
74: (*s_etat_processus).requete_arret = 'Y';
75:
76: if ((*s_etat_processus).traitement_instruction_halt == d_vrai)
77: {
78: (*s_etat_processus).execution_pas_suivant = d_vrai;
79: }
80:
81: return;
82: }
83:
84:
85: /*
86: ================================================================================
87: Fonction 'key'
88: ================================================================================
89: Entrées :
90: --------------------------------------------------------------------------------
91: Sorties :
92: --------------------------------------------------------------------------------
93: Effets de bord : néant
94: ================================================================================
95: */
96:
97: void
98: instruction_key(struct_processus *s_etat_processus)
99: {
100: int unite;
101:
102: struct_objet *s_objet_caractere;
103: struct_objet *s_objet_drapeau;
104:
105: struct termios tp;
106:
107: tcflag_t drapeaux;
108:
109: unsigned char caractere;
110:
111: (*s_etat_processus).erreur_execution = d_ex;
112:
113: if ((*s_etat_processus).affichage_arguments == 'Y')
114: {
115: printf("\n KEY ");
116:
117: if ((*s_etat_processus).langue == 'F')
118: {
119: printf("(saisit une entrée au vol)\n\n");
120: }
121: else
122: {
123: printf("(non blocking character input)\n\n");
124: }
125:
126: printf("-> 1: %s (0)\n\n", d_INT);
127:
128: printf("-> 2: %s\n", d_CHN);
129: printf(" 1: %s (-1)\n", d_INT);
130:
131: return;
132: }
133: else if ((*s_etat_processus).test_instruction == 'Y')
134: {
135: (*s_etat_processus).nombre_arguments = -1;
136: return;
137: }
138:
139: if (test_cfsf(s_etat_processus, 31) == d_vrai)
140: {
141: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
142: {
143: return;
144: }
145: }
146:
147: if (tcgetattr(0, &tp) == -1)
148: {
149: (*s_etat_processus).erreur_systeme = d_es_peripherique_stdin;
150: return;
151: }
152:
153: drapeaux = (ECHO | ECHOK | ICANON);
154: tp.c_lflag &= (~drapeaux);
155:
156: if (tcsetattr(0, TCSANOW, &tp) == -1)
157: {
158: (*s_etat_processus).erreur_systeme = d_es_peripherique_stdin;
159: return;
160: }
161:
162: if ((unite = open(ttyname(0), O_NONBLOCK|O_NOCTTY)) == -1)
163: {
164: tp.c_lflag |= drapeaux;
165:
166: if (tcsetattr(0, TCSANOW, &tp) == -1)
167: {
168: (*s_etat_processus).erreur_systeme = d_es_peripherique_stdin;
169: return;
170: }
171:
172: (*s_etat_processus).erreur_systeme = d_es_peripherique_stdin;
173: return;
174: }
175:
176: if ((s_objet_drapeau = allocation(s_etat_processus, INT)) == NULL)
177: {
178: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
179: return;
180: }
181:
182: if (read_atomic(s_etat_processus, unite, (void *) &caractere, 1) == -1)
183: {
184: (*((integer8 *) (*s_objet_drapeau).objet)) = 0;
185:
186: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
187: s_objet_drapeau) == d_erreur)
188: {
189: return;
190: }
191: }
192: else
193: {
194: if ((s_objet_caractere = allocation(s_etat_processus, CHN)) == NULL)
195: {
196: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
197: return;
198: }
199:
200: if (((*s_objet_caractere).objet = malloc(2 *
201: sizeof(unsigned char))) == NULL)
202: {
203: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
204: return;
205: }
206:
207: ((unsigned char *) (*s_objet_caractere).objet)[0] = caractere;
208: ((unsigned char *) (*s_objet_caractere).objet)[1] = d_code_fin_chaine;
209:
210: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
211: s_objet_caractere) == d_erreur)
212: {
213: return;
214: }
215:
216: (*((integer8 *) (*s_objet_drapeau).objet)) = -1;
217:
218: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
219: s_objet_drapeau) == d_erreur)
220: {
221: return;
222: }
223: }
224:
225: if (close(unite) == -1)
226: {
227: tp.c_lflag |= drapeaux;
228:
229: if (tcsetattr(0, TCSANOW, &tp) == -1)
230: {
231: (*s_etat_processus).erreur_systeme = d_es_peripherique_stdin;
232: return;
233: }
234:
235: (*s_etat_processus).erreur_systeme = d_es_peripherique_stdin;
236: return;
237: }
238:
239: tp.c_lflag |= drapeaux;
240:
241: if (tcsetattr(0, TCSANOW, &tp) == -1)
242: {
243: (*s_etat_processus).erreur_systeme = d_es_peripherique_stdin;
244: return;
245: }
246:
247: return;
248: }
249:
250:
251: /*
252: ================================================================================
253: Fonction 'kind'
254: ================================================================================
255: Entrées : structure processus
256: --------------------------------------------------------------------------------
257: Sorties :
258: --------------------------------------------------------------------------------
259: Effets de bord : néant
260: ================================================================================
261: */
262:
263: void
264: instruction_kind(struct_processus *s_etat_processus)
265: {
266: struct_objet *s_objet_argument;
267: struct_objet *s_objet_resultat;
268:
269: (*s_etat_processus).erreur_execution = d_ex;
270:
271: if ((*s_etat_processus).affichage_arguments == 'Y')
272: {
273: printf("\n KIND ");
274:
275: if ((*s_etat_processus).langue == 'F')
276: {
277: printf("(variété d'objet)\n\n");
278: }
279: else
280: {
281: printf("(kind of object)\n\n");
282: }
283:
284: printf(" 1: %s, %s, %s, %s, %s, %s,\n"
285: " %s, %s, %s\n",
286: d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX);
287: printf("-> 1: %s\n", d_INT);
288:
289: return;
290: }
291: else if ((*s_etat_processus).test_instruction == 'Y')
292: {
293: (*s_etat_processus).nombre_arguments = -1;
294: return;
295: }
296:
297: if (test_cfsf(s_etat_processus, 31) == d_vrai)
298: {
299: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
300: {
301: return;
302: }
303: }
304:
305: if (depilement(s_etat_processus, &((*s_etat_processus)
306: .l_base_pile), &s_objet_argument) == d_erreur)
307: {
308: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
309: return;
310: }
311:
312: if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
313: {
314: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
315: return;
316: }
317:
318: if (((*s_objet_argument).type == INT) ||
319: ((*s_objet_argument).type == VIN) ||
320: ((*s_objet_argument).type == MIN))
321: {
322: (*((integer8 *) (*s_objet_resultat).objet)) = 0;
323: }
324: else if (((*s_objet_argument).type == REL) ||
325: ((*s_objet_argument).type == VRL) ||
326: ((*s_objet_argument).type == MRL))
327: {
328: (*((integer8 *) (*s_objet_resultat).objet)) = 1;
329: }
330: else if (((*s_objet_argument).type == CPL) ||
331: ((*s_objet_argument).type == VCX) ||
332: ((*s_objet_argument).type == MCX))
333: {
334: (*((integer8 *) (*s_objet_resultat).objet)) = 2;
335: }
336: else
337: {
338: /*
339: * Les autres types de données sont des types non numériques.
340: */
341:
342: liberation(s_etat_processus, s_objet_argument);
343:
344: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
345: return;
346: }
347:
348: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
349: s_objet_resultat) == d_erreur)
350: {
351: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
352: return;
353: }
354:
355: liberation(s_etat_processus, s_objet_argument);
356:
357: return;
358: }
359:
360:
361: /*
362: ================================================================================
363: Fonction 'keytitle'
364: ================================================================================
365: Entrées :
366: --------------------------------------------------------------------------------
367: Sorties :
368: --------------------------------------------------------------------------------
369: Effets de bord : néant
370: ================================================================================
371: */
372:
373: void
374: instruction_keytitle(struct_processus *s_etat_processus)
375: {
376: struct_objet *s_objet;
377:
378: (*s_etat_processus).erreur_execution = d_ex;
379:
380: if ((*s_etat_processus).affichage_arguments == 'Y')
381: {
382: printf("\n KEYTITLE ");
383:
384: if ((*s_etat_processus).langue == 'F')
385: {
386: printf("(titre de la légende d'un graphique)\n\n");
387: }
388: else
389: {
390: printf("(title of graphic key)\n\n");
391: }
392:
393: printf(" 1: %s\n", d_CHN);
394:
395: return;
396: }
397: else if ((*s_etat_processus).test_instruction == 'Y')
398: {
399: (*s_etat_processus).nombre_arguments = -1;
400: return;
401: }
402:
403: if (test_cfsf(s_etat_processus, 31) == d_vrai)
404: {
405: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
406: {
407: return;
408: }
409: }
410:
411: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
412: &s_objet) == d_erreur)
413: {
414: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
415: return;
416: }
417:
418: if ((*s_objet).type == CHN)
419: {
420: free((*s_etat_processus).legende);
421:
422: if (((*s_etat_processus).legende = malloc((strlen((unsigned char *)
423: (*s_objet).objet) + 1) * sizeof(unsigned char))) == NULL)
424: {
425: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
426: return;
427: }
428:
429: strcpy((*s_etat_processus).legende, (unsigned char *) (*s_objet).objet);
430: liberation(s_etat_processus, s_objet);
431:
432: (*s_etat_processus).mise_a_jour_trace_requise = d_vrai;
433: }
434: else
435: {
436: liberation(s_etat_processus, s_objet);
437:
438: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
439: return;
440: }
441:
442: return;
443: }
444:
445:
446: /*
447: ================================================================================
448: Fonction 'keylabel'
449: ================================================================================
450: Entrées :
451: --------------------------------------------------------------------------------
452: Sorties :
453: --------------------------------------------------------------------------------
454: Effets de bord : néant
455: ================================================================================
456: */
457:
458: void
459: instruction_keylabel(struct_processus *s_etat_processus)
460: {
461: struct_fichier_graphique *l_element_courant;
462:
463: struct_objet *s_objet;
464:
465: (*s_etat_processus).erreur_execution = d_ex;
466:
467: if ((*s_etat_processus).affichage_arguments == 'Y')
468: {
469: printf("\n KEYLABEL ");
470:
471: if ((*s_etat_processus).langue == 'F')
472: {
473: printf("(label du graphique courant)\n\n");
474: }
475: else
476: {
477: printf("(current graphic label)\n\n");
478: }
479:
480: printf(" 1: %s\n", d_CHN);
481:
482: return;
483: }
484: else if ((*s_etat_processus).test_instruction == 'Y')
485: {
486: (*s_etat_processus).nombre_arguments = -1;
487: return;
488: }
489:
490: if (test_cfsf(s_etat_processus, 31) == d_vrai)
491: {
492: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
493: {
494: return;
495: }
496: }
497:
498: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
499: &s_objet) == d_erreur)
500: {
501: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
502: return;
503: }
504:
505: if ((*s_objet).type == CHN)
506: {
507: l_element_courant = (*s_etat_processus).fichiers_graphiques;
508:
509: if (l_element_courant == NULL)
510: {
511: liberation(s_etat_processus, s_objet);
512:
513: (*s_etat_processus).erreur_execution =
514: d_ex_absence_graphique_courant;
515: return;
516: }
517:
518: while((*l_element_courant).suivant != NULL)
519: {
520: l_element_courant = (*l_element_courant).suivant;
521: }
522:
523: if ((*l_element_courant).legende != NULL)
524: {
525: free((*l_element_courant).legende);
526: }
527:
528: if (((*l_element_courant).legende = malloc((strlen((unsigned char *)
529: (*s_objet).objet) + 1) * sizeof(unsigned char))) == NULL)
530: {
531: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
532: return;
533: }
534:
535: strcpy((*l_element_courant).legende, (unsigned char *)
536: (*s_objet).objet);
537: liberation(s_etat_processus, s_objet);
538:
539: (*s_etat_processus).mise_a_jour_trace_requise = d_vrai;
540: }
541: else
542: {
543: liberation(s_etat_processus, s_objet);
544:
545: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
546: return;
547: }
548:
549: return;
550: }
551:
552: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>