Annotation of rpl/src/instructions_s10.c, revision 1.17
1.1 bertrand 1: /*
2: ================================================================================
1.16 bertrand 3: RPL/2 (R) version 4.0.17
1.1 bertrand 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 'spawn'
29: ================================================================================
30: Entrées :
31: --------------------------------------------------------------------------------
32: Sorties :
33: --------------------------------------------------------------------------------
34: Effets de bord : néant
35: ================================================================================
36: */
37:
38: void
39: instruction_spawn(struct_processus *s_etat_processus)
40: {
41: logical1 drapeau;
42: logical1 variable_partagee;
43:
44: pthread_attr_t attributs;
45:
46: pthread_mutexattr_t attributs_mutex;
47:
48: pthread_t thread_id;
49: pthread_t thread_surveillance;
50:
51: sigset_t oldset;
52: sigset_t set;
53:
54: struct_descripteur_thread *s_argument_thread;
55:
56: struct_liste_chainee *l_element_courant;
57:
58: struct_objet *s_copie;
59: struct_objet *s_objet;
60: struct_objet *s_objet_resultat;
61: struct_objet *s_objet_systeme;
62:
63: struct_processus *s_nouvel_etat_processus;
64:
65: struct timespec attente;
66:
67: (*s_etat_processus).erreur_execution = d_ex;
68:
69: if ((*s_etat_processus).affichage_arguments == 'Y')
70: {
71: printf("\n SPAWN ");
72:
73: if ((*s_etat_processus).langue == 'F')
74: {
75: printf("(lancement d'un thread)\n\n");
76: }
77: else
78: {
79: printf("(create thread)\n\n");
80: }
81:
82: printf(" 1: %s, %s\n", d_NOM, d_RPN);
83: printf("-> 1: %s\n", d_PRC);
84:
85: return;
86: }
87: else if ((*s_etat_processus).test_instruction == 'Y')
88: {
89: (*s_etat_processus).nombre_arguments = -1;
90: return;
91: }
92:
93: if (test_cfsf(s_etat_processus, 31) == d_vrai)
94: {
95: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
96: {
97: return;
98: }
99: }
100:
101: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
102: &s_objet) == d_erreur)
103: {
104: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
105: return;
106: }
107:
108: /*
109: * Une routine fille doit pouvoir renvoyer des objets au processus
110: * père au travers de la fonction SEND. Il ne peut donc s'agir que
111: * d'une fonction ou d'une expression RPN.
112: */
113:
1.8 bertrand 114: if (((*s_objet).type != NOM) && ((*s_objet).type != RPN))
1.1 bertrand 115: {
116: liberation(s_etat_processus, s_objet);
117:
118: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
119: return;
120: }
121:
122: /*
123: * Si l'argument est de type NOM, il faut que la variable correspondante
124: * soit une variable de type RPN.
125: */
126:
127: variable_partagee = d_faux;
128: s_copie = NULL;
129:
130: if ((*s_objet).type == NOM)
131: {
132: if (recherche_variable(s_etat_processus, (*((struct_nom *)
133: (*s_objet).objet)).nom) == d_vrai)
134: {
135: if ((*s_etat_processus).s_liste_variables
136: [(*s_etat_processus).position_variable_courante].objet
137: == NULL)
138: {
139: if (pthread_mutex_lock(&((*(*s_etat_processus)
140: .s_liste_variables_partagees).mutex)) != 0)
141: {
142: (*s_etat_processus).erreur_systeme = d_es_processus;
143: return;
144: }
145:
146: if (recherche_variable_partagee(s_etat_processus,
147: (*s_etat_processus).s_liste_variables
148: [(*s_etat_processus).position_variable_courante].nom,
149: (*s_etat_processus).s_liste_variables
150: [(*s_etat_processus).position_variable_courante]
151: .variable_partagee, (*s_etat_processus)
152: .s_liste_variables[(*s_etat_processus)
153: .position_variable_courante].origine) == d_faux)
154: {
155: if (pthread_mutex_unlock(&((*(*s_etat_processus)
156: .s_liste_variables_partagees).mutex)) != 0)
157: {
158: (*s_etat_processus).erreur_systeme = d_es_processus;
159: return;
160: }
161:
162: liberation(s_etat_processus, s_objet);
163:
164: (*s_etat_processus).erreur_systeme = d_es;
165: (*s_etat_processus).erreur_execution =
166: d_ex_argument_invalide;
167: return;
168: }
169:
170: if (((*(*(*s_etat_processus).s_liste_variables_partagees)
171: .table[(*(*s_etat_processus)
172: .s_liste_variables_partagees).position_variable].objet)
173: .type != RPN) && ((*(*(*s_etat_processus)
174: .s_liste_variables_partagees).table
175: [(*(*s_etat_processus).s_liste_variables_partagees)
176: .position_variable].objet).type != ADR))
177: {
178: if (pthread_mutex_unlock(&((*(*s_etat_processus)
179: .s_liste_variables_partagees).mutex)) != 0)
180: {
181: (*s_etat_processus).erreur_systeme = d_es_processus;
182: return;
183: }
184:
185: liberation(s_etat_processus, s_objet);
186:
187: (*s_etat_processus).erreur_execution =
188: d_ex_argument_invalide;
189: return;
190: }
191:
192: if ((s_copie = copie_objet(s_etat_processus,
193: (*(*s_etat_processus)
194: .s_liste_variables_partagees).table
195: [(*(*s_etat_processus).s_liste_variables_partagees)
196: .position_variable].objet, 'P')) == NULL)
197: {
198: if (pthread_mutex_unlock(&((*(*s_etat_processus)
199: .s_liste_variables_partagees).mutex)) != 0)
200: {
201: (*s_etat_processus).erreur_systeme = d_es_processus;
202: return;
203: }
204:
205: (*s_etat_processus).erreur_systeme =
206: d_es_allocation_memoire;
207:
208: return;
209: }
210:
211: variable_partagee = d_vrai;
212:
213: if (pthread_mutex_unlock(&((*(*s_etat_processus)
214: .s_liste_variables_partagees).mutex)) != 0)
215: {
216: (*s_etat_processus).erreur_systeme = d_es_processus;
217: return;
218: }
219: }
220: else
221: {
222: if (((*(*s_etat_processus).s_liste_variables
223: [(*s_etat_processus).position_variable_courante].objet)
224: .type != RPN) && ((*(*s_etat_processus)
225: .s_liste_variables[(*s_etat_processus)
226: .position_variable_courante].objet).type != ADR))
227: {
228: liberation(s_etat_processus, s_objet);
229:
230: (*s_etat_processus).erreur_execution =
231: d_ex_argument_invalide;
232: return;
233: }
234: }
235: }
236: else // Variable inexistante
237: {
238: liberation(s_etat_processus, s_objet);
239:
240: (*s_etat_processus).erreur_systeme = d_es;
241: (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
242: return;
243: }
244: }
245:
246: if (sigemptyset(&set) != 0)
247: {
248: (*s_etat_processus).erreur_systeme = d_es_processus;
249: return;
250: }
251:
252: if (sigaddset(&set, SIGSTART) != 0)
253: {
254: (*s_etat_processus).erreur_systeme = d_es_processus;
255: return;
256: }
257:
258: /*
259: * Le signal SIGFSTOP doit être traité !
260: */
261:
262: if (sigaddset(&set, SIGFSTOP) != 0)
263: {
264: (*s_etat_processus).erreur_systeme = d_es_processus;
265: return;
266: }
267:
1.10 bertrand 268: if (sigaddset(&set, SIGFABORT) != 0)
269: {
270: (*s_etat_processus).erreur_systeme = d_es_processus;
271: return;
272: }
273:
1.1 bertrand 274: if (sigaddset(&set, SIGURG) != 0)
275: {
276: (*s_etat_processus).erreur_systeme = d_es_processus;
277: return;
278: }
279:
280: if (pthread_sigmask(SIG_BLOCK, &set, &oldset) != 0)
281: {
282: (*s_etat_processus).erreur_systeme = d_es_processus;
283: return;
284: }
285:
286: if ((s_argument_thread = malloc(sizeof(struct_descripteur_thread))) == NULL)
287: {
288: (*s_etat_processus).erreur_systeme = d_es_processus;
289: return;
290: }
291:
292: if (pipe((*s_argument_thread).pipe_erreurs) != 0)
293: {
294: (*s_etat_processus).erreur_systeme = d_es_processus;
295: return;
296: }
297:
298: if (pipe((*s_argument_thread).pipe_interruptions) != 0)
299: {
300: (*s_etat_processus).erreur_systeme = d_es_processus;
301: return;
302: }
303:
304: if (pipe((*s_argument_thread).pipe_nombre_interruptions_attente) != 0)
305: {
306: (*s_etat_processus).erreur_systeme = d_es_processus;
307: return;
308: }
309:
310: if (pipe((*s_argument_thread).pipe_objets) != 0)
311: {
312: (*s_etat_processus).erreur_systeme = d_es_processus;
313: return;
314: }
315:
316: if (pipe((*s_argument_thread).pipe_acquittement) != 0)
317: {
318: (*s_etat_processus).erreur_systeme = d_es_processus;
319: return;
320: }
321:
322: if (pipe((*s_argument_thread).pipe_nombre_objets_attente) != 0)
323: {
324: (*s_etat_processus).erreur_systeme = d_es_processus;
325: return;
326: }
327:
328: if (pipe((*s_argument_thread).pipe_injections) != 0)
329: {
330: (*s_etat_processus).erreur_systeme = d_es_processus;
331: return;
332: }
333:
334: if (pipe((*s_argument_thread).pipe_nombre_injections) != 0)
335: {
336: (*s_etat_processus).erreur_systeme = d_es_processus;
337: return;
338: }
339:
340: if ((s_nouvel_etat_processus = copie_etat_processus(s_etat_processus))
341: == NULL)
342: {
343: return;
344: }
345:
346: pthread_mutexattr_init(&attributs_mutex);
347: pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_RECURSIVE);
348: pthread_mutex_init(&((*s_argument_thread).mutex), &attributs_mutex);
349: pthread_mutexattr_destroy(&attributs_mutex);
350:
351: (*s_argument_thread).processus_detache = d_faux;
352: (*s_argument_thread).thread_actif = d_faux;
353: (*s_argument_thread).thread_pere = pthread_self();
354: (*s_argument_thread).pid = getpid();
355:
356: (*s_nouvel_etat_processus).pipe_donnees =
357: (*s_argument_thread).pipe_objets[1];
358: (*s_nouvel_etat_processus).pipe_nombre_objets_attente =
359: (*s_argument_thread).pipe_nombre_objets_attente[1];
360: (*s_nouvel_etat_processus).pipe_interruptions =
361: (*s_argument_thread).pipe_interruptions[1];
362: (*s_nouvel_etat_processus).pipe_nombre_interruptions_attente =
363: (*s_argument_thread).pipe_nombre_interruptions_attente[1];
364: (*s_nouvel_etat_processus).pipe_injections =
365: (*s_argument_thread).pipe_injections[0];
366: (*s_nouvel_etat_processus).pipe_nombre_injections =
367: (*s_argument_thread).pipe_nombre_injections[0];
368: (*s_nouvel_etat_processus).pipe_acquittement =
369: (*s_argument_thread).pipe_acquittement[0];
370: (*s_nouvel_etat_processus).presence_pipes = d_vrai;
371:
372: (*s_nouvel_etat_processus).niveau_initial =
373: (*s_etat_processus).niveau_courant;
374: (*s_nouvel_etat_processus).debug_programme = d_faux;
375: (*s_nouvel_etat_processus).nombre_objets_injectes = 0;
376: (*s_nouvel_etat_processus).nombre_objets_envoyes_non_lus = 0;
377: (*s_nouvel_etat_processus).temps_maximal_cpu = 0;
378: (*s_nouvel_etat_processus).presence_fusible = d_faux;
379: (*s_nouvel_etat_processus).thread_fusible = 0;
380:
381: (*s_nouvel_etat_processus).pile_profilage = NULL;
382: (*s_nouvel_etat_processus).pile_profilage_fonctions = NULL;
383:
384: /*
385: * Lancement du thread fils et du thread de surveillance
386: */
387:
388: if (pthread_attr_init(&attributs) != 0)
389: {
390: (*s_etat_processus).erreur_systeme = d_es_processus;
391: return;
392: }
393:
394: if (pthread_attr_setdetachstate(&attributs, PTHREAD_CREATE_JOINABLE) != 0)
395: {
396: (*s_etat_processus).erreur_systeme = d_es_processus;
397: return;
398: }
399:
400: if (pthread_attr_setschedpolicy(&attributs, SCHED_OTHER) != 0)
401: {
402: (*s_etat_processus).erreur_systeme = d_es_processus;
403: return;
404: }
405:
406: if (pthread_attr_setinheritsched(&attributs, PTHREAD_EXPLICIT_SCHED) != 0)
407: {
408: (*s_etat_processus).erreur_systeme = d_es_processus;
409: return;
410: }
411:
412: if (pthread_attr_setscope(&attributs, PTHREAD_SCOPE_SYSTEM) != 0)
413: {
414: (*s_etat_processus).erreur_systeme = d_es_processus;
415: return;
416: }
417:
418: /*
419: * Création de l'objet à retourner
420: */
421:
422: if ((s_objet_resultat = allocation(s_etat_processus, PRC)) == NULL)
423: {
424: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
425: return;
426: }
427:
428: (*((struct_processus_fils *) (*s_objet_resultat).objet)).thread
429: = s_argument_thread;
430:
431: (*(*((struct_processus_fils *) (*s_objet_resultat).objet)).thread)
432: .nombre_objets_dans_pipe = 0;
433: (*(*((struct_processus_fils *) (*s_objet_resultat).objet)).thread)
434: .nombre_interruptions_dans_pipe = 0;
435: (*(*((struct_processus_fils *) (*s_objet_resultat).objet)).thread)
436: .nombre_references = 1;
437:
438: // Lancement du thread fils
439:
440: if (pthread_mutex_lock(&((*s_nouvel_etat_processus).mutex)) != 0)
441: {
442: (*s_etat_processus).erreur_systeme = d_es_processus;
443: return;
444: }
445:
446: (*s_argument_thread).s_nouvel_etat_processus = s_nouvel_etat_processus;
447: (*s_argument_thread).s_etat_processus = s_etat_processus;
448:
449: if (variable_partagee == d_vrai)
450: {
451: (*s_argument_thread).argument = s_copie;
452: (*s_argument_thread).destruction_objet = d_vrai;
453: }
454: else
455: {
456: (*s_argument_thread).argument = s_objet;
457: (*s_argument_thread).destruction_objet = d_faux;
458: }
459:
460: (*s_argument_thread).set = set;
461: (*s_argument_thread).oldset = oldset;
1.15 bertrand 462: (*s_argument_thread).thread_actif = d_faux;
1.1 bertrand 463:
464: if (pthread_create(&thread_id, &attributs, lancement_thread,
465: s_argument_thread) != 0)
466: {
467: (*s_etat_processus).erreur_systeme = d_es_processus;
468: return;
469: }
470:
1.15 bertrand 471: attente.tv_sec = 0;
472: attente.tv_nsec = GRANULARITE_us * 1000;
473:
474: while((*s_argument_thread).thread_actif == d_faux)
475: {
476: nanosleep(&attente, NULL);
477: INCR_GRANULARITE(attente.tv_nsec);
478: }
479:
1.1 bertrand 480: if (pthread_attr_destroy(&attributs) != 0)
481: {
482: (*s_etat_processus).erreur_systeme = d_es_processus;
483: return;
484: }
485:
486: if (pthread_attr_init(&attributs) != 0)
487: {
488: (*s_etat_processus).erreur_systeme = d_es_processus;
489: return;
490: }
491:
492: if (pthread_attr_setdetachstate(&attributs,
493: PTHREAD_CREATE_DETACHED) != 0)
494: {
495: (*s_etat_processus).erreur_systeme = d_es_processus;
496: return;
497: }
498:
499: if (pthread_attr_setschedpolicy(&attributs, SCHED_OTHER) != 0)
500: {
501: (*s_etat_processus).erreur_systeme = d_es_processus;
502: return;
503: }
504:
505: if (pthread_attr_setinheritsched(&attributs,
506: PTHREAD_EXPLICIT_SCHED) != 0)
507: {
508: (*s_etat_processus).erreur_systeme = d_es_processus;
509: return;
510: }
511:
512: if (pthread_attr_setscope(&attributs, PTHREAD_SCOPE_SYSTEM) != 0)
513: {
514: (*s_etat_processus).erreur_systeme = d_es_processus;
515: return;
516: }
517:
518: // Attente de l'affectation de la grandeur processus.tid par le thread fils.
519:
520: if (pthread_mutex_lock(&((*s_nouvel_etat_processus).mutex)) != 0)
521: {
522: (*s_etat_processus).erreur_systeme = d_es_processus;
523: return;
524: }
525:
526: /*
527: * On copie l'objet plutôt que le pointeur car cet objet peut être
528: * accédé depuis deux threads distincts et aboutir à un blocage lors d'une
529: * copie.
530: */
531:
532: if ((s_objet_systeme = copie_objet(s_etat_processus, s_objet_resultat, 'O'))
533: == NULL)
534: {
535: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
536: return;
537: }
538:
539: if (pthread_mutex_lock(&((*s_etat_processus).mutex)) != 0)
540: {
541: (*s_etat_processus).erreur_systeme = d_es_processus;
542: return;
543: }
544:
545: // Si le tid existe déjà dans la pile des processus, il s'agit forcement
546: // d'un processus moribond. On attend donc qu'il soit effectivement
547: // libéré.
548:
549: do
550: {
551: l_element_courant = (struct_liste_chainee *)
552: (*s_etat_processus).l_base_pile_processus;
553: drapeau = d_faux;
554:
555: attente.tv_sec = 0;
556: attente.tv_nsec = GRANULARITE_us * 1000;
557:
558: while(l_element_courant != NULL)
559: {
560: if (((*(*((struct_processus_fils *)
561: (*(*l_element_courant).donnee).objet)).thread)
562: .processus_detache == d_faux) &&
563: ((*s_argument_thread).processus_detache == d_faux))
564: {
565: if (pthread_equal((*(*((struct_processus_fils *)
566: (*(*l_element_courant).donnee).objet)).thread)
567: .tid, (*s_argument_thread).tid) != 0)
568: {
569: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
570: {
571: (*s_etat_processus).erreur_systeme = d_es_processus;
572: return;
573: }
574:
575: scrutation_injection(s_etat_processus);
576:
577: if ((*s_etat_processus).nombre_interruptions_non_affectees
578: != 0)
579: {
580: affectation_interruptions_logicielles(s_etat_processus);
581: }
582:
583: if ((*s_etat_processus).nombre_interruptions_en_queue != 0)
584: {
585: traitement_interruptions_logicielles(s_etat_processus);
586: }
587:
588: nanosleep(&attente, NULL);
589: INCR_GRANULARITE(attente.tv_nsec);
590:
591: if (pthread_mutex_lock(&((*s_etat_processus).mutex)) != 0)
592: {
593: (*s_etat_processus).erreur_systeme = d_es_processus;
594: return;
595: }
596:
597: drapeau = d_vrai;
598: break;
599: }
600: }
601:
602: l_element_courant = (*l_element_courant).suivant;
603: }
604: } while(drapeau == d_vrai);
605:
606: if (empilement(s_etat_processus,
607: (struct_liste_chainee **) &((*s_etat_processus)
608: .l_base_pile_processus), s_objet_systeme) == d_erreur)
609: {
610: pthread_mutex_unlock(&((*s_etat_processus).mutex));
611: pthread_mutex_unlock(&((*s_nouvel_etat_processus).mutex));
612: return;
613: }
614:
615: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
616: {
617: (*s_etat_processus).erreur_systeme = d_es_processus;
618: return;
619: }
620:
621: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
622: s_objet_resultat) == d_erreur)
623: {
624: pthread_mutex_unlock(&((*s_nouvel_etat_processus).mutex));
625: return;
626: }
627:
628: if (pthread_mutex_lock(&(*s_argument_thread).mutex) != 0)
629: {
630: pthread_mutex_unlock(&((*s_nouvel_etat_processus).mutex));
631: (*s_etat_processus).erreur_systeme = d_es_processus;
632: return;
633: }
634:
635: if ((*s_argument_thread).thread_actif == d_faux)
636: {
637: // Le thread n'existe plus.
638:
639: pthread_join((*s_argument_thread).tid, NULL);
640: pthread_mutex_unlock(&((*s_nouvel_etat_processus).mutex));
641: pthread_mutex_unlock(&(*s_argument_thread).mutex);
642: (*s_etat_processus).erreur_systeme = d_es_processus;
643: return;
644: }
645:
646: if (pthread_mutex_unlock(&(*s_argument_thread).mutex) != 0)
647: {
648: pthread_mutex_unlock(&((*s_nouvel_etat_processus).mutex));
649: (*s_etat_processus).erreur_systeme = d_es_processus;
650: return;
651: }
652:
653: if (pthread_mutex_unlock(&((*s_nouvel_etat_processus).mutex)) != 0)
654: {
655: (*s_etat_processus).erreur_systeme = d_es_processus;
656: return;
657: }
658:
659: // Lancement du thread de surveillance
660:
661: if (pthread_create(&thread_surveillance, &attributs,
662: surveillance_processus, s_argument_thread) != 0)
663: {
664: (*s_etat_processus).erreur_systeme = d_es_processus;
665: return;
666: }
667:
668: if (pthread_attr_destroy(&attributs) != 0)
669: {
670: (*s_etat_processus).erreur_systeme = d_es_processus;
671: return;
672: }
673:
674: // Le fils peut être présent sans être en attente du signal de départ.
675:
676: if (pthread_kill((*s_argument_thread).tid, SIGSTART) != 0)
677: {
678: (*s_etat_processus).erreur_systeme = d_es_processus;
679: return;
680: }
681:
682: if (pthread_sigmask(SIG_SETMASK, &oldset, NULL) != 0)
683: {
684: (*s_etat_processus).erreur_systeme = d_es_processus;
685: return;
686: }
687:
688: sigpending(&set);
689:
690: return;
691: }
692:
693:
694: /*
695: ================================================================================
696: Fonction 'sqlconnect'
697: ================================================================================
698: Entrées :
699: --------------------------------------------------------------------------------
700: Sorties :
701: --------------------------------------------------------------------------------
702: Effets de bord : néant
703: ================================================================================
704: */
705:
706: void
707: instruction_sqlconnect(struct_processus *s_etat_processus)
708: {
709: struct_objet *s_objet_argument;
710: struct_objet *s_objet_resultat;
711: struct_objet *s_objet_systeme;
712:
713: (*s_etat_processus).erreur_execution = d_ex;
714:
715: if ((*s_etat_processus).affichage_arguments == 'Y')
716: {
717: printf("\n SQLCONNECT ");
718:
719: if ((*s_etat_processus).langue == 'F')
720: {
721: printf("(connexion à une base de données SQL)\n\n");
722: }
723: else
724: {
725: printf("(connect to SQL database)\n\n");
726: }
727:
728: printf(" 1: %s\n", d_LST);
729: printf("-> 1: %s\n\n", d_SQL);
730:
731: if ((*s_etat_processus).langue == 'F')
732: {
733: printf(" Utilisation :\n\n");
734: }
735: else
736: {
737: printf(" Usage:\n\n");
738: }
739:
740: printf(" { \"mysql\" \"server\" \"database\" "
741: "\"user\" \"password\" } SQLCONNECT\n");
742: printf(" { \"postgresql:iso-8859-1\" \"server\" "
743: "\"database\" \"user\" \"password\" port }\n");
744: printf(" SQLCONNECT\n");
745:
746: return;
747: }
748: else if ((*s_etat_processus).test_instruction == 'Y')
749: {
750: (*s_etat_processus).nombre_arguments = -1;
751: return;
752: }
753:
754: if (test_cfsf(s_etat_processus, 31) == d_vrai)
755: {
756: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
757: {
758: return;
759: }
760: }
761:
762: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
763: &s_objet_argument) == d_erreur)
764: {
765: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
766: return;
767: }
768:
769: if ((*s_objet_argument).type == LST)
770: {
771: if ((s_objet_resultat = parametres_sql(s_etat_processus,
772: s_objet_argument)) == NULL)
773: {
774: liberation(s_etat_processus, s_objet_argument);
775: return;
776: }
777:
778: if ((s_objet_systeme = copie_objet(s_etat_processus, s_objet_resultat,
779: 'O')) == NULL)
780: {
781: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
782: return;
783: }
784:
785: if (empilement(s_etat_processus,
786: (struct_liste_chainee **) &((*s_etat_processus)
787: .s_connecteurs_sql), s_objet_systeme) == d_erreur)
788: {
789: return;
790: }
791:
792: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
793: s_objet_resultat) == d_erreur)
794: {
795: return;
796: }
797: }
798: else
799: {
800: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
801:
802: liberation(s_etat_processus, s_objet_argument);
803: return;
804: }
805:
806: liberation(s_etat_processus, s_objet_argument);
807: return;
808: }
809:
810:
811: /*
812: ================================================================================
1.8 bertrand 813: Fonction 'sqldisconnect'
1.1 bertrand 814: ================================================================================
815: Entrées :
816: --------------------------------------------------------------------------------
817: Sorties :
818: --------------------------------------------------------------------------------
819: Effets de bord : néant
820: ================================================================================
821: */
822:
823: void
824: instruction_sqldisconnect(struct_processus *s_etat_processus)
825: {
826: logical1 drapeau;
827:
828: struct_liste_chainee *l_element_courant;
829: struct_liste_chainee *l_element_precedent;
830:
831: struct_objet *s_objet;
832:
833: (*s_etat_processus).erreur_execution = d_ex;
834:
835: if ((*s_etat_processus).affichage_arguments == 'Y')
836: {
837: printf("\n SQLDISCONNECT ");
838:
839: if ((*s_etat_processus).langue == 'F')
840: {
841: printf("(déconnexion d'une base de donnée SQL)\n\n");
842: }
843: else
844: {
845: printf("(disconnection from SQL database)\n\n");
846: }
847:
848: printf(" 1: %s\n", d_SQL);
849: return;
850: }
851: else if ((*s_etat_processus).test_instruction == 'Y')
852: {
853: (*s_etat_processus).nombre_arguments = -1;
854: return;
855: }
856:
857: if (test_cfsf(s_etat_processus, 31) == d_vrai)
858: {
859: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
860: {
861: return;
862: }
863: }
864:
865: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
866: &s_objet) == d_erreur)
867: {
868: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
869: return;
870: }
871:
872: if ((*s_objet).type == SQL)
873: {
874: if (((*((struct_connecteur_sql *) (*s_objet).objet)).pid !=
875: getpid()) || (pthread_equal((*((struct_connecteur_sql *)
876: (*s_objet).objet)).tid, pthread_self()) == 0))
877: {
878: (*s_etat_processus).erreur_execution = d_ex_fichier_hors_contexte;
879:
880: liberation(s_etat_processus, s_objet);
881: return;
882: }
883:
884: l_element_courant = (*s_etat_processus).s_connecteurs_sql;
885: l_element_precedent = NULL;
886:
887: while(l_element_courant != NULL)
888: {
889: if (((*((struct_connecteur_sql *) (*(*l_element_courant).donnee)
890: .objet)).pid == getpid()) && (pthread_equal(
891: (*((struct_connecteur_sql *) (*(*l_element_courant).donnee)
892: .objet)).tid, pthread_self()) != 0) &&
893: (strcmp((*((struct_connecteur_sql *) (*(*l_element_courant)
894: .donnee).objet)).type, (*((struct_connecteur_sql *)
895: (*s_objet).objet)).type) == 0))
896: {
897: if (strcmp((*((struct_connecteur_sql *) (*s_objet).objet)).type,
898: "MYSQL") == 0)
899: {
900: # ifdef MYSQL_SUPPORT
1.17 ! bertrand 901:
1.1 bertrand 902: if ((*((struct_connecteur_sql *) (*(*l_element_courant)
903: .donnee).objet)).descripteur.mysql ==
904: (*((struct_connecteur_sql *) (*s_objet).objet))
905: .descripteur.mysql)
906: {
907: drapeau = d_vrai;
908: }
909: else
910: {
911: drapeau = d_faux;
912: }
1.17 ! bertrand 913:
1.1 bertrand 914: # else
915:
916: if ((*s_etat_processus).langue == 'F')
917: {
918: printf("+++Attention : Support de MySQL "
919: "non compilé !\n");
920: }
921: else
922: {
923: printf("+++Warning : MySQL support not available !\n");
924: }
925:
926: fflush(stdout);
927:
928: drapeau = d_faux;
929: # endif
930: }
931: else if (strcmp((*((struct_connecteur_sql *) (*s_objet).objet))
932: .type, "POSTGRESQL") == 0)
933: {
934: # ifdef POSTGRESQL_SUPPORT
1.17 ! bertrand 935:
1.1 bertrand 936: if ((*((struct_connecteur_sql *) (*(*l_element_courant)
937: .donnee).objet)).descripteur.postgresql ==
938: (*((struct_connecteur_sql *) (*s_objet).objet))
939: .descripteur.postgresql)
940: {
941: drapeau = d_vrai;
942: }
943: else
944: {
945: drapeau = d_faux;
946: }
947:
948: # else
949:
950: if ((*s_etat_processus).langue == 'F')
951: {
952: printf("+++Attention : Support de PostgreSQL "
953: "non compilé !\n");
954: }
955: else
956: {
957: printf("+++Warning : PostgreSQL support "
958: "not available !\n");
959: }
960:
961: fflush(stdout);
962:
963: drapeau = d_faux;
964: # endif
965: }
966: else
967: {
968: BUG(1, printf("SQL type '%s' not allowed!",
969: (*((struct_connecteur_sql *) (*s_objet).objet))
970: .type));
971: return;
972: }
973:
974: if (drapeau == d_vrai)
975: {
976: if (l_element_precedent == NULL)
977: {
978: (*s_etat_processus).s_connecteurs_sql =
979: (*l_element_courant).suivant;
980: }
981: else if ((*l_element_courant).suivant == NULL)
982: {
983: (*l_element_precedent).suivant = NULL;
984: }
985: else
986: {
987: (*l_element_precedent).suivant =
988: (*l_element_courant).suivant;
989: }
990:
991: liberation(s_etat_processus, (*l_element_courant).donnee);
992: free(l_element_courant);
993:
994: break;
995: }
996: }
997:
998: l_element_precedent = l_element_courant;
999: l_element_courant = (*l_element_courant).suivant;
1000: }
1001:
1002: sqlclose(s_objet);
1003: }
1004: else
1005: {
1006: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
1007:
1008: liberation(s_etat_processus, s_objet);
1009: return;
1010: }
1011:
1012: liberation(s_etat_processus, s_objet);
1013: return;
1014: }
1015:
1016:
1017: /*
1018: ================================================================================
1019: Fonction 'smphrincr'
1020: ================================================================================
1021: Entrées :
1022: --------------------------------------------------------------------------------
1023: Sorties :
1024: --------------------------------------------------------------------------------
1025: Effets de bord : néant
1026: ================================================================================
1027: */
1028:
1029: void
1030: instruction_smphrincr(struct_processus *s_etat_processus)
1031: {
1032: struct_objet *s_objet_argument;
1033:
1034: (*s_etat_processus).erreur_execution = d_ex;
1035:
1036: if ((*s_etat_processus).affichage_arguments == 'Y')
1037: {
1038: printf("\n SMPHRINCR ");
1039:
1040: if ((*s_etat_processus).langue == 'F')
1041: {
1042: printf("(incrémentation du sémaphore)\n\n");
1043: }
1044: else
1045: {
1046: printf("(semaphore incrementation)\n\n");
1047: }
1048:
1049: printf(" 1: %s\n", d_SPH);
1050: return;
1051: }
1052: else if ((*s_etat_processus).test_instruction == 'Y')
1053: {
1054: (*s_etat_processus).nombre_arguments = -1;
1055: return;
1056: }
1057:
1058: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1059: {
1060: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
1061: {
1062: return;
1063: }
1064: }
1065:
1066: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1067: &s_objet_argument) == d_erreur)
1068: {
1069: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1070: return;
1071: }
1072:
1073: if ((*s_objet_argument).type == SPH)
1074: {
1075: if (sem_post((*((struct_semaphore *) (*s_objet_argument).objet))
1076: .semaphore) != 0)
1077: {
1078: (*s_etat_processus).erreur_execution = d_ex_semaphore;
1079:
1080: liberation(s_etat_processus, s_objet_argument);
1081: return;
1082: }
1083:
1084: liberation(s_etat_processus, s_objet_argument);
1085: }
1086: else
1087: {
1088: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
1089:
1090: liberation(s_etat_processus, s_objet_argument);
1091: return;
1092: }
1093:
1094: return;
1095: }
1096:
1097:
1098: /*
1099: ================================================================================
1100: Fonction 'smphrdecr'
1101: ================================================================================
1102: Entrées :
1103: --------------------------------------------------------------------------------
1104: Sorties :
1105: --------------------------------------------------------------------------------
1106: Effets de bord : néant
1107: ================================================================================
1108: */
1109:
1110: void
1111: instruction_smphrdecr(struct_processus *s_etat_processus)
1112: {
1113: struct_objet *s_objet_argument;
1114:
1115: unsigned char *tampon;
1116:
1117: (*s_etat_processus).erreur_execution = d_ex;
1118:
1119: if ((*s_etat_processus).affichage_arguments == 'Y')
1120: {
1121: printf("\n SMPHRDECR ");
1122:
1123: if ((*s_etat_processus).langue == 'F')
1124: {
1125: printf("(decrémentation du sémaphore)\n\n");
1126: }
1127: else
1128: {
1129: printf("(semaphore decrementation)\n\n");
1130: }
1131:
1132: printf(" 1: %s\n", d_SPH);
1133: return;
1134: }
1135: else if ((*s_etat_processus).test_instruction == 'Y')
1136: {
1137: (*s_etat_processus).nombre_arguments = -1;
1138: return;
1139: }
1140:
1141: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1142: {
1143: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
1144: {
1145: return;
1146: }
1147: }
1148:
1149: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1150: &s_objet_argument) == d_erreur)
1151: {
1152: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1153: return;
1154: }
1155:
1156: if ((*s_objet_argument).type == SPH)
1157: {
1158: if ((*s_etat_processus).profilage == d_vrai)
1159: {
1160: if ((tampon = formateur(s_etat_processus, 0, s_objet_argument))
1161: == NULL)
1162: {
1163: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1164: return;
1165: }
1166:
1167: profilage(s_etat_processus, tampon);
1168: free(tampon);
1169:
1170: if ((*s_etat_processus).erreur_systeme != d_es)
1171: {
1172: return;
1173: }
1174: }
1175:
1.7 bertrand 1176: # ifndef SEMAPHORES_NOMMES
1.1 bertrand 1177: if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
1178: {
1179: (*s_etat_processus).erreur_systeme = d_es_processus;
1180: return;
1181: }
1.7 bertrand 1182: # else
1183: if (sem_post((*s_etat_processus).semaphore_fork) != 0)
1184: {
1185: (*s_etat_processus).erreur_systeme = d_es_processus;
1186: return;
1187: }
1188: # endif
1.1 bertrand 1189:
1190: while(sem_wait((*((struct_semaphore *) (*s_objet_argument).objet))
1191: .semaphore) == -1)
1192: {
1193: if (errno != EINTR)
1194: {
1195: (*s_etat_processus).erreur_execution = d_ex_semaphore;
1196:
1197: if ((*s_etat_processus).profilage == d_vrai)
1198: {
1199: profilage(s_etat_processus, NULL);
1200: }
1201:
1202: liberation(s_etat_processus, s_objet_argument);
1203: return;
1204: }
1205: }
1206:
1.7 bertrand 1207: # ifndef SEMAPHORES_NOMMES
1.1 bertrand 1208: while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
1.7 bertrand 1209: # else
1210: while(sem_wait((*s_etat_processus).semaphore_fork) == -1)
1211: # endif
1.1 bertrand 1212: {
1213: if (errno != EINTR)
1214: {
1215: if ((*s_etat_processus).profilage == d_vrai)
1216: {
1217: profilage(s_etat_processus, NULL);
1218: }
1219:
1220: (*s_etat_processus).erreur_systeme = d_es_processus;
1221: return;
1222: }
1223: }
1224:
1225: if ((*s_etat_processus).profilage == d_vrai)
1226: {
1227: profilage(s_etat_processus, NULL);
1228: }
1229:
1230: liberation(s_etat_processus, s_objet_argument);
1231: }
1232: else
1233: {
1234: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
1235:
1236: liberation(s_etat_processus, s_objet_argument);
1237: return;
1238: }
1239:
1240: return;
1241: }
1242:
1243:
1244: /*
1245: ================================================================================
1246: Fonction 'smphrtrydecr'
1247: ================================================================================
1248: Entrées :
1249: --------------------------------------------------------------------------------
1250: Sorties :
1251: --------------------------------------------------------------------------------
1252: Effets de bord : néant
1253: ================================================================================
1254: */
1255:
1256: void
1257: instruction_smphrtrydecr(struct_processus *s_etat_processus)
1258: {
1259: struct_objet *s_objet_argument;
1260: struct_objet *s_objet_resultat;
1261:
1262: unsigned char *tampon;
1263:
1264: (*s_etat_processus).erreur_execution = d_ex;
1265:
1266: if ((*s_etat_processus).affichage_arguments == 'Y')
1267: {
1268: printf("\n SMPHRTRYDECR ");
1269:
1270: if ((*s_etat_processus).langue == 'F')
1271: {
1272: printf("(essai de decrémentation du sémaphore)\n\n");
1273: }
1274: else
1275: {
1276: printf("(try to decremente semaphore)\n\n");
1277: }
1278:
1279: printf(" 1: %s\n", d_SPH);
1280: printf("-> 1: %s\n", d_INT);
1281: return;
1282: }
1283: else if ((*s_etat_processus).test_instruction == 'Y')
1284: {
1285: (*s_etat_processus).nombre_arguments = -1;
1286: return;
1287: }
1288:
1289: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1290: {
1291: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
1292: {
1293: return;
1294: }
1295: }
1296:
1297: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1298: &s_objet_argument) == d_erreur)
1299: {
1300: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1301: return;
1302: }
1303:
1304: if ((*s_objet_argument).type == SPH)
1305: {
1306: if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
1307: {
1308: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1309: return;
1310: }
1311:
1312: if ((*s_etat_processus).profilage == d_vrai)
1313: {
1314: if ((tampon = formateur(s_etat_processus, 0, s_objet_argument))
1315: == NULL)
1316: {
1317: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1318: return;
1319: }
1320:
1321: profilage(s_etat_processus, tampon);
1322: free(tampon);
1323:
1324: if ((*s_etat_processus).erreur_systeme != d_es)
1325: {
1326: return;
1327: }
1328: }
1329:
1.7 bertrand 1330: # ifndef SEMAPHORES_NOMMES
1.1 bertrand 1331: if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
1332: {
1333: (*s_etat_processus).erreur_systeme = d_es_processus;
1334: return;
1335: }
1.7 bertrand 1336: # else
1337: if (sem_post((*s_etat_processus).semaphore_fork) != 0)
1338: {
1339: (*s_etat_processus).erreur_systeme = d_es_processus;
1340: return;
1341: }
1342: # endif
1.1 bertrand 1343:
1344: (*((integer8 *) (*s_objet_resultat).objet)) = 0;
1345:
1346: while(sem_trywait((*((struct_semaphore *) (*s_objet_argument).objet))
1347: .semaphore) == -1)
1348: {
1349: switch(errno)
1350: {
1351: case EINTR :
1352: {
1353: break;
1354: }
1355:
1356: case EINVAL :
1357: {
1358: (*s_etat_processus).erreur_execution = d_ex_semaphore;
1359:
1360: if ((*s_etat_processus).profilage == d_vrai)
1361: {
1362: profilage(s_etat_processus, NULL);
1363: }
1364:
1365: liberation(s_etat_processus, s_objet_argument);
1366: return;
1367: }
1368:
1369: case EAGAIN :
1370: {
1371: (*((integer8 *) (*s_objet_resultat).objet)) = -1;
1372: break;
1373: }
1374: }
1375:
1376: if ((*((integer8 *) (*s_objet_resultat).objet)) != 0)
1377: {
1378: break;
1379: }
1380: }
1381:
1.7 bertrand 1382: # ifndef SEMAPHORES_NOMMES
1.1 bertrand 1383: while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
1.7 bertrand 1384: # else
1385: while(sem_wait((*s_etat_processus).semaphore_fork) == -1)
1386: # endif
1.1 bertrand 1387: {
1388: if (errno != EINTR)
1389: {
1390: if ((*s_etat_processus).profilage == d_vrai)
1391: {
1392: profilage(s_etat_processus, NULL);
1393: }
1394:
1395: (*s_etat_processus).erreur_systeme = d_es_processus;
1396: return;
1397: }
1398: }
1399:
1400: if ((*s_etat_processus).profilage == d_vrai)
1401: {
1402: profilage(s_etat_processus, NULL);
1403: }
1404:
1405: liberation(s_etat_processus, s_objet_argument);
1406: }
1407: else
1408: {
1409: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
1410:
1411: liberation(s_etat_processus, s_objet_argument);
1412: return;
1413: }
1414:
1415: return;
1416: }
1417:
1418:
1419: /*
1420: ================================================================================
1421: Fonction 'smphrgetv'
1422: ================================================================================
1423: Entrées :
1424: --------------------------------------------------------------------------------
1425: Sorties :
1426: --------------------------------------------------------------------------------
1427: Effets de bord : néant
1428: ================================================================================
1429: */
1430:
1431: void
1432: instruction_smphrgetv(struct_processus *s_etat_processus)
1433: {
1434: int valeur;
1435:
1436: struct_objet *s_objet_argument;
1437: struct_objet *s_objet_resultat;
1438:
1439: (*s_etat_processus).erreur_execution = d_ex;
1440:
1441: if ((*s_etat_processus).affichage_arguments == 'Y')
1442: {
1443: printf("\n SMPHRGETV ");
1444:
1445: if ((*s_etat_processus).langue == 'F')
1446: {
1447: printf("(valeur du sémaphore)\n\n");
1448: }
1449: else
1450: {
1451: printf("(semaphore value)\n\n");
1452: }
1453:
1454: printf(" 1: %s\n", d_SPH);
1455: return;
1456: }
1457: else if ((*s_etat_processus).test_instruction == 'Y')
1458: {
1459: (*s_etat_processus).nombre_arguments = -1;
1460: return;
1461: }
1462:
1463: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1464: {
1465: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
1466: {
1467: return;
1468: }
1469: }
1470:
1471: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1472: &s_objet_argument) == d_erreur)
1473: {
1474: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1475: return;
1476: }
1477:
1478: if ((*s_objet_argument).type == SPH)
1479: {
1480: if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
1481: {
1482: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1483:
1484: liberation(s_etat_processus, s_objet_argument);
1485: return;
1486: }
1487:
1488: if (sem_getvalue((*((struct_semaphore *) (*s_objet_argument).objet))
1489: .semaphore, &valeur) != 0)
1490: {
1491: (*s_etat_processus).erreur_execution = d_ex_semaphore;
1492:
1493: liberation(s_etat_processus, s_objet_argument);
1494: return;
1495: }
1496:
1497: (*((integer8 *) (*s_objet_resultat).objet)) = valeur;
1498:
1499: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1500: s_objet_resultat) == d_erreur)
1501: {
1502: return;
1503: }
1504:
1505: liberation(s_etat_processus, s_objet_argument);
1506: }
1507: else
1508: {
1509: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
1510:
1511: liberation(s_etat_processus, s_objet_argument);
1512: return;
1513: }
1514:
1515: return;
1516: }
1517:
1518:
1519: /*
1520: ================================================================================
1521: Fonction 'svl'
1522: ================================================================================
1523: Entrées :
1524: --------------------------------------------------------------------------------
1525: Sorties :
1526: --------------------------------------------------------------------------------
1527: Effets de bord : néant
1528: ================================================================================
1529: */
1530:
1531: void
1532: instruction_svl(struct_processus *s_etat_processus)
1533: {
1534: struct_objet *s_objet_argument;
1535: struct_objet *s_objet_resultat;
1536:
1537: (*s_etat_processus).erreur_execution = d_ex;
1538:
1539: if ((*s_etat_processus).affichage_arguments == 'Y')
1540: {
1541: printf("\n SVL ");
1542:
1543: if ((*s_etat_processus).langue == 'F')
1544: {
1545: printf("(valeurs singulières)\n\n");
1546: }
1547: else
1548: {
1549: printf("(singular values)\n\n");
1550: }
1551:
1552: printf(" 1: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
1553: printf("-> 1: %s\n", d_VRL);
1554: return;
1555: }
1556: else if ((*s_etat_processus).test_instruction == 'Y')
1557: {
1558: (*s_etat_processus).nombre_arguments = -1;
1559: return;
1560: }
1561:
1562: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1563: {
1564: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
1565: {
1566: return;
1567: }
1568: }
1569:
1570: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1571: &s_objet_argument) == d_erreur)
1572: {
1573: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1574: return;
1575: }
1576:
1577: if (((*s_objet_argument).type == MIN) ||
1578: ((*s_objet_argument).type == MRL) ||
1579: ((*s_objet_argument).type == MCX))
1580: {
1581: if ((s_objet_resultat = allocation(s_etat_processus, VRL)) == NULL)
1582: {
1583: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1584: return;
1585: }
1586:
1587: valeurs_singulieres(s_etat_processus, (*s_objet_argument).objet,
1588: NULL, (*s_objet_resultat).objet, NULL);
1589:
1590: if ((*s_etat_processus).erreur_systeme != d_es)
1591: {
1592: return;
1593: }
1594:
1595: if (((*s_etat_processus).erreur_execution != d_ex) ||
1596: ((*s_etat_processus).exception != d_ep))
1597: {
1598: liberation(s_etat_processus, s_objet_resultat);
1599: liberation(s_etat_processus, s_objet_argument);
1600: return;
1601: }
1602:
1603: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1604: s_objet_resultat) == d_erreur)
1605: {
1606: return;
1607: }
1608: }
1609: else
1610: {
1611: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
1612:
1613: liberation(s_etat_processus, s_objet_argument);
1614: return;
1615: }
1616:
1617: liberation(s_etat_processus, s_objet_argument);
1618:
1619: return;
1620: }
1621:
1622:
1623: /*
1624: ================================================================================
1625: Fonction 'svd'
1626: ================================================================================
1627: Entrées :
1628: --------------------------------------------------------------------------------
1629: Sorties :
1630: --------------------------------------------------------------------------------
1631: Effets de bord : néant
1632: ================================================================================
1633: */
1634:
1635: void
1636: instruction_svd(struct_processus *s_etat_processus)
1637: {
1638: struct_objet *s_objet_argument;
1639: struct_objet *s_objet_resultat_1;
1640: struct_objet *s_objet_resultat_2;
1641: struct_objet *s_objet_resultat_3;
1642:
1643: struct_vecteur s_vecteur;
1644:
1645: unsigned long i;
1646: unsigned long j;
1647:
1648: (*s_etat_processus).erreur_execution = d_ex;
1649:
1650: if ((*s_etat_processus).affichage_arguments == 'Y')
1651: {
1652: printf("\n SVD ");
1653:
1654: if ((*s_etat_processus).langue == 'F')
1655: {
1656: printf("(décomposition en valeurs singulières)\n\n");
1657: }
1658: else
1659: {
1660: printf("(singular value decomposition)\n\n");
1661: }
1662:
1663: printf(" 1: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
1664: printf("-> 3: %s, %s\n", d_MRL, d_MCX);
1665: printf(" 2: %s, %s\n", d_MRL, d_MCX);
1666: printf(" 1: %s\n", d_VRL);
1667: return;
1668: }
1669: else if ((*s_etat_processus).test_instruction == 'Y')
1670: {
1671: (*s_etat_processus).nombre_arguments = -1;
1672: return;
1673: }
1674:
1675: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1676: {
1677: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
1678: {
1679: return;
1680: }
1681: }
1682:
1683: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1684: &s_objet_argument) == d_erreur)
1685: {
1686: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1687: return;
1688: }
1689:
1690: if (((*s_objet_argument).type == MIN) ||
1691: ((*s_objet_argument).type == MRL))
1692: {
1693: if ((s_objet_resultat_1 = allocation(s_etat_processus, MRL)) == NULL)
1694: {
1695: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1696: return;
1697: }
1698:
1699: if ((s_objet_resultat_2 = allocation(s_etat_processus, MRL)) == NULL)
1700: {
1701: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1702: return;
1703: }
1704:
1705: if ((s_objet_resultat_3 = allocation(s_etat_processus, MRL)) == NULL)
1706: {
1707: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1708: return;
1709: }
1710:
1711: valeurs_singulieres(s_etat_processus, (*s_objet_argument).objet,
1712: (*s_objet_resultat_3).objet, &s_vecteur,
1713: (*s_objet_resultat_1).objet);
1714:
1715: if ((*s_etat_processus).erreur_systeme != d_es)
1716: {
1717: return;
1718: }
1719:
1720: if (((*s_etat_processus).erreur_execution != d_ex) ||
1721: ((*s_etat_processus).exception != d_ep))
1722: {
1723: liberation(s_etat_processus, s_objet_resultat_1);
1724: liberation(s_etat_processus, s_objet_resultat_2);
1725: liberation(s_etat_processus, s_objet_resultat_3);
1726: liberation(s_etat_processus, s_objet_argument);
1727: return;
1728: }
1729:
1730: (*((struct_matrice *) (*s_objet_resultat_2).objet)).nombre_colonnes =
1731: (*((struct_matrice *) (*s_objet_argument).objet))
1732: .nombre_colonnes;
1733: (*((struct_matrice *) (*s_objet_resultat_2).objet)).nombre_lignes =
1734: (*((struct_matrice *) (*s_objet_argument).objet))
1735: .nombre_lignes;
1736:
1737: if (((*((struct_matrice *) (*s_objet_resultat_2).objet)).tableau =
1738: malloc((*((struct_matrice *) (*s_objet_resultat_2).objet))
1739: .nombre_lignes * sizeof(real8 *))) == NULL)
1740: {
1741: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1742: return;
1743: }
1744:
1745: for(i = 0; i < (*((struct_matrice *) (*s_objet_resultat_2).objet))
1746: .nombre_lignes; i++)
1747: {
1748: if ((((real8 **) (*((struct_matrice *) (*s_objet_resultat_2)
1749: .objet)).tableau)[i] = malloc((*((struct_matrice *)
1750: (*s_objet_resultat_2).objet)).nombre_colonnes *
1751: sizeof(real8 *))) == NULL)
1752: {
1753: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1754: return;
1755: }
1756:
1757: for(j = 0; j < (*((struct_matrice *) (*s_objet_resultat_2).objet))
1758: .nombre_colonnes; j++)
1759: {
1760: ((real8 **) (*((struct_matrice *) (*s_objet_resultat_2)
1761: .objet)).tableau)[i][j] = 0;
1762: }
1763: }
1764:
1765: for(i = 0; i < s_vecteur.taille; i++)
1766: {
1767: ((real8 **) (*((struct_matrice *) (*s_objet_resultat_2).objet))
1768: .tableau)[i][i] = ((real8 *) (s_vecteur.tableau))[i];
1769: }
1770:
1771: free(s_vecteur.tableau);
1772:
1773: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1774: s_objet_resultat_3) == d_erreur)
1775: {
1776: return;
1777: }
1778:
1779: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1780: s_objet_resultat_2) == d_erreur)
1781: {
1782: return;
1783: }
1784:
1785: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1786: s_objet_resultat_1) == d_erreur)
1787: {
1788: return;
1789: }
1790: }
1791: else if ((*s_objet_argument).type == MCX)
1792: {
1793: if ((s_objet_resultat_1 = allocation(s_etat_processus, MCX)) == NULL)
1794: {
1795: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1796: return;
1797: }
1798:
1799: if ((s_objet_resultat_2 = allocation(s_etat_processus, MRL)) == NULL)
1800: {
1801: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1802: return;
1803: }
1804:
1805: if ((s_objet_resultat_3 = allocation(s_etat_processus, MCX)) == NULL)
1806: {
1807: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1808: return;
1809: }
1810:
1811: valeurs_singulieres(s_etat_processus, (*s_objet_argument).objet,
1812: (*s_objet_resultat_3).objet, &s_vecteur,
1813: (*s_objet_resultat_1).objet);
1814:
1815: if ((*s_etat_processus).erreur_systeme != d_es)
1816: {
1817: return;
1818: }
1819:
1820: if (((*s_etat_processus).erreur_execution != d_ex) ||
1821: ((*s_etat_processus).exception != d_ep))
1822: {
1823: liberation(s_etat_processus, s_objet_resultat_1);
1824: liberation(s_etat_processus, s_objet_resultat_2);
1825: liberation(s_etat_processus, s_objet_resultat_3);
1826: liberation(s_etat_processus, s_objet_argument);
1827: return;
1828: }
1829:
1830: (*((struct_matrice *) (*s_objet_resultat_2).objet)).nombre_colonnes =
1831: (*((struct_matrice *) (*s_objet_argument).objet))
1832: .nombre_colonnes;
1833: (*((struct_matrice *) (*s_objet_resultat_2).objet)).nombre_lignes =
1834: (*((struct_matrice *) (*s_objet_argument).objet))
1835: .nombre_lignes;
1836:
1837: if (((*((struct_matrice *) (*s_objet_resultat_2).objet)).tableau =
1838: malloc((*((struct_matrice *) (*s_objet_resultat_2).objet))
1839: .nombre_lignes * sizeof(real8 *))) == NULL)
1840: {
1841: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1842: return;
1843: }
1844:
1845: for(i = 0; i < (*((struct_matrice *) (*s_objet_resultat_2).objet))
1846: .nombre_lignes; i++)
1847: {
1848: if ((((real8 **) (*((struct_matrice *) (*s_objet_resultat_2)
1849: .objet)).tableau)[i] = malloc((*((struct_matrice *)
1850: (*s_objet_resultat_2).objet)).nombre_colonnes *
1851: sizeof(real8 *))) == NULL)
1852: {
1853: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1854: return;
1855: }
1856:
1857: for(j = 0; j < (*((struct_matrice *) (*s_objet_resultat_2).objet))
1858: .nombre_colonnes; j++)
1859: {
1860: ((real8 **) (*((struct_matrice *) (*s_objet_resultat_2)
1861: .objet)).tableau)[i][j] = 0;
1862: }
1863: }
1864:
1865: for(i = 0; i < s_vecteur.taille; i++)
1866: {
1867: ((real8 **) (*((struct_matrice *) (*s_objet_resultat_2).objet))
1868: .tableau)[i][i] = ((real8 *) (s_vecteur.tableau))[i];
1869: }
1870:
1871: free(s_vecteur.tableau);
1872:
1873: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1874: s_objet_resultat_3) == d_erreur)
1875: {
1876: return;
1877: }
1878:
1879: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1880: s_objet_resultat_2) == d_erreur)
1881: {
1882: return;
1883: }
1884:
1885: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1886: s_objet_resultat_1) == d_erreur)
1887: {
1888: return;
1889: }
1890: }
1891: else
1892: {
1893: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
1894:
1895: liberation(s_etat_processus, s_objet_argument);
1896: return;
1897: }
1898:
1899: liberation(s_etat_processus, s_objet_argument);
1900: return;
1901: }
1902:
1903:
1904: /*
1905: ================================================================================
1906: Fonction 'swapcntxt'
1907: ================================================================================
1908: Entrées :
1909: --------------------------------------------------------------------------------
1910: Sorties :
1911: --------------------------------------------------------------------------------
1912: Effets de bord : néant
1913: ================================================================================
1914: */
1915:
1916: void
1917: instruction_swapcntxt(struct_processus *s_etat_processus)
1918: {
1919: integer8 i;
1920: integer8 registre_taille;
1921:
1922: struct_liste_chainee *l_element_courant;
1923: struct_liste_chainee *l_element_courant_taille;
1924: struct_liste_chainee *registre;
1925:
1926: struct_objet *s_objet_argument;
1927:
1928: (*s_etat_processus).erreur_execution = d_ex;
1929:
1930: if ((*s_etat_processus).affichage_arguments == 'Y')
1931: {
1932: printf("\n SWAPCNTXT ");
1933:
1934: if ((*s_etat_processus).langue == 'F')
1935: {
1936: printf("(échange de contextes)\n\n");
1937: }
1938: else
1939: {
1940: printf("(swap contexts)\n\n");
1941: }
1942:
1943: printf(" 1: %s\n", d_INT);
1944: return;
1945: }
1946: else if ((*s_etat_processus).test_instruction == 'Y')
1947: {
1948: (*s_etat_processus).nombre_arguments = -1;
1949: return;
1950: }
1951:
1952: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1953: {
1954: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
1955: {
1956: return;
1957: }
1958: }
1959:
1960: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1961: &s_objet_argument) == d_erreur)
1962: {
1963: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1964: return;
1965: }
1966:
1967: if ((*s_objet_argument).type == INT)
1968: {
1969: l_element_courant = (*s_etat_processus).l_base_pile_contextes;
1970: l_element_courant_taille = (*s_etat_processus)
1971: .l_base_pile_taille_contextes;
1972:
1973: i = (*((integer8 *) (*s_objet_argument).objet));
1974:
1975: while((l_element_courant != NULL) && (l_element_courant_taille != NULL))
1976: {
1977: i--;
1978:
1979: if (i == 0)
1980: {
1981: break;
1982: }
1983:
1984: l_element_courant = (*l_element_courant).suivant;
1985: l_element_courant_taille = (*l_element_courant_taille).suivant;
1986: }
1987:
1988: if ((l_element_courant == NULL) || (l_element_courant_taille == NULL))
1989: {
1990: liberation(s_etat_processus, s_objet_argument);
1991:
1992: (*s_etat_processus).erreur_execution = d_ex_contexte;
1993: return;
1994: }
1995:
1996: if ((*(*l_element_courant).donnee).type != LST)
1997: {
1998: (*s_etat_processus).erreur_systeme = d_es_contexte;
1999: return;
2000: }
2001:
2002: if ((*(*l_element_courant_taille).donnee).type != INT)
2003: {
2004: (*s_etat_processus).erreur_systeme = d_es_contexte;
2005: return;
2006: }
2007:
2008: registre = (*s_etat_processus).l_base_pile;
2009: registre_taille = (*s_etat_processus).hauteur_pile_operationnelle;
2010:
2011: (*s_etat_processus).l_base_pile = (*(*l_element_courant).donnee).objet;
2012: (*s_etat_processus).hauteur_pile_operationnelle =
2013: (*((integer8 *) (*(*l_element_courant_taille).donnee).objet));
2014:
2015: (*(*l_element_courant).donnee).objet = registre;
2016: (*((integer8 *) (*(*l_element_courant_taille).donnee).objet)) =
2017: registre_taille;
2018: }
2019: else
2020: {
2021: liberation(s_etat_processus, s_objet_argument);
2022:
2023: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
2024: return;
2025: }
2026:
2027: liberation(s_etat_processus, s_objet_argument);
2028: }
2029:
2030: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>