/* module GLOBALTERM3D - part SERVER */ /* fonctionne avec le plugin du C3D 'term3d' */ /* by iri : info@irizone.net - mars 2004 */ /* Copyright (c) 2004 iri. Ce fichier fait partie du module DMS "globalTerm3d". globalTerm3d est un programme libre; vous pouvez le redistribuer et/ou le modifier selon les termes de la GNU General Public License (Licence Publique Générale GNU) telle qu'elle a été publiée par la Free Software Foundation : soit la version 2 de la licence, soit (comme vous le souhaitez) toute version ultérieure. globalTerm3d est distribué dans l'espoir qu'il sera utile, mais SANS LA MOINDRE GARANTIE; pas même la garantie implicite de COMMERCIABILITE ou d'ADEQUATION A UN BUT PARTICULIER. Voir la GNU General Public License pour plus de détails. Vous devriez avoir reçu une copie de la GNU General Public License en même temps que ce programme (fichier "COPYING", version 2 de la GNU General Public License); sinon, merci d'écrire à la Free Software Foundation, Inc, 59 Temple Place, Suite 330, Boston, MA02111-1307 USA. De plus, globalTerm3d peut être intégré à toute distribution de tout ou partie du SCS (Set Construction Set) et basé sur la technologie Scol, à l'exclusion de toute distribution complète ou partielle payante (autre que le prix d'envoi ou d'édition du support de la distribution). Vous devez respecter la GNU General Public License à tous les égards. Si vous modifiez ce fichier, vous pouvez étendre cette exception à votre version du fichier, mais n'êtes pas obligé de le faire. Si vous ne souhaitez pas le faire, supprimez cette déclaration l'exception de votre version. */ typeof cliTerm3d = [[S CLIENT] r1];; /* historique du term3d S pour chaque client CLIENT */ /* list -> [[S CLIENT] r1] x -> [S CLIENT] i -> I I <- pos de x dans list */ fun my_search_in_list(list, x, i)= if list == nil then 0 else let list -> [[m c] q] in if (UgetId CtoU c) == (UgetId CtoU x) then i else my_search_in_list q x i-1;; /* list -> [[S CLIENT] r1] n -> I pos à remplacer x -> [S CLIENT] [[S CLIENT] r1] <- la liste modifée */ fun replace_nth_in_list (list, n, x)= if n < 0 then list else let list -> [[a b] next] in if n==0 then x::next else [a b]::replace_nth_in_list next n-1 x;; /* list -> [[S CLIENT] r1] n -> I [[S CLIENT] r1] <- liste modifiée */ fun remove_nth_from_list (list, n)= if n < 0 then list else let list -> [first next] in if n==0 then next else first::remove_nth_from_list next n-1;; /* p -> S cli -> CLIENT I <- sans importance */ /* Change l'historique sauvegardé du client (ou l'ajoute le cas échéant : valeur 0 retournée par my_search_in_list) */ fun addTerm(p, cli)= let sizelist cliTerm3d -> size in let my_search_in_list cliTerm3d cli size -> r in set cliTerm3d = replace_nth_in_list cliTerm3d r [p cli]; 0;; /* cli -> CLIENT I <- */ /* renvoie le contenu de l'historique sauvegardé pour un client */ fun giveTerm(cli)= let sizelist cliTerm3d -> size in let my_search_in_list cliTerm3d cli size -> r in let nth_list cliTerm3d r-1 -> [term _] in _DMSevent this cli "termSaved" term nil; 0;; /* cli -> CLIENT I <- */ /* Supprime le client de la liste lorsqu'il se déconnecte du site */ fun delTerm(cli)= let sizelist cliTerm3d -> size in let my_search_in_list cliTerm3d cli size -> r in set cliTerm3d = remove_nth_from_list cliTerm3d r; 0;; /* from -> DMI cli -> CLIENT action -> S param -> S reply -> S */ fun activate(from,cli,action,param,rep)= if !strcmp action "outTerm" then (addTerm param cli; 0) else if !strcmp action "inTerm" then (giveTerm cli; 0) else if !strcmp action "outClient" then (delTerm cli; 0) else 0;; /* param -> S I <- */ /* initilalisation */ fun IniDMI(param)= _DMSregisterDMI this @activate nil nil nil; 0 ;;