2 Commits
Author SHA1 Message Date
fred 3ae1e8c019 feat: json mod 2025-05-08 15:47:59 +02:00
fred 31acb7939d WIP Windows + test READ.md convert from DokuWiki 2025-05-04 19:02:04 +02:00
9 changed files with 298 additions and 86 deletions

No files matched your search

+39 -20
View File
@@ -24,29 +24,15 @@ W
along with this program. If not, see <https://www.gnu.org/licenses/>.
```
# Installation
Installation depuis les dépôts officiels pour base Debian/Ubuntu:
```
sudo apt update
sudo apt install ca-certificates curl
sudo curl -fsSL http://apt.lanisys.fr/public.key -o /etc/apt/keyrings/wlanguage.gpg
sudo tee /etc/apt/sources.list.d/wlanguage.sources <<EOF
Types: deb
URIs: http://apt.lanisys.fr
Suites: $(. /etc/os-release && echo "$VERSION_CODENAME")
Components: main
Signed-By: /etc/apt/keyrings/wlanguage.gpg
EOF
sudo apt update
sudo apt install wlanguage
sudo exec bash -l
```
# Execution
var pour la shared lib, puis exécution :
```
export LD_LIBRARY_PATH=/home/fde/dev/langage/w/exec
(sur le serveur de dev. pour que ce soit compatible avec la version installee)
sudo ln -s /home/fde/dev/langage/w/lex /etc/wlanguage
exec/lw -t -WBIN:./exec -WSRC:. test
```
@@ -57,10 +43,43 @@ ldd
objdump/readelf (moins bien)
cat /proc/*/maps et faire des grep pour voir les .so et module chargés par opendl
```
# Compilation
# Compilation et execution
```
# exec/lwc $1.w $1.wa < $1.w ; exec/lwa $1.wa ; exec/lw $1
exec/genw $1.w && exec/lwa $1.wa ; exec/lw $1
exec/genw $1.w && exec/lwa $1.wa && rm $1.wa && exec/lw $1
```
# Site Web
https://w.lanisys.fr/
https://www.lanisys.fr/wiki/doku.php?id=w
## LANGAGE W
### Présentation
Le but du langage W est d’être simple, efficace, robuste.
Il est fourni avec un compilateur qui génère un code binaire de type
*p-code*, compatible toute plateforme.
Un exécuteur de p-code W sera disponible sur Linux et d’autres OS.
Un interpréteur W permet également d’exécuter un programme W en mode
*script*.
Un module FastCGI permettra de plus d’utiliser le langage W en mode
interprété ou compilé pour les sites Internet.
Enfin, les programmes W pourront être appelés depuis d’autres
programmes, un peu comme un langage de plugins.
Deux utilitaires permettent de formatter le code source et de générer de
la documentation à partir de *tags* dans le code, au format
[DokuWiki](https://www.dokuwiki.org/dokuwiki).
Description du fonctionnement des [programmes](/w/prog) d’exécution et
compilation.
Pour démarrer, premier programme d’exemple :
``` w
; Le celebre Hello world en W
begin hello
echonl "Hello world !"
except
end
```
Voici la description complète du [langage W](/w/instr).
+14 -4
View File
@@ -316,11 +316,21 @@ static void formatage(Dynamic * s, Dynamic * f, int type)
// si pos_comment > -1 traiter le commentaire en fin de ligne, position multiple de 10 (par exemple), >= position actuelle
// + formatage debut de ligne
if(pos_comment == -1)
dynSubstr(&e, &trav, &lig, pos - 1, (long)trav.mPtr - pos, 1, DYN_NONE, 10, DYN_NONE);
{
#ifdef WINLIB
dynSubstr(&e, &trav, &lig, pos - 1, ((intptr_t)(trav.mPtr)) - pos, 1, DYN_NONE, 10, DYN_NONE);
#else
dynSubstr(&e, &trav, &lig, pos - 1, (long)(trav.mPtr - pos), 1, DYN_NONE, 10, DYN_NONE);
#endif
}
else
{
dynSubstr(&e, &trav, &lig, pos - 1, pos_comment - pos, 1, DYN_NONE, 10, DYN_NONE);
dynSubstr(&e, &trav, &tmp, pos_comment - 1, (long)trav.mPtr - pos_comment, 1, DYN_NONE, 10, DYN_NONE);
#ifdef WINLIB
dynSubstr(&e, &trav, &tmp, pos_comment - 1, ((intptr_t)(trav.mPtr)) - pos_comment, 1, DYN_NONE, 10, DYN_NONE);
#else
dynSubstr(&e, &trav, &tmp, pos_comment - 1, (long)(trav.mPtr - pos_comment), 1, DYN_NONE, 10, DYN_NONE);
#endif
}
//
if(flag_trt == 1)
@@ -382,7 +392,7 @@ int main(int argc, char * argv[])
type = 1; // par defaut formatage du source w
else if(argc != 3)
{
printf("Usage: wlf [-w|-wa] <source>\n");
printf("Usage: lwf [-w|-wa] <source>\n");
exit(-1);
}
else
@@ -394,7 +404,7 @@ int main(int argc, char * argv[])
type = 2; // formatage du pcode (fichier .wa) TODO
else
{
printf("Usage: wlf [-w|-wa] <source>\n");
printf("Usage: lwf [-w|-wa] <source>\n");
exit(-1);
}
}
+9 -2
View File
@@ -20,6 +20,9 @@
along with this program. If not, see <https://www.gnu.org/licenses/>.
********************************************** */
#ifdef WINLIB
#include "windows.h"
#endif
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
@@ -369,7 +372,7 @@ long variable(env * e, Dynamic * resultat, Dynamic * valex, Dynamic * tmp, Dynam
dynConcatSz(e, resultat, "PVAR ", 5);
dynConcat(e, resultat, encours);
dynConcatSz(e, resultat, "\n", 1);
dynLet(e, &dercode, "", 0);
if(*aGauche) dynLet(e, &dercode, "", 0); // si expr a droite, garder le <dercode> trouve a gauche
/* */
n++;
for(;;)
@@ -1132,7 +1135,7 @@ long parse(env * e, Dynamic * valex, Dynamic * resultat, Dynamic * tmp, Dynamic
}*/
}
/* */
//or(int i=1;i<=token.mLg/4;i++) printf("%d,",nreg(i)); printf("\n");
//if(numlig==112) {for(int i=1;i<=token.mLg/4;i++) printf("%d,",nreg(i)); printf("\n");}
/* debut d'analyse des tokens de la ligne de source w */
long aGauche = 0;
dynSetLen(e, encours, 0);
@@ -2681,7 +2684,11 @@ int main(int argc, char * argv[])
}
else
{
#ifdef WINLIB
if(lire_regles_lex(&e, &regles, "C:\\Users\\Poupougne42\\source\\repos\\win_w_src\\lex\\wlex") != DYN_OK) // A parametrer
#else
if(lire_regles_lex(&e, &regles, "/etc/wlanguage/wlex") != DYN_OK) // au lieu de lex/wlex
#endif
{
printf("Erreur d'acces aux regles lex de w '%s'\n", "wlex");
ret = -4;
-7
View File
@@ -54,13 +54,6 @@ int jsonInit(env * e, modContextJson * ctx);
int jsonEnd(env * e, modContextJson * ctx);
int jsonDecode(env * e, modContextJson * ctx, var * param1, var * param2, var * param3);
int jsonPrint(env * e, modContextJson * ctx, var * param1, var * param2, var * param3);
typedef struct {
var * KeyList, * CurrentKey, * Name, * Value, * DecodeCle, * DecodeValue; // Dynamic
var * KeyField, * KeyItem, * KeyCount, * ItemCount, * Id, * Parent, * IdKey, * ParentKey, * ValuePresent, * Begin; // Number
// output: Name Value IdKey IdParent ValuePresent
} treefetch; // contenu de la var hashtable passee en param
int jsonTreeFetch(env * e, modContextJson * ctx, var * param1, var * param2, var * param3);
/*
+2 -2
View File
@@ -156,12 +156,12 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
}
else if(strncmp(e->fn, "treeFetch", 9) == 0)
{
if(param1 == NULL)
if(param1 == NULL || param2 == NULL)
exc = EX_MODPARAM;
else
{
/* param1 must be a hash table (input) */
if(param1->type != VAR_HASHTABLE)
if(param1->type != VAR_HASHTABLE || param2->type != VAR_NUMBER)
exc = EX_MODPARAM; // bad type of parameter 1
else
exc = setError(p_etat, jsonTreeFetch(e, &p_etat->jsonCtx, param1, param2, param3));
+124 -42
View File
@@ -484,52 +484,83 @@ static int MakePrintable(env * e, modContextJson * ctx, var * DecodeBrut, var *
return OK;
}
/* NOT USED
static void InitTreeFetch()
{
GetNextTreeFetch(NULL, NULL, NULL, NULL, NULL);
}
*/
typedef struct {
var * KeyList, * CurrentKey, * Name, * Value, * DecodeCle, * DecodeValue; // Dynamic
var * KeyField, * KeyItem, * KeyCount, * ItemCount, * Id, * Parent, * IdKey, * ParentKey, * ValuePresent; // Number
// output: Name Value IdKey ParentKey ValuePresent
} treefetch; // contenu de la var hashtable passee en param
/*
static int GetNextTreeFetch(env * e, modContextJson * ctx, long * parentKey, long * idKey, Dynamic * name, Dynamic * value, int * valuePresent)
static int GetNextTreeFetch(env * e, treefetch * tree)
{
static Dynamic KeyList, CurrentKey; // hash entree
static long KeyField, KeyItem, KeyCount, ItemCount, id, parent; // hash entree
char ArrayMark = '#';
//
if(parentKey == NULL && idKey == NULL && name == NULL && value == NULL && valuePresent == NULL)
{
// InitTreeFetch
KeyList.DeleteAllContent();
KeyField = 1; // current field in mDecodeCle
KeyItem = 1; // current part of path of current field
mDecodeCle.SetSubFieldDelimiter(cSVM);
KeyCount = mDecodeCle.CountField();
ItemCount = mDecodeCle.CountSubField(KeyField);
id = 1;
parent = 0;
return true;
}
if(parentKey == nullptr || idKey == nullptr || name == nullptr || value == nullptr || valuePresent == nullptr)
return false; // security
//
if(KeyField == 0)
return false; // false = fini
//
if(tree->KeyField->num == 0)
return FALSE; // false = fini
// check here if empty json
if(KeyCount == 0 && ItemCount == 0)
if(tree->KeyCount->num == 0 && tree->ItemCount->num == 0)
{
// single value json
name->SetAs("#");
mDecodeValeur.ExtractField(1, *value, 1);
*parentKey = parent;
*idKey = id;
*valuePresent = true;
KeyField = 0;
return true;
dynLet(e, tree->Name, "#", 1);
dynField(e, tree->DecodeValue, tree->Value, 1, DYN_NONE, cVM, cSVM, 1);
tree->ParentKey->num = tree->Parent->num;
tree->IdKey->num = tree->Id->num;
tree->ValuePresent->num = NUM_UN;
tree->KeyField->num = 0;
return TRUE;
}
//
for(long pos;;)
{
if(tree->KeyItem->num == tree->ItemCount->num)
{
// value found
tree->ParentKey->num = tree->Parent->num;
tree->IdKey->num = tree->Id->num;
dynField(e, tree->DecodeCle, tree->Name, tree->KeyField->num, tree->KeyItem->num, cVM, cSVM, 1);
dynReplace(e, tree->Name, cTM, ArrayMark);
dynField(e, tree->DecodeValue, tree->Value, tree->KeyField->num, DYN_NONE, cVM, DYN_NONE, 1);
tree->ValuePresent->num = TRUE; // means send a value
// prepare next call
if(tree->KeyField->num >= tree->KeyCount->num)
tree->KeyField->num = 0;
else
{
tree->Id->num++;
tree->Parent->num = 0;
tree->KeyField->num++;
tree->KeyItem->num = 1;
tree->ItemCount->num = dynDcount(e, tree->DecodeCle, cSVM, tree->KeyField->num, cVM);
}
return TRUE;
}
dynField(e, tree->DecodeCle, tree->CurrentKey, tree->KeyField->num, 1, cVM, cSVM, tree->KeyItem->num);
pos = dynLocateSz(e, tree->KeyList, tree->CurrentKey->mPtr, cVM, 1, cFM);
if(pos < 1)
{
// new path
dynIns(e, tree->KeyList, 1, 1, tree->CurrentKey, cFM, cVM);
dynInsNumber(e, tree->KeyList, 2, 1, tree->Id->num, cFM, cVM);
// part of path found
tree->ParentKey->num = tree->Parent->num;
tree->IdKey->num = tree->Id->num;
dynField(e, tree->DecodeCle, tree->Name, tree->KeyField->num, tree->KeyItem->num, cVM, cSVM, 1);
dynReplace(e, tree->Name, cTM, ArrayMark);
tree->ValuePresent->num = NUM_ZERO; // means no value here (part of path)
// prepare next call
tree->Parent->num = tree->Id->num++;
tree->KeyItem->num++;
//
return TRUE;
}
// loop to next part of path
dynExtractSubField(e, tree->KeyList, 2, pos, tree->Parent);
tree->KeyItem->num++;
}
//
return TRUE; //ok, but should never reach this point...
}
/*
for(long pos;;)
{
if(KeyItem == ItemCount)
@@ -577,9 +608,7 @@ static int GetNextTreeFetch(env * e, modContextJson * ctx, long * parentKey, lon
KeyList.ExtractSubField(2, pos, parent);
KeyItem++;
}
//
return true; //ok, but should never reach this point...
}*/
*/
/* =================== PUBLIC ========================== */
int jsonInit(env * e, modContextJson * ctx)
@@ -634,8 +663,61 @@ int jsonPrint(env * e, modContextJson * ctx, var * param1, var * param2, var * p
int jsonTreeFetch(env * e, modContextJson * ctx, var * param1, var * param2, var * param3)
{
// KeyList, CurrentKey, Name, Value, DecodeCle, DecodeValue; // Dynamic
// KeyField, KeyItem, KeyCount, ItemCount, Id, Parent, IdKey, ParentKey, ValuePresent, Begin; // Number
treefetch tree;
// KeyField, KeyItem, KeyCount, ItemCount, Id, Parent, IdKey, ParentKey, ValuePresent; // Number
treefetch tree; // contexte specifique a chaque appel
//
hashtable_do(e, HASH_READ, param1, copy_nom(e, "DecodeCle"), &tree.DecodeCle);
hashtable_do(e, HASH_READ, param1, copy_nom(e, "DecodeValue"), &tree.DecodeValue);
if(tree.DecodeCle == NULL || tree.DecodeValue == NULL)
{
param2->num = NUM_UN;
return OK; // TODO erreur
}
//
hashtable_do(e, HASH_READ, param1, copy_nom(e, "KeyList"), &tree.KeyList);
if(tree.KeyList == NULL)
{
// init vars
var * v = &e->int_dynamic;
dynSetLen(e, &e->int_dynamic, 0);
hashtable_do(e, HASH_WRITE, param1, copy_nom(e, "KeyList"), &v);
hashtable_do(e, HASH_WRITE, param1, copy_nom(e, "CurrentKey"), &v);
hashtable_do(e, HASH_WRITE, param1, copy_nom(e, "Name"), &v);
hashtable_do(e, HASH_WRITE, param1, copy_nom(e, "Value"), &v);
v = &e->int_number;
v->num = 1;
hashtable_do(e, HASH_WRITE, param1, copy_nom(e, "KeyField"), &v);
hashtable_do(e, HASH_WRITE, param1, copy_nom(e, "KeyItem"), &v);
hashtable_do(e, HASH_WRITE, param1, copy_nom(e, "Id"), &v);
v->num = 0;
hashtable_do(e, HASH_WRITE, param1, copy_nom(e, "Parent"), &v);
v->num = dynDcount(e, tree.DecodeCle, cVM, DYN_NONE, DYN_NONE);
hashtable_do(e, HASH_WRITE, param1, copy_nom(e, "KeyCount"), &v);
v->num = dynDcount(e, tree.DecodeCle, cSVM, 1, cVM);
hashtable_do(e, HASH_WRITE, param1, copy_nom(e, "ItemCount"), &v);
hashtable_do(e, HASH_WRITE, param1, copy_nom(e, "IdKey"), &v);
hashtable_do(e, HASH_WRITE, param1, copy_nom(e, "ParentKey"), &v);
hashtable_do(e, HASH_WRITE, param1, copy_nom(e, "ValuePresent"), &v);
}
hashtable_do(e, HASH_READ, param1, copy_nom(e, "KeyList"), &tree.KeyList);
hashtable_do(e, HASH_READ, param1, copy_nom(e, "CurrentKey"), &tree.CurrentKey);
hashtable_do(e, HASH_READ, param1, copy_nom(e, "Name"), &tree.Name);
hashtable_do(e, HASH_READ, param1, copy_nom(e, "Value"), &tree.Value);
//
hashtable_do(e, HASH_READ, param1, copy_nom(e, "KeyField"), &tree.KeyField);
hashtable_do(e, HASH_READ, param1, copy_nom(e, "KeyItem"), &tree.KeyItem);
hashtable_do(e, HASH_READ, param1, copy_nom(e, "KeyCount"), &tree.KeyCount);
hashtable_do(e, HASH_READ, param1, copy_nom(e, "ItemCount"), &tree.ItemCount);
hashtable_do(e, HASH_READ, param1, copy_nom(e, "Id"), &tree.Id);
hashtable_do(e, HASH_READ, param1, copy_nom(e, "Parent"), &tree.Parent);
hashtable_do(e, HASH_READ, param1, copy_nom(e, "IdKey"), &tree.IdKey);
hashtable_do(e, HASH_READ, param1, copy_nom(e, "ParentKey"), &tree.ParentKey);
hashtable_do(e, HASH_READ, param1, copy_nom(e, "ValuePresent"), &tree.ValuePresent);
/* */
//hashtable_printdebug(e, param1, 1);
if(GetNextTreeFetch(e, &tree)) // TRUE = pas fini
param2->num = NUM_ZERO; // var <fin>
else
param2->num = NUM_UN;
return OK;
}
+16 -7
View File
@@ -20,7 +20,7 @@
along with this program. If not, see <https://www.gnu.org/licenses/>.
********************************************** */
#ifndef UNIX
#ifdef WINLIB
#include "windows.h"
#endif
#include <stdlib.h> /* pour etre ok en 32/64 bits (pointeurs) */
@@ -2644,10 +2644,10 @@ void instr_trace(env * e)
char * l = libInstr + e->instr * 4;
if(e->fin - e->debut > 9999)
printf("[%08d-%08d-%08d ex %08d] %c%c%c%c line %06lld ex-ex %04lld\n", (ent32)(e->debut - e->debutProg), (ent32)(e->si - 1 - e->debutProg),
(ent32)(e->fin - e->debutProg), (ent32)(e->si_except - e->debutProg), *l, *(l+1), *(l+2), *(l+3), e->ligsrc, e->except_ex);
(ent32)(e->fin - e->debutProg), (ent32)(e->si_except - e->debutProg), *l, *(l+1), *(l+2), *(l+3), e->ligsrc + (e->instr == IN_SRCL ? 1 : 0), e->except_ex);
else
printf("[%04d-%04d-%04d ex %04d] %c%c%c%c line %06lld ex-ex %04lld\n", (ent32)(e->debut - e->debutProg), (ent32)(e->si - 1 - e->debutProg),
(ent32)(e->fin - e->debutProg), (ent32)(e->si_except - e->debutProg), *l, *(l+1), *(l+2), *(l+3), e->ligsrc, e->except_ex);
(ent32)(e->fin - e->debutProg), (ent32)(e->si_except - e->debutProg), *l, *(l+1), *(l+2), *(l+3), e->ligsrc + (e->instr == IN_SRCL ? 1 : 0), e->except_ex);
/* */
switch(e->instr)
{
@@ -4648,13 +4648,18 @@ void instr_071(env * e)
}
else
dynSetLen(e, v, 0); /* raz */
memset(v->mPtr, 0, 25); /* pour que strlen ok plus loin */
/* */
var * item;
//hashtable_printdebug(e, e->ad_var, 1);
int cr;
while((cr = hashtable_next(e, e->ad_var, v->mPtr, &item)))
if(v->mPtr[0] == '_')
for(var * item;;)
{
memset(v->mPtr, 0, 25); /* pour que strlen ok plus loin */
cr = hashtable_next(e, e->ad_var, v->mPtr, &item);
if(cr && v->mPtr[0] == '_')
continue; /* ne pas prendre les vars commencant par _ */
else
break;
}
if(cr)
{
v->mLg = strlen(v->mPtr);
@@ -6617,7 +6622,11 @@ int CreateContext(env ** ctx, int useSignal, int argc, char *argv[])
else
{
/* lire les commandes lex pour le mode debug */
#ifdef WINLIB
if(lire_regles_lex(e, &e->debugreglelex, "C:\\Users\\Poupougne42\\source\\repos\\win_w_src\\lex\\debuglex") == DYN_OK) // a parametrer
#else
if(lire_regles_lex(e, &e->debugreglelex, "/etc/wlanguage/debuglex") == DYN_OK) // au lieu de lex/debuglex
#endif
init_reg(e, &e->debugreglelex, &e->debugcmd); // e->debugcmd sert de var tmp ici
/* ajout */
var * v = &e->int_dynamic;
+91 -2
View File
@@ -166,12 +166,19 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
if(flagCapturing && exc == OK)
{
dynSetLen(e, param3, 0);
#ifdef WINLIB
if (!GetTempPathA(param3->mLgmax, param3->mPtr))
exc = EXMOD_SYSTEM_FICTMP;
else if(!GetTempFileNameA(param3->mPtr, "tmp", 0, e->int_dynamic.mPtr))
exc = EXMOD_SYSTEM_FICTMP;
#else
int fd; // pour avoir un nom de fichier temporaire
dynLet(e, &e->int_dynamic, "/tmp/cap_XXXXXX", 15);
if((fd = mkstemp(e->int_dynamic.mPtr)) == -1)
exc = EXMOD_SYSTEM_FICTMP;
else
close(fd);
#endif
}
if(exc == OK)
{
@@ -180,6 +187,7 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
dynIns(e, &e->int_dynamic, 1, DYN_NONE, param3, '>', DYN_NONE);
cr = system(param1->mPtr);
dynRead(e, param3, e->int_dynamic.mPtr);
// TODO : purge fichier temp ?
}
else
{
@@ -226,12 +234,27 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
exc = EX_MODPARAM;
else
{
#ifdef WINLIB
// verifier si existe avec getenv, si oui erreur
char * varenv = getenv(param1->mPtr);
if(varenv)
{
exc = EXMOD_SYSTEM_SETENV;
setError(p_etat, exc);
}
else if (!SetEnvironmentVariableA(param1->mPtr, param2->mPtr))
{
exc = EXMOD_SYSTEM_SETENV;
setError(p_etat, exc);
}
#else
int cr = setenv(param1->mPtr, param2->mPtr, 0); // 1 = overwrite, 0 = ne pas ecraser si existe
if(cr != 0)
{
exc = EXMOD_SYSTEM_SETENV;
setError(p_etat, cr);
}
#endif
}
}
/* ----------------------------------------------------------------------------------------------- */
@@ -246,12 +269,20 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
exc = EX_MODPARAM;
else
{
#ifdef WINLIB
if (!SetEnvironmentVariableA(param1->mPtr, param2->mPtr))
{
exc = EXMOD_SYSTEM_SETENV;
setError(p_etat, exc);
}
#else
int cr = setenv(param1->mPtr, param2->mPtr, 1); // 1 = overwrite, 0 = ne pas ecraser si existe
if(cr != 0)
{
exc = EXMOD_SYSTEM_SETENV;
setError(p_etat, cr);
}
#endif
}
}
/* ----------------------------------------------------------------------------------------------- */
@@ -264,12 +295,20 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
exc = EX_MODPARAM;
else
{
#ifdef WINLIB
if (!SetEnvironmentVariableA(param1->mPtr, NULL))
{
exc = EXMOD_SYSTEM_SETENV;
setError(p_etat, exc);
}
#else
int cr = unsetenv(param1->mPtr); // suppression
if(cr != 0)
{
exc = EXMOD_SYSTEM_UNSETENV;
setError(p_etat, cr);
}
#endif
}
}
/* ----------------------------------------------------------------------------------------------- */
@@ -281,6 +320,9 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
exc = EX_MODPARAM;
else
{
#ifdef WINLIB
dynLet(e, param1, "Windows", DYN_LGNONE);
#else
struct utsname name;
int lg;
if(uname(&name) == 0)
@@ -295,6 +337,7 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
exc = EXMOD_SYSTEM_UNAME;
setError(p_etat, errno);
}
#endif
}
}
/* ----------------------------------------------------------------------------------------------- */
@@ -308,6 +351,48 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
exc = EX_MODPARAM;
else
{
#ifdef WINLIB
DWORD size = param1->mLgmax;
if (!GetComputerNameA(param1->mPtr, &size))
{
exc = EXMOD_SYSTEM_GETHOST;
setError(p_etat, errno);
}
else
{
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
{
exc = EXMOD_SYSTEM_GETHOST;
setError(p_etat, errno);
}
else
{
if (gethostname(param2->mPtr, param2->mLgmax) == SOCKET_ERROR)
{
WSACleanup();
exc = EXMOD_SYSTEM_GETHOST;
setError(p_etat, errno);
}
else
{
struct hostent * host_entry;
host_entry = gethostbyname(param2->mPtr);
if (host_entry == NULL)
{
WSACleanup();
exc = EXMOD_SYSTEM_GETHOST;
setError(p_etat, errno);
}
else
{
dynLet(e, param2, inet_ntoa(*(struct in_addr*)host_entry->h_addr_list[0]), DYN_LGNONE);
WSACleanup();
}
}
}
}
#else
struct utsname name;
int lg;
if(uname(&name) == 0)
@@ -335,6 +420,7 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
setError(p_etat, errno);
exc = EXMOD_SYSTEM_UNAME;
}
#endif
}
}
/* ----------------------------------------------------------------------------------------------- */
@@ -382,8 +468,11 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
/* ----------------------------------------------------------------------------------------------- */
else if(strncmp(e->fn, "sleep", 5) == 0)
{
#ifndef UNIX
// faire differemment sous windows : pas de sleep dispo ?
#ifdef WINLIB
if(param1->type != VAR_NUMBER)
exc = EX_MODPARAM;
// duree attente envoyee en secondes
Sleep(param1->num * 1000 / NUM_FACTEUR); // en millisec.
#else
if(param1->type != VAR_NUMBER)
exc = EX_MODPARAM;
+3
View File
@@ -20,6 +20,9 @@
along with this program. If not, see <https://www.gnu.org/licenses/>.
********************************************** */
#ifdef WINLIB
#include "windows.h"
#endif
#include <stdlib.h>
#include <stdio.h>
#include <time.h>