Référence du fichier main.c

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.

Description détaillée

fichier main contient le code des globales de l'API

Auteur:
iri <iri-@-irizone.net>
Date:
novembre 2010

Définition dans le fichier main.c.


Documentation des fonctions

__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.

Renvoie:
0 si succès

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.

Paramètres:
structure mmachine
Renvoie:
0 si succès

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 :

  • la machine Scol correspondante
  • le nom interne du package
  • le nombre d'éléments de l'API (donc la taille de chaque tableau)
  • les noms des éléments de votre API (fonctions, types, flags, ...)
  • leurs correspondants internes
  • le nombre d'argument qu'ils attendent (si cela a un sens, sinon ce sera NULL)
  • le typage Scol

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 }


Documentation des variables

int(* example_fun[EXAMPLE_PKG_NB])(mmachine m)
Valeur initiale :

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.

Définition à la ligne 97 du fichier main.c.

char* example_name[EXAMPLE_PKG_NB]
Valeur initiale :
{
    
    "ObjCurl",

    
    "example_getFile",    
    "example_newUrl"
}

Définition de l'API.

Paramètres:
\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.

Définition à la ligne 74 du fichier main.c.

int example_narg[EXAMPLE_PKG_NB]
Valeur initiale :
{
    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

Définition à la ligne 112 du fichier main.c.

char* example_type[EXAMPLE_PKG_NB]
Valeur initiale :
{
    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

Définition à la ligne 125 du fichier main.c.

Définition à la ligne 38 du fichier main.c.

Définition à la ligne 36 du fichier main.c.

Généré le Sat Nov 20 23:18:18 2010 pour example par  doxygen 1.6.3