fichier main contient le code des globales de l'API Plus de détails...
Aller au code source de ce fichier.
Fonctions | |
int | ObjCurlDestroy (mmachine m, int handsys, int mobj) |
int | SCOLinitEXAMPLEclass (mmachine m) |
Fonction défininssant l'API Scol de la bibliothèque. | |
__declspec (dllexport) | |
int | SCOLloadEXAMPLE (mmachine m) |
int | SCOLfreeEXAMPLE () |
Fonction de déchargement / libération. | |
Variables | |
cbmachine | ww |
mmachine | mm |
char * | example_name [EXAMPLE_PKG_NB] |
Définition de l'API. | |
int(* | example_fun [EXAMPLE_PKG_NB])(mmachine m) |
Définition des fonctions internes. | |
int | example_narg [EXAMPLE_PKG_NB] |
Nombre d'arguments ou type d'objets. | |
char * | example_type [EXAMPLE_PKG_NB] |
Prototypage Scol. |
fichier main contient le code des globales de l'API
Définition dans le fichier main.c.
__declspec | ( | dllexport | ) |
Définition à la ligne 220 du fichier main.c.
00221 { 00222 int k = 0; 00223 /* Affectation aux variables globales ww et mm des valeurs envoyées par le noyau des structures partagées. 00224 Il est impératif de les ajouter AVANT tout appel à des fonctions ou macros Scol sous peine de crash immédiat 00225 lors de l'exécution de Scol. */ 00226 ww = w; 00227 mm = m; 00228 00229 MMechostr (0, "EXAMPLE library : loading\n"); 00230 00231 if ((k = SCOLinitEXAMPLEclass (m))) return k; 00232 00233 MMechostr (0, "\nEXAMPLE library loaded !\n"); 00234 return k; 00235 }
int ObjCurlDestroy | ( | mmachine | m, | |
int | handsys, | |||
int | mobj | |||
) |
Définition à la ligne 43 du fichier main.c.
00044 { 00045 CURL * c; 00046 00047 MMechostr(MSKDEBUG, "ObjCurlDestroy: entering ...\n"); 00048 00049 c = (CURL *) MMfetch (m, MTOP (mobj), OBJCURL_HANDLE); 00050 if (c == NULL) 00051 { 00052 MMechostr(MSKDEBUG, "ObjCurlDestroy : object already destroyed\n"); 00053 return 0; 00054 } 00055 /*curl_easy_cleanup (c);*/ 00056 00057 MMstore (m, MTOP (mobj), OBJCURL_HANDLE, (int) NULL); 00058 MMechostr(MSKDEBUG, "ObjCurlDestroy: object has been destroyed\n"); 00059 00060 return 0; 00061 }
int SCOLfreeEXAMPLE | ( | ) |
Fonction de déchargement / libération.
La fonction est appelée lorsque Scol se termine. Elle définit, comme pour la fonction de chargement, dans le fichier usm.ini (voir ci-dessus).
Les éventuels objets Scol présents devront avoir été détruits au préalable. Ici, on peut, par exemple, libérer des ressources tierces telle qu'une bibliothèque
Définition à la ligne 273 du fichier main.c.
00282 { 00283 MMechostr(MSKDEBUG, "\nEXAMPLE library release !\n"); 00284 return 0; 00285 }
int SCOLinitEXAMPLEclass | ( | mmachine | m | ) |
Fonction défininssant l'API Scol de la bibliothèque.
structure | mmachine |
Une API Scol est définie par 4 tableaux et une fonction.
Les 4 tableaux ont tous une taille identique. Ceux-ci définissent respectivement le nom Scol des objets de l'API, le nom des fonctions internes correspondantes, le nombre d'arguments ou le type d'objet, et le prototypage Scol.
La fonction interne 'PKhardpak' les chargera dans l'environnement minimal. Ses arguments sont respectivement définis comme suit :
Dans notre exemple, cette API est définie par 4 tableaux de EXAMPLE_PKG_NB cases précisément. Il est impératif que les 4 tableaux aient le même nombre de cases et que cenombre soit strictement équivalent au nombre de fonctions de l'API.
Le comppilateur pourra ne rien dire si le nombre de cases est plus grand que le nombre réelle de fonctions de l'API (le cas inverse engendrera un warning si vous avez suivi mes options de compilation). Cependant, à l'exécution, la bibliothèque ne sera pas chargée et il n'y aura aucun message d'erreur. Ŝoyez attentif à ce niveau (comme au reste !). Notez que "nombre de fonctions" inclue les fonctions proprement dit mais aussi les objets Scol (les types Scol), les flags, etc ... définis dans votre API.
Les tableaux doivent correspondre, c'est-à-dire que le nom de l'élément de l'API situé à la première case doit correspondre la fonction interne situé à la même case du second tableau, qui doit correspondre au nombre d'argument situé à la même case du troisième tableau et même chose pour le quatrième tableau.
Enfin, il va de soi que le nombre d'arguments défini pour un élément de l'API dans le troisème tableau doit être strictement cohérent avec le typage défini au quatrième tableau.
Par exemple : si le nombre d'argument est 2, le typage de la fonction pourra être "fun [I S] I" ou "fun [Chn S]" mais pas "fun [I S I]" ou "fun [S] I". Là encore, aucune erreur ne peut être détecté lors de la compilation mais lorsque la tentative de chargement de votre bibliothèque par le noyau échouera immanquablement sans la moindre erreur apparente.
Définition à la ligne 180 du fichier main.c.
00181 { 00182 int k = 0; 00183 00184 MMechostr (MSKDEBUG, "SCOLinitEXAMPLEclass library : loading\n"); 00185 00186 ObjCurl = OBJregister (CURL_RFL_NB, 1, ObjCurlDestroy, "ObjCurlType"); 00187 OBJgetUserEvent(); 00188 00189 k = PKhardpak (m, "EXAMPLEengine", EXAMPLE_PKG_NB, example_name, example_fun, example_narg, example_type); 00190 return k; 00191 }
int SCOLloadEXAMPLE | ( | mmachine | m | ) |
Définition à la ligne 239 du fichier main.c.
00240 { 00241 int k = 0; 00242 /* Affectation à la variable globale mm des valeurs envoyées par le noyau des structures partagées. 00243 Il est impératif de l'ajouter AVANT tout appel à des fonctions ou macros Scol sous peine de crash immédiat 00244 lors de l'exécution de Scol. */ 00245 mm = m; 00246 00247 MMechostr (0, "EXAMPLE library : loading\n"); 00248 00249 if ((k = SCOLinitEXAMPLEclass (m))) return k; 00250 00251 MMechostr (0, "\nEXAMPLE library loaded !\n"); 00252 return k; 00253 }
int(* example_fun[EXAMPLE_PKG_NB])(mmachine m) |
{ NULL, sc_getFile, sc_newGetUrl }
Définition des fonctions internes.
Ce tableau donne la correspondance des fonctions Scol vers le code interne. À ce sujet, en C, les flags peuvent poser problèmes. Le code présenté ici n'est pas valide ANSI C (une option -ansi de gcc provoquera un warning non bloquant).
Dans le code source existant, il existe parfois ceci :
#define bullshit int (__cdecl *)(struct Mmachine *) (bullshit) (1*2)
Cette solution fonctionne dans la plupart des cas mais n'est pas garantie (outre le fait que gcc lancera au mieux un warning , probablement une erreur à moins d'être très laxiste sur ces options.
char* example_name[EXAMPLE_PKG_NB] |
{ "ObjCurl", "example_getFile", "example_newUrl" }
Définition de l'API.
\return | sans intérêt ici |
Quatre tableaux qui sont présentés à la fonction 'SCOLinitEXAMPLEclass' Les éléments définis dans ce preimer tableau seront alors accessibles depuis n'importe quel script Scol.
int example_narg[EXAMPLE_PKG_NB] |
{ TYPTYPE, 2, 5 }
Nombre d'arguments ou type d'objets.
Lorsqu'il s'agit d'une fonction Scol, le nombre exact d'arguments doit être indiqué. Sinon, divers flags sont possibles. Les plus courants sont TYPVAR pour une valeur numérique et TYPTYPE pour un type objet Scol. Les autres sont listés sur le tutoriel ou, de façon moins expliquée, sur scol_plugin_xxx.h
char* example_type[EXAMPLE_PKG_NB] |
{ NULL, "fun [S W] I", "fun [Chn S S fun [ObjCurl u0 S I S S] u1 u0] ObjCurl" }
Prototypage Scol.
Les prototypes Scol des fonctions doivent correspondre avec le nmbre d'arguments notés au tableau 3. Dans le cas contraire, il y aura une erreur à l'exécution lors de l'appel de la fonction