Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3ae1e8c019 | ||
|
|
31acb7939d |
No files matched your search
@@ -30,6 +30,9 @@ 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
|
||||
```
|
||||
|
||||
@@ -40,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://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).
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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, ®les, "C:\\Users\\Poupougne42\\source\\repos\\win_w_src\\lex\\wlex") != DYN_OK) // A parametrer
|
||||
#else
|
||||
if(lire_regles_lex(&e, ®les, "/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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
/*
|
||||
|
||||
@@ -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
@@ -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;
|
||||
}
|
||||
@@ -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
@@ -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;
|
||||
|
||||
Reference in new issue
Block a user