Author SHA1 Message Date
fred 3384b0df85 feat: arg management in lw lwa lwc 2025-11-16 18:24:08 +01:00
fred fcb62ff71c eat: pdfMod + gestion des arguments en ligne de commande 2025-11-16 16:40:04 +01:00
fred 0871ed56fc WIP divers / shm 2025-10-25 18:42:27 +02:00
fred a6f8d2aefa WIP 2025-09-28 17:56:10 +02:00
fred ba010944e2 WIP fn mod, shmMod 2025-09-28 17:36:18 +02:00
fred 2b076ebd18 WIP pdfMod + revoir le test des fonctions 2025-09-27 21:20:21 +02:00
fred 7cdd94920e WIP modPdf 2025-09-14 19:46:07 +02:00
31 changed files with 1435 additions and 624 deletions

No files matched your search

+51
View File
@@ -0,0 +1,51 @@
#define ARG_DEBUG "d"
#define ARG_TRACE "t"
#define ARG_DISASM "d"
void GetArgs(env * e, int argc, char * argv[], Dynamic * arg)
{
int nbOpt = 0, cpt = 0;
dynSetLen(e, arg, 0);
for(int a = 1; a < argc; a++)
{
if(strcmp(argv[a], "-" ARG_DEBUG) == 0)
dynStoreSz(e, arg, 1, ++nbOpt, ARG_DEBUG, 1, cFM, cVM);
else if(strcmp(argv[a], "-" ARG_TRACE) == 0)
dynStoreSz(e, arg, 1, ++nbOpt, ARG_TRACE, 1, cFM, cVM);
else if(strncmp(argv[a], "-WBIN:", 6) == 0 && strlen(argv[a]) > 6)
dynStoreSz(e, arg, 3, DYN_NONE, &argv[a][6], DYN_LGNONE, cFM, DYN_NONE); // memo (.o .so)
else if(strncmp(argv[a], "-WLIB:", 6) == 0 && strlen(argv[a]) > 6)
dynStoreSz(e, arg, 5, DYN_NONE, &argv[a][6], DYN_LGNONE, cFM, DYN_NONE); // memo (.wp .wa)
else if(strncmp(argv[a], "-WSRC:", 6) == 0 && strlen(argv[a]) > 6)
dynStoreSz(e, arg, 4, DYN_NONE, &argv[a][6], DYN_LGNONE, cFM, DYN_NONE); // memo (.w)
else if(strncmp(argv[a], "-", 1) == 0)
; // argument inconnu, ignorer
else
{
// premier argument ne commencant pas par "-" : nom du prog wp
for( ; a < argc; a++)
dynStoreSz(e, arg, 2, ++cpt, argv[a], DYN_LGNONE, cFM, cVM);
break;
}
}
if(dynExtractPos(e, arg, 3, DYN_NONE, cFM, DYN_NONE) <= 0)
{
dynStoreSz(e, arg, 3, DYN_NONE, getenv("WBIN"), DYN_LGNONE, cFM, DYN_NONE); // si absent en ligne de cmd, lire de la var d'env
if(dynExtractPos(e, arg, 3, DYN_NONE, cFM, DYN_NONE) <= 0)
dynStoreSz(e, arg, 3, DYN_NONE, getenv("LD_LIBRARY_PATH"), DYN_LGNONE, cFM, DYN_NONE); // dernier recours...
}
//
if(dynExtractPos(e, arg, 5, DYN_NONE, cFM, DYN_NONE) <= 0)
dynStoreSz(e, arg, 5, DYN_NONE, getenv("WLIB"), DYN_LGNONE, cFM, DYN_NONE); // si absent en ligne de cmd, lire de la var d'env
//
if(dynExtractPos(e, arg, 4, DYN_NONE, cFM, DYN_NONE) <= 0)
dynStoreSz(e, arg, 4, DYN_NONE, getenv("WSRC"), DYN_LGNONE, cFM, DYN_NONE); // si absent en ligne de cmd, lire de la var d'env
/*
arg<1> = options en MV
arg<2> = prog et parametres en MV
arg<3> = WBIN (.o .so) => invoke, LD_LIBRARY_PATH
arg<4> = WSRC (.w) => lwc
arg<5> = WLIB (.wp .wa) => call, lwa lwc
*/
}
+44 -40
View File
@@ -31,6 +31,7 @@
#include "langage.h"
#include "dynamic.h"
#include "instr.h"
#include "arg.c"
env e;
@@ -748,23 +749,7 @@ int assembler(env * e, char * fichier, int * cptLig)
//
if(!ret)
{
// si pas d'erreur : copier dans le repertoire WBIN en renommant "xxx.wa" en "xxx.wp"
//char * wbin = getenv("WBIN");
//if(wbin == NULL)
// wbin = getenv("LD_LIBRARY_PATH");
//if(wbin == NULL)
//{
// ret = -11;
//}
//else
//{
// dynLet(e, &tmp, wbin, DYN_LGNONE);
// dynConcatSz(e, &tmp, e->path_sep, DYN_LGNONE);
// dynConcatSz(e, &tmp, fichier, DYN_LGNONE);
// tmp.mPtr[tmp.mLg - 1] = 'p';
// dynWrite(e, &pcode, tmp.mPtr);
//}
// ecrire au meme endroit que le .w et .wa
// si pas d'erreur, ecrire au meme endroit que le .wa (=> dans WLIB)
dynLet(e, &tmp, fichier, DYN_LGNONE);
tmp.mPtr[tmp.mLg - 1] = 'p';
dynWrite(e, &pcode, tmp.mPtr);
@@ -1255,13 +1240,14 @@ int disassembler(env * e, char * fichier)
dynFree(e, &tmp);
dynFree(e, &varsys);
dynFree(e, &niv);
return 0;
return OK;
}
/* ***************************************************************************************************** */
int main(int argc, char * argv[])
{
int cr = 0;
int cr = OK;
Dynamic arg, wlib, fichier;
/* */
/* avis de licence */
printf("W language Copyright 2024,2025 lanisys.fr\n");
@@ -1269,7 +1255,7 @@ int main(int argc, char * argv[])
/* argument : fichier a assembler/desassembler (si -d) */
if(argc < 2)
{
printf("Usage: lwa [-d] <fichier>\n");
printf("Usage: lwa [-d] [-WLIB:<chemin>] <fichier.wa|fichier.wp>\n");
exit(-1);
}
/* */
@@ -1279,40 +1265,58 @@ int main(int argc, char * argv[])
lap = ts.tv_sec * 1000000 + (ts.tv_nsec / 1000);
/* */
init_env(&e);
dynInit(&e, &arg, 0);
dynInit(&e, &wlib, 0);
dynInit(&e, &fichier, 0);
/* */
if(strcmp(argv[1], "-d") == 0)
GetArgs(&e, argc, argv, &arg);
dynExtractField(&e, &arg, 5, &wlib);
dynExtractSubField(&e, &arg, 2, 1, &fichier); // fichier = .wa a assembler / .wp a desassembler
/* */
if(fichier.mLg < 4)
{
if(argc >= 3)
{
#ifndef UNIX
cr = disassembler(&e, argv[2]);
#else
cr = disassembler(&e, argv[2]);
#endif
}
else
printf("Usage: lwa -d <fichier>\n");
printf("Nom de fichier incorrect\n");
cr = -14;
}
else if(wlib.mLg == 0)
{
printf("Variable d'environnement WLIB non definie\n");
cr = -15;
}
else
{
int numLig = 0;
#ifndef UNIX
if((cr = assembler(&e, argv[1], &numLig)) != OK)
#else
if((cr = assembler(&e, argv[1], &numLig)) != OK)
#endif
if(wlib.mPtr[wlib.mLg - 1] != e.path_sep[0])
dynConcatSz(&e, &wlib, e.path_sep, 1);
dynConcat(&e, &wlib, &fichier);
if(dynLocateSz(&e, &arg, ARG_DISASM, cVM, 1, cFM) > 0)
{
printf("Erreur %d a la ligne %d\n", cr, numLig);
#ifndef UNIX
cr = disassembler(&e, wlib.mPtr);
#else
cr = disassembler(&e, wlib.mPtr);
#endif
}
else
{
printf("Result : OK, lines=%d\n", numLig);
int numLig = 0;
#ifndef UNIX
if((cr = assembler(&e, wlib.mPtr, &numLig)) != OK)
#else
if((cr = assembler(&e, wlib.mPtr, &numLig)) != OK)
#endif
{
printf("Erreur %d a la ligne %d\n", cr, numLig);
}
else
{
printf("Result : OK, lines=%d\n", numLig);
}
}
}
/* */
if(clock_gettime_monotonic(&ts) != -1)
lap = ts.tv_sec * 1000000 + (ts.tv_nsec / 1000) - lap;
printf("exit:%u ", cr);
printf("exit:%d ", cr);
if(lap < 1500)
printf("(%llu µs)\n", lap);
else if(lap < 1500000)
+201
View File
@@ -0,0 +1,201 @@
/* **********************************************
__ __ __
\ \/ \/ / W language
\ /\ /
\/ \/ Copyright 2024,2025 lanisys.fr
This file is part of W language.
W language is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version (GPL-3.0-or-later).
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
********************************************** */
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "langage.h"
#include "var.h"
#include "buffer.h"
#include "dynamic.h"
/*
Dans le contexte des IPC, memoire partagee, contenant un buffer (donc partagé), le champ "ptr" pointe forcement a la suite de l'entete,
car un malloc ne fonctionne pas en inter process.
Contrairement à la création avec "var_init", destiné a ne pas etre partage, ptr est créé par un malloc
La macro BUFPTR permet de gerer ces 2 cas : si le buffer est en memoire partagee, le champ ptr = NULL et il suffit alors d'aller juste apres l'entete
pour trouver les donnees. Si le buffer est cree avec var_init, il faut utiliser la valeur de ptr directement.
*/
#define BUFPTR(x) (pointeur)(x->ptr == NULL ? (pointeur)(x + sizeof(var)) : x->ptr)
void buffer_read(env * e, var * varbuf, var * v)
{
ent16 lg, lgfin; /* taille max d'un element dans un buffer : 64 Ko */
ent64 p;
if(varbuf == NULL || v == NULL)
return;
if(varbuf->type != VAR_BUFFER)
return;
/* uniquement lecture dans VAR_DYNAMIC : raz var sinon */
if(v->type == VAR_PARAM)
v = (var *)v->ptr; /* travailler avec la var pointee ! */
if(v->type != VAR_DYNAMIC)
{
var_free(e, v, TRUE);
var_init(e, v, VAR_DYNAMIC, 0, 0, NULL);
if(v->type == VAR_NULL)
{
/* erreur alloc memoire */
e->exception = EX_MEM;
return;
}
}
dynLet(e, v, NULL, DYN_LGNONE);
if(varbuf->read == varbuf->write)
return; /* buffer vide : var dynamic vide aussi */
/* */
p = varbuf->read;
lg = *(octet *)(BUFPTR(varbuf) + p++) * 256;
if(p >= varbuf->lgmax) p = 0;
lg += *(octet *)(BUFPTR(varbuf) + p++);
if(p >= varbuf->lgmax) p = 0;
if(lg > 0)
{
if(dynCtrl(e, v, lg, TRUE) != DYN_OK) /* avec RAZ */
return;
/* */
if(lg <= (lgfin = varbuf->lgmax - p))
{
/* copier un seul bloc */
memcopie(v->ptr, BUFPTR(varbuf) + p, lg);
//memcpy(v->ptr, varbuf->ptr + p, lg);
v->lg = lg;
*(v->ptr + lg) = 0; /* \0 de fin de chaine */
if(p + lg >= varbuf->lgmax)
varbuf->read = 0; /* cela ne peut pas etre plus loin, car sinon il y aurait eu 2 blocs a lire */
else
varbuf->read = p + lg;
}
else
{
/* 2 blocs */
memcopie(v->ptr, BUFPTR(varbuf) + p, lgfin);
//memcpy(v->ptr, varbuf->ptr + p, lgfin);
memcopie(v->ptr + lgfin, BUFPTR(varbuf), lg - lgfin);
//memcpy(v->ptr + lgfin, varbuf->ptr, lg - lgfin);
varbuf->read = lg - lgfin;
}
}
else
varbuf->read = p;
}
void buffer_write(env * e, var * varbuf, var * v)
{
ent64 p, lgfin;
if(varbuf == NULL || v == NULL)
return;
if(v->type == VAR_PARAM)
v = (var *)v->ptr; /* travailler avec la var pointee ! */
if(varbuf->type != VAR_BUFFER || v->type != VAR_DYNAMIC)
return;
/* uniquement ecriture d'une VAR_DYNAMIC */
if(v->lg > (varbuf->lgmax / 2)) // pour pouvoir ecrire au moins 2 items dans le buffer
{
e->exception = EX_BUFOVF; /* trop grand a ecrire */
return;
}
ent64 vbread = varbuf->read;
if(varbuf->write < vbread)
{
/* ecriture en une fois, + 3 car lg sur 16 bits en plus et laisser au moins 1 octet libre => read=write veut dire vide ! */
if(vbread - varbuf->write < v->lg + 3)
{
e->exception = EX_BUFOVF; /* pas assez de place */
return;
}
/* */
p = varbuf->write;
*(BUFPTR(varbuf) + p) = (v->lg & 65535) >> 8;
p++;
*(BUFPTR(varbuf) + p) = v->lg & 255;
p++;
memcopie(BUFPTR(varbuf) + p, v->ptr, v->lg);
//memcpy(varbuf->ptr + p, v->ptr, v->lg);
varbuf->write = p + v->lg;
}
else
{
/* ecriture en une ou 2 fois */
if(varbuf->lgmax + vbread - varbuf->write < v->lg + 3) /* lgbuffer - (write - read) */
{
e->exception = EX_BUFOVF; /* pas assez de place */
return;
}
p = varbuf->write;
*(BUFPTR(varbuf) + p) = (v->lg & 65535) >> 8;
p++;
if(p >= varbuf->lgmax) p = 0;
*(BUFPTR(varbuf) + p) = v->lg & 255;
p++;
if(p >= varbuf->lgmax) p = 0;
if(v->lg == 0)
{
varbuf->write = p;
return;
}
if(v->lg <= (lgfin = varbuf->lgmax - p))
{
/* copier en une fois */
memcopie(BUFPTR(varbuf) + p, v->ptr, v->lg);
//memcpy(varbuf->ptr + p, v->ptr, v->lg);
if(p + v->lg >= varbuf->lgmax)
varbuf->write = 0; /* pas plus cas sinon il y aurait eu copie en 2 fois */
else
varbuf->write = p + v->lg;
}
else
{
/* en 2 fois */
memcopie(BUFPTR(varbuf) + p, v->ptr, lgfin);
//memcpy(varbuf->ptr + p, v->ptr, lgfin);
memcopie(BUFPTR(varbuf), v->ptr + lgfin, v->lg - lgfin);
//memcpy(varbuf->ptr, v->ptr + lgfin, v->lg - lgfin);
varbuf->write = v->lg - lgfin;
}
}
}
void buffer_clear(env * e, var * varbuf)
{
if(varbuf == NULL)
return;
if(varbuf->type != VAR_BUFFER)
return;
varbuf->read = 0;
varbuf->write = 0;
memset(BUFPTR(varbuf), 0, varbuf->lgmax);
}
void buffer_printdebug(env * e, var * varbuf, ent32 lg)
{
if(varbuf == NULL)
return;
if(varbuf->type != VAR_BUFFER)
return;
printf("buffer lgmax=%lld read=%lld write=%lld\n", varbuf->lgmax, varbuf->read, varbuf->write);
if(lg == 0)
lg = varbuf->lgmax;
/* affichage brut en hexa */
hex2((char *)BUFPTR(varbuf), lg, 32);
}
+33
View File
@@ -0,0 +1,33 @@
/* **********************************************
__ __ __
\ \/ \/ / W language
\ /\ /
\/ \/ Copyright 2024,2025 lanisys.fr
This file is part of W language.
W language is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version (GPL-3.0-or-later).
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
********************************************** */
#ifndef BUFFER_H
#define BUFFER_H
void buffer_read(env * e, var * varbuf, var * v);
void buffer_write(env * e, var * varbuf, var * v);
void buffer_clear(env * e, var * varbuf);
void buffer_printdebug(env * e, var * varbuf, ent32 lg);
/* ********************************************** */
#endif
+8 -3
View File
@@ -2,10 +2,11 @@ echo 0. Compilation pour shared lib
gcc -c w_src/dynamic.c -s -Wall -DUNIX -m64 -fPIC -o exec/dynamic.o -Wno-unused-value
gcc -c w_src/var.c -s -Wall -DUNIX -m64 -fPIC -o exec/var.o
gcc -c w_src/hashtable.c -s -Wall -DUNIX -m64 -fPIC -o exec/hashtable.o
gcc -c w_src/buffer.c -s -Wall -DUNIX -m64 -fPIC -o exec/buffer.o
gcc -c w_src/global.c -s -Wall -DUNIX -m64 -fPIC -o exec/global.o
gcc -c w_src/rep.c -s -Wall -DUNIX -m64 -fPIC -o exec/rep.o
gcc -shared -s exec/dynamic.o exec/var.o exec/hashtable.o exec/global.o exec/rep.o -o exec/libw.so
rm -f exec/dynamic.o exec/var.o exec/hashtable.o exec/global.o exec/rep.o
gcc -shared -s exec/dynamic.o exec/var.o exec/hashtable.o exec/global.o exec/rep.o exec/buffer.o -o exec/libw.so
rm -f exec/dynamic.o exec/var.o exec/hashtable.o exec/global.o exec/rep.o exec/buffer.o
echo 1. Compilation de modeleMod.c
gcc -shared -s -o exec/modele.o w_src/modeleMod.c -m64 -DUNIX -Wall -fPIC -L./exec -l:libw.so
@@ -26,12 +27,16 @@ gcc -shared -s -o exec/lzw.o w_src/lzwMod.c -m64 -DUNIX -Wall -fPIC -L./exec -l:
echo 5. Compilation de pdfMod.c
gcc -shared -s -o exec/pdf_lib.o w_src/pdf_lib.c -m64 -DUNIX -Wall -fPIC -L./exec -l:libw.so
#gcc -shared -s -o exec/pdf.o w_src/pdfMod.c -m64 -DUNIX -Wall -fPIC -L./exec -l:libw.so -l:pdf_lib.o
gcc -shared -s -o exec/pdf.o w_src/pdfMod.c -m64 -DUNIX -Wall -fPIC -L./exec -l:libw.so -l:pdf_lib.o -l:lzw_lib.o
echo 6. Compilation de jsonMod.c
gcc -shared -s -o exec/json_lib.o w_src/json_lib.c -m64 -DUNIX -Wall -fPIC -L./exec -l:libw.so
gcc -shared -s -o exec/json.o w_src/jsonMod.c -m64 -DUNIX -Wall -fPIC -L./exec -l:libw.so -l:json_lib.o
echo 6. Compilation de shmMod.c
gcc -shared -s -o exec/shm_lib.o w_src/shm_lib.c -m64 -DUNIX -Wall -fPIC -L./exec -l:libw.so
gcc -shared -s -o exec/shm.o w_src/shmMod.c -m64 -DUNIX -Wall -fPIC -L./exec -l:libw.so -l:shm_lib.o
echo 7. Compilation de timeMod.c
gcc -shared -s -o exec/time.o w_src/timeMod.c -m64 -DUNIX -Wall -fPIC -L./exec -l:libw.so
+8 -2
View File
@@ -9,11 +9,12 @@ echo 0. Compilation pour static lib
cl /c /Foexec\dynamic.obj w_src\dynamic.c
cl /c /Foexec\var.obj w_src\var.c
cl /c /Foexec\hashtable.obj w_src\hashtable.c
cl /c /Foexec\buffer.obj w_src\buffer.c
cl /c /Foexec\global.obj w_src\global.c
cl /c /Foexec\rep.obj w_src\rep.c
lib /OUT:exec\libw.lib exec\dynamic.obj exec\var.obj exec\hashtable.obj exec\global.obj exec\rep.obj
lib /OUT:exec\libw.lib exec\dynamic.obj exec\var.obj exec\hashtable.obj exec\global.obj exec\rep.obj exec\buffer.obj
echo ------------------------------------------------------------------------
echo 1a. Compilation de modeleMod.c
@@ -55,8 +56,13 @@ echo ------------------------------------------------------------------------
echo 1h. Compilation de pdfMod.c
cl /c /Foexec\pdf_lib.obj w_src\pdf_lib.c
lib /OUT:exec\pdf_lib.lib exec\pdf_lib.obj
rem cl w_src\pdfMod.c exec\libw.lib exec\pdf_lib.lib /Foexec\pdfMod.obj /DWINLIB /link /DLL /OUT:exec\pdf.dll
cl w_src\pdfMod.c exec\libw.lib exec\pdf_lib.lib exec\lzw_lib.lib /Foexec\pdfMod.obj /DWINLIB /link /DLL /OUT:exec\pdf.dll
echo ------------------------------------------------------------------------
echo 1i. Compilation de shmMod.c
cl /c /Foexec\shm_lib.obj w_src\shm_lib.c /DWINLIB
lib /OUT:exec\shm_lib.lib exec\shm_lib.obj
cl w_src\shmMod.c exec\libw.lib exec\shm_lib.lib /Foexec\shmMod.obj /DWINLIB /link /DLL /OUT:exec\shm.dll
echo ------------------------------------------------------------------------
echo 2. Compilation langage lw (ws2_32.lib pour socket)
+8 -8
View File
@@ -2,7 +2,7 @@
__ __ __
\ \/ \/ / W language
\ /\ /
\/ \/ Copyright 2024 lanisys.fr
\/ \/ Copyright 2024,2025 lanisys.fr
This file is part of W language.
@@ -86,7 +86,7 @@ extern long execModule(env * e, var * param, var * param2, var * param3, void **
//
/* ----------------------------------------------------------------------------------------------- */
/* les 4 fonctions suivantes doivent toujours exister dans chaque module */
if(strncmp(e->fn, "init", 4) == 0)
if(modFnIs(e, "init", 4))
{
// alloc ptr sur zone memoire pour memoriser l'etat du module
*etat = memalloc(e, sizeof(modEtat));
@@ -102,14 +102,14 @@ extern long execModule(env * e, var * param, var * param2, var * param3, void **
p_etat->fnDb = NULL;
}
}
else if(strncmp(e->fn, "end", 3) == 0)
else if(modFnIs(e, "end", 3))
{
// liberation specifique au module avant arret process
if(p_etat != NULL)
memfree(e, p_etat);
//*** code specifique ici
}
else if(strncmp(e->fn, "vers", 4) == 0)
else if(modFnIs(e, "vers", 4))
{
// renvoie la version du module/plugins
if(param->type == VAR_DYNAMIC)
@@ -119,7 +119,7 @@ extern long execModule(env * e, var * param, var * param2, var * param3, void **
else
exc = EX_MODPARAM; // variable en parametre du mauvais type
}
else if(strncmp(e->fn, "error", 5) == 0)
else if(modFnIs(e, "error", 5))
{
// renvoie la derniere erreur specifique au module
if(p_etat == NULL)
@@ -133,7 +133,7 @@ extern long execModule(env * e, var * param, var * param2, var * param3, void **
}
}
/* ============================================================================================= */
else if(strncmp(e->fn, "conn", 4) == 0)
else if(modFnIs(e, "conn", 4))
{
if(p_etat == NULL)
exc = EX_MODETAT;
@@ -182,7 +182,7 @@ extern long execModule(env * e, var * param, var * param2, var * param3, void **
}
}
/* ============================================================================================= */
else if(strncmp(e->fn, "disc", 4) == 0)
else if(modFnIs(e, "disc", 4))
{
if(p_etat == NULL)
exc = EX_MODETAT;
@@ -208,7 +208,7 @@ extern long execModule(env * e, var * param, var * param2, var * param3, void **
}
}
/* ============================================================================================= */
else if(strncmp(e->fn, "info", 4) == 0)
else if(modFnIs(e, "info", 4))
{
if(p_etat == NULL)
exc = EX_MODETAT;
+9 -9
View File
@@ -221,7 +221,7 @@ extern long execModule(env * e, var * param, var * param2, var * param3, void **
}
}
// -----------------------------------------------------------
if(strncmp(e->fn, "read", 4) == 0)
if(modFnIs(e, "read", 4))
{
// param<1> = no fichier ; param<2> = cle
dynRemove(e, param, &p_etat->mTmp, cFM, DYN_TRUE);
@@ -319,11 +319,11 @@ extern long execModule(env * e, var * param, var * param2, var * param3, void **
return EX_DB_ELSE; // pas d'erreur : mettre le code pour "non trouve" ELSE
}
}
else if(strncmp(e->fn, "write", 4) == 0)
else if(modFnIs(e, "write", 5))
{
//
}
else if(strncmp(e->fn, "open", 4) == 0)
else if(modFnIs(e, "open", 4))
{
// param<1> = nom table ; si ok renvoie en retour param<1> = id fichier (indice du tableau)
int lgSav = p_etat->mBase.mLg;
@@ -376,7 +376,7 @@ extern long execModule(env * e, var * param, var * param2, var * param3, void **
}
dynSetLen(e, &p_etat->mBase, lgSav);
}
else if(strncmp(e->fn, "create", 5) == 0)
else if(modFnIs(e, "create", 5))
{
// cree la table : param<1> nom ; modulo param<2> ; separateur param<3>
fileHeader info;
@@ -421,7 +421,7 @@ extern long execModule(env * e, var * param, var * param2, var * param3, void **
}
}
}
else if(strncmp(e->fn, "close", 5) == 0)
else if(modFnIs(e, "close", 5))
{
// param<1> = no fichier
int pos = dynToNum(e, param, 0, 6);
@@ -437,7 +437,7 @@ extern long execModule(env * e, var * param, var * param2, var * param3, void **
// sinon, fichier deja ferme : RAS
}
}
else if(strncmp(e->fn, "setup", 5) == 0)
else if(modFnIs(e, "setup", 5))
{
// sortir si mId deja present (!=0) : une base est deja ouverte
// param<1> = repertoire de base => sa cle d'acces = mKey
@@ -488,7 +488,7 @@ extern long execModule(env * e, var * param, var * param2, var * param3, void **
}
}
}
else if(strncmp(e->fn, "init", 4) == 0)
else if(modFnIs(e, "init", 4))
{
// si init deja fait, ras
if(p_etat == NULL)
@@ -502,7 +502,7 @@ extern long execModule(env * e, var * param, var * param2, var * param3, void **
dynInit(e, &p_etat->mEntry, DYN_LGMIN);
}
}
else if(strncmp(e->fn, "end", 3) == 0)
else if(modFnIs(e, "end", 3))
{
struct shmid_ds attrs = {0};
// liberation specifique au module avant arret process
@@ -534,7 +534,7 @@ extern long execModule(env * e, var * param, var * param2, var * param3, void **
memfree(e, p_etat);
*etat = NULL;
}
else if(strncmp(e->fn, "vers", 4) == 0)
else if(modFnIs(e, "vers", 4))
{
// renvoie la version du module/plugins
dynLet(e, param, "100", 3); // version 1.00 ici
+1 -1
View File
@@ -334,7 +334,7 @@ void debug(env * e)
else
dynLet(e, &e->debugcmd, e->except_ex == 0 ? "" : "Unknown", DYN_LGNONE);
printf("Source en cours => %s:%lld\n", dyn.mPtr, e->ligsrc);
printf("PCode en cours => %p - %p\n", e->debut, e->fin);
printf("PCode en cours => %p - %p (%d)\n", e->debut, e->fin, (int)(e->fin - e->debut + 1));
printf("Part => %d\n", e->part);
printf("Precision => %lld\n", e->precision / NUM_FACTEUR);
printf("Exception => %lld %s\n", e->except_ex, e->debugcmd.mPtr);
+1 -1
View File
@@ -2,7 +2,7 @@
__ __ __
\ \/ \/ / W language
\ /\ /
\/ \/ Copyright 2024 lanisys.fr
\/ \/ Copyright 2024,2025 lanisys.fr
This file is part of W language.
+10 -10
View File
@@ -2,7 +2,7 @@
__ __ __
\ \/ \/ / W language
\ /\ /
\/ \/ Copyright 2024 lanisys.fr
\/ \/ Copyright 2024,2025 lanisys.fr
This file is part of W language.
@@ -91,7 +91,7 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
//
/* ----------------------------------------------------------------------------------------------- */
/* les 4 fonctions suivantes doivent toujours exister dans chaque module */
if(strncmp(e->fn, "init", 4) == 0)
if(modFnIs(e, "init", 4))
{
// alloc ptr sur zone memoire pour memoriser l'etat du module
*etat = memalloc(e, sizeof(modEtat));
@@ -104,7 +104,7 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
//*** code specifique ici
}
}
else if(strncmp(e->fn, "end", 3) == 0)
else if(modFnIs(e, "end", 3))
{
//*** code specifique ici
// liberation specifique au module avant arret process
@@ -113,7 +113,7 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
memfree(e, p_etat);
}
}
else if(strncmp(e->fn, "vers", 4) == 0)
else if(modFnIs(e, "vers", 4))
{
// renvoie la version du module/plugins
if(param1->type == VAR_DYNAMIC)
@@ -123,7 +123,7 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
else
exc = EX_MODPARAM; // variable en parametre du mauvais type
}
else if(strncmp(e->fn, "error", 5) == 0)
else if(modFnIs(e, "error", 5))
{
// renvoie la derniere erreur specifique au module
if(p_etat == NULL)
@@ -139,7 +139,7 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
}
}
/* ============================================================================================= */
else if(strncmp(e->fn, "create", 6) == 0)
else if(modFnIs(e, "create", 6))
{
// todo...
// test
@@ -149,7 +149,7 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
printf("mod create %d\n", p_etat->error);
}
/* ----------------------------------------------------------------------------------------------- */
else if(strncmp(e->fn, "get", 3) == 0)
else if(modFnIs(e, "get", 3))
{
/* utilisation de dynRead qui fait le travail, param1 : nom, param2 : contenu lu */
if(param1 == NULL || param2 == NULL)
@@ -163,7 +163,7 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
}
}
/* ----------------------------------------------------------------------------------------------- */
else if(strncmp(e->fn, "set", 3) == 0)
else if(modFnIs(e, "set", 3))
{
/* copie du code de dynWrite, avec modif param1 : nom, param2 : contenu a ecrire */
if(param1 == NULL || param2 == NULL)
@@ -188,7 +188,7 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
}
}
/* ----------------------------------------------------------------------------------------------- */
else if(strncmp(e->fn, "size", 4) == 0)
else if(modFnIs(e, "size", 4))
{
/* copie du code de dynRead, plus court */
FILE * fic;
@@ -220,7 +220,7 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
}
}
/* ----------------------------------------------------------------------------------------------- */
else if(strncmp(e->fn, "dir", 3) == 0)
else if(modFnIs(e, "dir", 3))
{
/* copie du code de dynRead, plus court */
if(param1 == NULL)
+42 -21
View File
@@ -33,6 +33,7 @@
#include "lex.c"
#include "instr.h"
#include "rep.h"
#include "arg.c"
#define WVERS 1 /* version du compilateur w et donc du code compile */
@@ -1415,7 +1416,8 @@ long parse(env * e, Dynamic * valex, Dynamic * resultat, Dynamic * tmp, Dynamic
printf("Erreur ligne %dc%s : numero exception throw incorrect\n", numlig, tmp->mPtr);
return DYN_ERR; /* TODO numeroter les erreurs */
}
if(numb < NUM_FACTEUR || numb > 0xFFFFFF)
numb /= NUM_FACTEUR;
if(numb < 1 || numb > 0xFFFFFF)
{
dynField(e, valex, tmp, 3, norig(n), cFM, cVM, 1);
printf("Erreur ligne %dc%s : numero exception throw hors limite\n", numlig, tmp->mPtr);
@@ -1424,7 +1426,7 @@ long parse(env * e, Dynamic * valex, Dynamic * resultat, Dynamic * tmp, Dynamic
dynConcatSz(e, resultat, "SRCL ", 5);
dynConcatSz(e, resultat, Int64ToSz(e, numlig, FALSE, 0), DYN_LGNONE);
dynConcatSz(e, resultat, "\nTHRW ", 6);
dynConcatSz(e, resultat, encours->mPtr, DYN_LGNONE);
dynConcatSz(e, resultat, Int64ToSz(e, numb, FALSE, 0), DYN_LGNONE);
dynConcatSz(e, resultat, "\n", 1);
return OK;
}
@@ -1499,7 +1501,8 @@ long parse(env * e, Dynamic * valex, Dynamic * resultat, Dynamic * tmp, Dynamic
printf("Erreur ligne %dc%s : numero part incorrect\n", numlig, tmp->mPtr);
return DYN_ERR; /* TODO numeroter les erreurs */
}
if(numb < 0 || numb > 255)
numb /= NUM_FACTEUR;
if(numb < 1 || numb > 255)
{
dynField(e, valex, tmp, 3, norig(n), cFM, cVM, 1);
printf("Erreur ligne %dc%s : numero part hors limite\n", numlig, tmp->mPtr);
@@ -1508,7 +1511,7 @@ long parse(env * e, Dynamic * valex, Dynamic * resultat, Dynamic * tmp, Dynamic
dynConcatSz(e, resultat, "SRCL ", 5);
dynConcatSz(e, resultat, Int64ToSz(e, numlig, FALSE, 0), DYN_LGNONE);
dynConcatSz(e, resultat, "\nPART ", 6);
dynConcatSz(e, resultat, encours->mPtr, DYN_LGNONE);
dynConcatSz(e, resultat, Int64ToSz(e, numb, FALSE, 0), DYN_LGNONE);
dynConcatSz(e, resultat, "\n", 1);
return OK;
}
@@ -2658,16 +2661,16 @@ int interprete(env * e)
int main(int argc, char * argv[])
{
Dynamic valex, ligne, resultat, elem1, elem2, elem3, regles;
int ret = 0, lg;
Dynamic valex, ligne, resultat, elem1, elem2, elem3, regles, arg, wsrc, wlib;
int ret = 0;
/* */
/* avis de licence */
printf("W language Copyright 2024,2025 lanisys.fr\n");
printf("This program comes with ABSOLUTELY NO WARRANTY;\nThis is free software, and you are welcome to redistribute it\nunder certain conditions (GPL-3.0-or-later)\n\n");
/* argument : fichier w a convertir en assembleur w */
if(argc != 2)
if(argc < 2)
{
printf("Usage: genw <fichier.w>\n");
printf("Usage: lwc [-WSRC:<chemin>] [-WLIB:<chemin>] <fichier.w>\n");
exit(-1);
}
/* */
@@ -2686,36 +2689,48 @@ int main(int argc, char * argv[])
dynInit(&e, &elem2, 0);
dynInit(&e, &elem3, 0);
dynInit(&e, &regles, 0);
dynInit(&e, &arg, 0);
dynInit(&e, &wsrc, 0);
dynInit(&e, &wlib, 0);
/* */
lg = strlen(argv[1]);
if(lg < 3)
GetArgs(&e, argc, argv, &arg);
dynExtractField(&e, &arg, 4, &wsrc);
dynExtractField(&e, &arg, 5, &wlib);
dynExtractSubField(&e, &arg, 2, 1, &elem3); // elem3 = fichier.w a compiler
/* */
if(elem3.mLg < 3)
{
printf("Nom de fichier incorrect\n");
ret = -2;
}
else if(argv[1][lg-1] != 'w' && argv[1][lg-2] != '.')
else if(elem3.mPtr[elem3.mLg - 1] != 'w' && elem3.mPtr[elem3.mLg - 2] != '.')
{
printf("Nom de fichier incorrect\n");
ret = -2;
}
else if( ! (wsrc = getenv("WSRC")))
else if(wsrc.mLg == 0)
{
printf("Variable d'environnement WSRC introuvable\n");
printf("Variable d'environnement WSRC non definie\n");
ret = -6;
}
else if(wlib.mLg == 0)
{
printf("Variable d'environnement WLIB non definie\n");
ret = -6;
}
else
{
long nb,dup;
ScanDirectory(&e, wsrc, &wdir, NULL, &elem1, &nb, &dup); // init
ScanDirectory(&e, wsrc.mPtr, &wdir, NULL, &elem1, &nb, &dup); // init
//
if((ret = lire_source(&e, argv[1], &elem1, &elem2)) != OK)
if((ret = lire_source(&e, elem3.mPtr, &elem1, &elem2)) != OK)
{
printf("Erreur d'acces au fichier '%s'\n", argv[1]);
ret = -3;
printf("Erreur d'acces au fichier '%s'\n", elem3.mPtr);
//ret = -3;
}
else
{
GetSource(&e, wsrc, argv[1], &elem1, &srcdbg);
GetSource(&e, wsrc.mPtr, elem3.mPtr, &elem1, &srcdbg);
//#ifdef WINLIB
//if(lire_regles_lex(&e, &regles, "C:\\Users\\Poupougne42\\source\\repos\\win_w_src\\lex\\wlex") != DYN_OK) // A parametrer
//#else
@@ -2760,9 +2775,12 @@ int main(int argc, char * argv[])
if(ret == 0)
{
printf("Result : OK, lines=%d\n", numlig);
dynLet(&e, &elem1, argv[1], DYN_LGNONE);
dynConcatSz(&e, &elem1, "a", 1);
dynWrite(&e, &resultat, elem1.mPtr);
/* */
if(wlib.mPtr[wlib.mLg - 1] != e.path_sep[0])
dynConcatSz(&e, &wlib, e.path_sep, 1);
dynConcat(&e, &wlib, &elem3);
dynConcatSz(&e, &wlib, "a", 1);
dynWrite(&e, &resultat, wlib.mPtr);
}
else
{
@@ -2779,6 +2797,9 @@ int main(int argc, char * argv[])
dynFree(&e, &elem2);
dynFree(&e, &elem3);
dynFree(&e, &regles);
dynFree(&e, &arg);
dynFree(&e, &wsrc);
dynFree(&e, &wlib);
/* */
if(clock_gettime_monotonic(&ts) != -1)
lap = ts.tv_sec * 1000000 + (ts.tv_nsec / 1000) - lap;
+11
View File
@@ -66,6 +66,17 @@ char * copy_nom(env * e, const char * s)
return e->nom;
}
int modFnIs(env * e, const char * fn, int lg)
{
// modifier l'endroit ou e->fn est mis a jour : verif fn64[0 1 2] est bien remis a zero avant la maj
ent64 f[3];
f[0] = 0; f[1] = 0; f[2] = 0;
if(lg < 1 || lg > 23)
return FALSE;
strncpy((char *)f, fn, lg);
return (e->fn64[0] == f[0] && e->fn64[1] == f[1] && e->fn64[2] == f[2]);
}
/* ************************************************************************** */
/* fonctions wrapper au cas ou on aurait besoin de ne plus utiliser certaines */
/* fonctions standards (malloc, etc.) */
+1
View File
@@ -27,6 +27,7 @@
void init_env(env * e);
char * copy_nom(env * e, const char * s);
int modFnIs(env * e, const char * fn, int lg);
/* ************************************************************************** */
/* fonctions wrapper au cas ou on aurait besoin de ne plus utiliser certaines */
+6 -6
View File
@@ -333,7 +333,7 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
//
/* ----------------------------------------------------------------------------------------------- */
/* les 4 fonctions suivantes doivent toujours exister dans chaque module */
if(strncmp(e->fn, "init", 4) == 0)
if(modFnIs(e, "init", 4))
{
// alloc ptr sur zone memoire pour memoriser l'etat du module
*etat = memalloc(e, sizeof(modEtat));
@@ -346,7 +346,7 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
//*** code specifique ici
}
}
else if(strncmp(e->fn, "end", 3) == 0)
else if(modFnIs(e, "end", 3))
{
// liberation specifique au module avant arret process
if(p_etat != NULL)
@@ -355,7 +355,7 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
memfree(e, p_etat);
}
}
else if(strncmp(e->fn, "vers", 4) == 0)
else if(modFnIs(e, "vers", 4))
{
// renvoie la version du module/plugins
if(param1->type == VAR_DYNAMIC)
@@ -365,7 +365,7 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
else
exc = EX_MODPARAM; // variable en parametre du mauvais type
}
else if(strncmp(e->fn, "error", 5) == 0)
else if(modFnIs(e, "error", 5))
{
// renvoie la derniere erreur specifique au module
if(p_etat == NULL)
@@ -379,7 +379,7 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
}
}
/* ============================================================================================= */
else if(strncmp(e->fn, "MD2", 3) == 0)
else if(modFnIs(e, "MD2", 3))
{
p_etat->error = 0;
// pour les vars en sortie, forcer le chgt de type si besoin ?
@@ -393,7 +393,7 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
}
}
/* ----------------------------------------------------------------------------------------------- */
else if(strncmp(e->fn, "MD4", 3) == 0)
else if(modFnIs(e, "MD4", 3))
{
p_etat->error = 0;
// pour les vars en sortie, forcer le chgt de type si besoin ?
+7 -7
View File
@@ -73,7 +73,7 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
//
/* ----------------------------------------------------------------------------------------------- */
/* les 4 fonctions suivantes doivent toujours exister dans chaque module */
if(strncmp(e->fn, "init", 4) == 0)
if(modFnIs(e, "init", 4))
{
// alloc ptr sur zone memoire pour memoriser l'etat du module
*etat = memalloc(e, sizeof(modEtat));
@@ -87,7 +87,7 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
exc = setError(p_etat, jsonInit(e, &p_etat->jsonCtx));
}
}
else if(strncmp(e->fn, "end", 3) == 0)
else if(modFnIs(e, "end", 3))
{
//*** code specifique ici
exc = setError(p_etat, jsonEnd(e, &p_etat->jsonCtx));
@@ -95,7 +95,7 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
if(p_etat != NULL)
memfree(e, p_etat);
}
else if(strncmp(e->fn, "vers", 4) == 0)
else if(modFnIs(e, "vers", 4))
{
if(param1 == NULL)
exc = EX_MODPARAM;
@@ -110,7 +110,7 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
exc = EX_MODPARAM; // variable en parametre du mauvais type
}
}
else if(strncmp(e->fn, "error", 5) == 0)
else if(modFnIs(e, "error", 5))
{
// renvoie la derniere erreur specifique au module
if(p_etat == NULL)
@@ -126,7 +126,7 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
}
}
/* ============================================================================================= */
else if(strncmp(e->fn, "decode", 6) == 0)
else if(modFnIs(e, "decode", 6))
{
if(param1 == NULL || param2 == NULL || param3 == NULL)
exc = EX_MODPARAM;
@@ -141,7 +141,7 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
}
}
/* ============================================================================================= */
else if(strncmp(e->fn, "print", 5) == 0)
else if(modFnIs(e, "print", 5))
{
if(param1 == NULL || param2 == NULL || param3 == NULL)
exc = EX_MODPARAM;
@@ -154,7 +154,7 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
exc = setError(p_etat, jsonPrint(e, &p_etat->jsonCtx, param1, param2, param3));
}
}
else if(strncmp(e->fn, "treeFetch", 9) == 0)
else if(modFnIs(e, "treeFetch", 9))
{
if(param1 == NULL || param2 == NULL)
exc = EX_MODPARAM;
+154 -442
View File
@@ -53,21 +53,6 @@
- lzwMod.c : compression lzw
- jsonMod.c : prise en charge format json (avec et sans "")
- timeMod.c : gestion du temps, chrono
fichiers du langage w :
.w : fichier texte en langage w => execution en mode "interpreté" par 'lwi' ou 'runw' (mode "script")
.wp : pseudo code binaire du langage w => execution par 'lw' (binaire compatible multi-plateformes)
.wa : assembleur texte du langage w
.w ===> s'interprete avec 'lwi' ou 'runw'
.wp ===> s'execute avec 'lw'
outils du langage w :
.w ------> .c ------> .o / executable
TODO gcc
.w ------> .wa ------> .wp ------> .wa (lwa : assembleur/desassembleur)
lwc lwa lwa -d
*/
@@ -115,7 +100,7 @@ void dyn_printdebug(env * e, var * v, int detail)
#include "lex.c"
#include "reseau.c"
//#include "reseau.c"
/* seules variables globales : celle indiquant un signal de terminaison du programme et celles pour basculer en mode debug on/off ! */
octet ctx_env_kill = 0; /* mis a 255 si signal de terminaison */
@@ -150,9 +135,12 @@ int clock_gettime_monotonic(struct timespec * tv)
#include "hashtable.h"
#include "var.h"
#include "rep.h"
#include "buffer.h"
#include "debug.c"
#include "arg.c"
void Load(env * ctx, char * fichier, pointeur ** binaddr);
void Unload_library(env * ctx);
@@ -1816,173 +1804,6 @@ void numstrstack_printdebug(env * e)
}
}
/* ******************************** */
/* BUFFER */
/* ******************************** */
void buffer_read(env * e, var * varbuf, var * v)
{
ent16 lg, lgfin; /* taille max d'un element dans un buffer : 64 Ko */
ent64 p;
if(varbuf == NULL || v == NULL)
return;
if(varbuf->type != VAR_BUFFER)
return;
/* uniquement lecture dans VAR_DYNAMIC : raz var sinon */
if(v->type == VAR_PARAM)
v = (var *)v->ptr; /* travailler avec la var pointee ! */
if(v->type != VAR_DYNAMIC)
{
var_free(e, v, TRUE);
var_init(e, v, VAR_DYNAMIC, 0, 0, NULL);
if(v->type == VAR_NULL)
{
/* erreur alloc memoire */
e->exception = EX_MEM;
return;
}
}
dynLet(e, v, NULL, DYN_LGNONE);
if(varbuf->read == varbuf->write)
return; /* buffer vide : var dynamic vide aussi */
/* */
p = varbuf->read;
lg = *(octet *)(varbuf->ptr + p++) * 256;
if(p >= varbuf->lgmax) p = 0;
lg += *(octet *)(varbuf->ptr + p++);
if(p >= varbuf->lgmax) p = 0;
if(lg > 0)
{
if(dynCtrl(e, v, lg, TRUE) != DYN_OK) /* avec RAZ */
return;
/* */
if(lg <= (lgfin = varbuf->lgmax - p))
{
/* copier un seul bloc */
memcopie(v->ptr, varbuf->ptr + p, lg);
//memcpy(v->ptr, varbuf->ptr + p, lg);
v->lg = lg;
*(v->ptr + lg) = 0; /* \0 de fin de chaine */
if(p + lg >= varbuf->lgmax)
varbuf->read = 0; /* cela ne peut pas etre plus loin, car sinon il y aurait eu 2 blocs a lire */
else
varbuf->read = p + lg;
}
else
{
/* 2 blocs */
memcopie(v->ptr, varbuf->ptr + p, lgfin);
//memcpy(v->ptr, varbuf->ptr + p, lgfin);
memcopie(v->ptr + lgfin, varbuf->ptr, lg - lgfin);
//memcpy(v->ptr + lgfin, varbuf->ptr, lg - lgfin);
varbuf->read = lg - lgfin;
}
}
else
varbuf->read = p;
}
void buffer_write(env * e, var * varbuf, var * v)
{
ent64 p, lgfin;
if(varbuf == NULL || v == NULL)
return;
if(v->type == VAR_PARAM)
v = (var *)v->ptr; /* travailler avec la var pointee ! */
if(varbuf->type != VAR_BUFFER || v->type != VAR_DYNAMIC)
return;
/* uniquement ecriture d'une VAR_DYNAMIC */
if(v->lg > (v->lgmax / 16)) // pour pouvoir ecrire au moins 16 items dans le buffer
{
e->exception = EX_BUFOVF; /* trop grand a ecrire */
return;
}
ent64 vbread = varbuf->read;
if(varbuf->write < vbread)
{
/* ecriture en une fois, + 3 car lg sur 16 bits en plus et laisser au moins 1 octet libre => read=write veut dire vide ! */
if(vbread - varbuf->write < v->lg + 3)
{
e->exception = EX_BUFOVF; /* pas assez de place */
return;
}
/* */
p = varbuf->write;
*(varbuf->ptr + p) = (v->lg & 65535) >> 8;
p++;
*(varbuf->ptr + p) = v->lg & 255;
p++;
memcopie(varbuf->ptr + p, v->ptr, v->lg);
//memcpy(varbuf->ptr + p, v->ptr, v->lg);
varbuf->write = p + v->lg;
}
else
{
/* ecriture en une ou 2 fois */
if(varbuf->lgmax + vbread - varbuf->write < v->lg + 3) /* lgbuffer - (write - read) */
{
e->exception = EX_BUFOVF; /* pas assez de place */
return;
}
/* */
p = varbuf->write;
*(varbuf->ptr + p) = (v->lg & 65535) >> 8;
p++;
if(p >= varbuf->lgmax) p = 0;
*(varbuf->ptr + p) = v->lg & 255;
p++;
if(p >= varbuf->lgmax) p = 0;
if(v->lg == 0)
{
varbuf->write = p;
return;
}
if(v->lg <= (lgfin = varbuf->lgmax - p))
{
/* copier en une fois */
memcopie(varbuf->ptr + p, v->ptr, v->lg);
//memcpy(varbuf->ptr + p, v->ptr, v->lg);
if(p + v->lg >= varbuf->lgmax)
varbuf->write = 0; /* pas plus cas sinon il y aurait eu copie en 2 fois */
else
varbuf->write = p + v->lg;
}
else
{
/* en 2 fois */
memcopie(varbuf->ptr + p, v->ptr, lgfin);
//memcpy(varbuf->ptr + p, v->ptr, lgfin);
memcopie(varbuf->ptr, v->ptr + lgfin, v->lg - lgfin);
//memcpy(varbuf->ptr, v->ptr + lgfin, v->lg - lgfin);
varbuf->write = v->lg - lgfin;
}
}
}
void buffer_clear(env * e, var * varbuf)
{
if(varbuf == NULL)
return;
if(varbuf->type != VAR_BUFFER)
return;
varbuf->read = 0;
varbuf->write = 0;
memset(varbuf->ptr, 0, varbuf->lgmax);
}
void buffer_printdebug(env * e, var * varbuf, ent32 lg)
{
if(varbuf == NULL)
return;
if(varbuf->type != VAR_BUFFER)
return;
printf("buffer lgmax=%lld read=%lld write=%lld\n", varbuf->lgmax, varbuf->read, varbuf->write);
if(lg == 0)
lg = varbuf->lgmax;
/* affichage brut en hexa */
hex2((char *)varbuf->ptr, lg, 32);
}
/* --- fonctions pour les objets, equiv. hash --- */
void get_new_oid(env * e)
{
@@ -2519,7 +2340,7 @@ void instr_024(env * e)
for(pos_fn = 0; pos_fn < lg; pos_fn++)
if(e->si[pos_fn] == '@')
break;
if(pos_fn < 1 || pos_fn >= lg - 1)
if(pos_fn < 1 || pos_fn >= lg - 1 || pos_fn > 21 || lg - pos_fn - 1 > 23)
{
e->exception = EX_MODNAME;
e->si += lg;
@@ -2639,28 +2460,20 @@ void instr_024(env * e)
//
// declaration de la fonction dans le module externe :
// extern long execModule(env * env, var * param, void * etat);
// (prevoir d'ajouter un appel comme etant un element du langage ??)
//
// exemples de modules "systemes"
// - file.create/open/close/read/write : create(nom, bool raz) => true : raz fichier si existant, false except si existe ; open(nom) except si n'existe pas
// - db.open/close/read/write/delete/request/prepare/trans
// - socket.create_serveur/accept_client/connect_serveur/close/read/write/secu => secu(certificat)
// db avec Postgresql : libpq.o libfe.h
// socket secu : openssl.h socket.h
// - threads.run/wait/kill ??
// + prevoir d'ajouter un appel comme etant un element du langage
//
// syntaxe : call file@create(var) => module <file>, fonction <create> avec parametre <var> (dans ad_var)
// ou alors file@create fm1, fm2, fm3, resultat => idem l'autre var contiendra fm1 FM fm2 FM fm3 et au retour var dans resultat
// syntaxe : call file&create(var) => module <file>, fonction <create> avec parametre <var> (dans ad_var)
//
// les variable de la call stack sont deja toutes des pointeurs (VAR_PARAM)
var param1, param2, param3;
var * p1 = NULL, * p2 = NULL, * p3 = NULL;
cpop(e, &param1);
cpop(e, &param1); // seule exception possible ici : EX_BUFOVF car pas/plus de parametre empile
if(!e->exception) p1 = &param1;
cpop(e, &param2);
if(!e->exception) p2 = &param2;
cpop(e, &param3);
if(!e->exception) p3 = &param3;
if(e->exception == EX_BUFOVF) e->exception = OK; // si pas de param, pas d'erreur
//
// executer la fn module avec la var
strncpy(e->fn, (char *)(e->si + pos_fn + 1), lg - pos_fn - 1);
@@ -3388,7 +3201,7 @@ void instr_045(env * e)
e->nom64[0] = 0;
e->nom64[1] = 0;
e->nom64[2] = 0;
if(lg < 0 || lg > 24) /* pas de nom autorise */
if(lg < 0 || lg > 23) /* pas de nom autorise */
e->exception = EX_LGNOM;
else
{
@@ -4144,7 +3957,7 @@ void instr_073(env * e)
int lg = lire8(e->si++);
if(e->si + lg - 1 > e->fin) { e->exception = EX_END; return; }
//
ntostring(e);
//ntostring(e); // TODO a confirmer si ok
npopv(e, &e->ad_var); // en chaine
if(e->exception != OK)
return;
@@ -4178,8 +3991,8 @@ void instr_074(env * e)
int lg = lire8(e->si++);
if(e->si + lg - 1 > e->fin) { e->exception = EX_END; return; }
//
ntostring(e);
npopv(e, &e->ad_var); // en chaine
//ntostring(e); // TODO a confirmer si ok
npopv(e, &e->ad_var);
if(e->exception != OK)
return;
//
@@ -5617,6 +5430,8 @@ void instr_255(env * e)
}
// liberer les modules e->g en __nom (dlclose)
e->fn64[0] = 0;
e->fn64[1] = 0;
e->fn64[2] = 0;
strncpy(e->fn, "end", 3);
e->int_dynamic.mPtr[0] = 0;
//
@@ -5939,11 +5754,11 @@ void init_sig()
int CreateContext(env ** ctx, int useSignal, int argc, char *argv[])
{
env * e;
int i,j,k,lg;
char * wbin = NULL, * wsrc = NULL, * wlib = NULL, * prog = NULL;
var * v, * varEnv;
int i, j, k;
/* */
if((e = (env *)memalloc(NULL, sizeof(env))) == NULL)
return EX_MEM;
return (e->except_ex = EX_MEM);
else
*ctx = e;
/* */
@@ -5977,8 +5792,8 @@ int CreateContext(env ** ctx, int useSignal, int argc, char *argv[])
e->nom64[2] = 0;
/* */
/* endianess */
i = W_LITTLE_ENDIAN; // fonctionne si W_BIG_ENDIAN vaut 0...
e->endianess = *(char *)(&i);
int endian = W_LITTLE_ENDIAN; // fonctionne si W_BIG_ENDIAN vaut 0...
e->endianess = *(char *)(&endian);
/* */
e->mode_typeof = FALSE;
e->typeof_ = 0;
@@ -6029,178 +5844,128 @@ int CreateContext(env ** ctx, int useSignal, int argc, char *argv[])
e->numstr_stack.type == VAR_NULL || e->int_hash.type == VAR_NULL || e->tmp_dynamic.type == VAR_NULL ||
e->num_stack.type == VAR_NULL || e->call_stack.type == VAR_NULL || e->debugbrkpoint.type == VAR_NULL ||
e->debugreglelex.type == VAR_NULL || e->debugcmd.type == VAR_NULL || e->debugvalex.type == VAR_NULL )
e->except_ex = EX_MEM;
else
return (e->except_ex = EX_MEM);
//
/* dans hash globale, creer "_arg" dynamic contenant les arguments en FM (ceux du prog w uniquement !) */
/* puis creer les autres => @ARG = _arg, @BIN = _bin, @ENV = _env */
/* d'autres sont en memoire dans <e> : @PART = e->part, @LINE = e->ligscr, @EXCEPT = e->except_ex (dans bloc EXCEPT uniquement) */
//
GetArgs(e, argc, argv, &e->tmp_dynamic);
//
e->trace = (dynLocateSz(e, &e->tmp_dynamic, ARG_TRACE, cVM, 1, cFM) > 0);
e->debug = (dynLocateSz(e, &e->tmp_dynamic, ARG_DEBUG, cVM, 1, cFM) > 0);
// -c compress ; -k compress with key
if(dynExtractPos(e, &e->tmp_dynamic, 2, 1, cFM, cVM) <= 0)
return (e->except_ex = EX_CMDLINE_ARG); // pas de prog wp ici
// wbin
dynExtractField(e, &e->tmp_dynamic, 3, &e->int_dynamic);
if(e->int_dynamic.mLg > 0 && e->int_dynamic.mPtr[e->int_dynamic.mLg - 1] != e->path_sep[0])
dynConcatSz(e, &e->int_dynamic, e->path_sep, 1);
dynStore(e, &e->tmp_dynamic, 3, DYN_NONE, &e->int_dynamic, cFM, DYN_NONE);
// wsrc
dynExtractField(e, &e->tmp_dynamic, 4, &e->int_dynamic);
if(e->int_dynamic.mLg > 0 && e->int_dynamic.mPtr[e->int_dynamic.mLg - 1] != e->path_sep[0])
dynConcatSz(e, &e->int_dynamic, e->path_sep, 1);
dynStore(e, &e->tmp_dynamic, 4, DYN_NONE, &e->int_dynamic, cFM, DYN_NONE);
// wlib
dynExtractField(e, &e->tmp_dynamic, 5, &e->int_dynamic);
if(e->int_dynamic.mLg > 0 && e->int_dynamic.mPtr[e->int_dynamic.mLg - 1] != e->path_sep[0])
dynConcatSz(e, &e->int_dynamic, e->path_sep, 1);
dynStore(e, &e->tmp_dynamic, 5, DYN_NONE, &e->int_dynamic, cFM, DYN_NONE);
//
dynField(e, &e->tmp_dynamic, &e->int_dynamic, 3, DYN_NONE, cFM, DYN_NONE, 3);
v = &e->int_dynamic; // wbin wsrc wlib
hashtable_do(e, HASH_WRITE, &e->g, copy_nom(e, "_env"), &v);
//
dynExtractField(e, &e->tmp_dynamic, 2, &e->int_dynamic);
dynReplace(e, &e->int_dynamic, cVM, cFM); // prog arg1 arg2 ... => _arg
//
// wbin contient les binaires : lib dynamique wlib.so et modules C xxx.o (appeles par invoke), /usr/lib/wlanguage sous linux
// les binaires lw, lwc, lwa, lwf sont dans un chemin inclus dans le path (/usr/bin sous linux)
// wlib pointe sur les binaires wp
#ifdef WINLIB
if(GetConsoleWindow() == NULL)
{
/* dans hash globale, creer "_arg" dynamic contenant les arguments en FM (ceux du prog w uniquement !) */
/* puis creer les autres => @ARG = _arg, @BIN = _bin, @ENV = _env */
/* d'autres sont en memoire dans <e> : @PART = e->part, @LINE = e->ligscr, @EXCEPT = e->except_ex (dans bloc EXCEPT uniquement) */
if(argv != NULL)
for(i = 1, j = 0; i < argc; i++)
if(argv[i] != NULL)
{
// depending on arg, update e
if(strcmp(argv[i], "-t") == 0)
e->trace = 1;
if(strcmp(argv[i], "-d") == 0)
e->debug = 1;
if(strcmp(argv[i], "-c") == 0)
e->bin_comp = 1;
if(strcmp(argv[i], "-k") == 0)
e->bin_comp = 2; // TODO : where is the key ?
if(strncmp(argv[i], "-WBIN:", 6) == 0)
if(strlen(argv[i]) > 6)
wbin = argv[i] + 6;
if(strncmp(argv[i], "-WLIB:", 6) == 0)
if(strlen(argv[i]) > 6)
wlib = argv[i] + 6;
if(strncmp(argv[i], "-WSRC:", 6) == 0)
if(strlen(argv[i]) > 6)
wsrc = argv[i] + 6;
// prog to execute and its parameters
if(argv[i][0] != '-')
{
dynStoreSz(e, &e->int_dynamic, ++j, DYN_NONE, argv[i], strlen(argv[i]), cFM, DYN_NONE); /* concatener en FM dans e->int_dynamic */
if(prog == NULL) // assuming here that the first arg found not beginning with hyphen is the program to run (without path nor extension)
prog = argv[i];
/* else w prog's own parameter */
}
}
/* controles vars env, maj dans tmp_dynamic, ajout / ou \ a la fin de chacun des chemins si present */
if(wbin == NULL)
{
wbin = getenv("WBIN");
if(wbin == NULL)
wbin = getenv("LD_LIBRARY_PATH");
/* nota : les pointeurs renvoyes de getenv sont a utiliser tout de suite, car risque de bug sur plusieurs lecture (vars static interne a getenv...) */
}
dynLet(e, &e->tmp_dynamic, wbin, DYN_LGNONE);
if(wbin)
{
lg = strlen(wbin);
if(lg > 0 && wbin[lg - 1] != e->path_sep[0])
dynConcatSz(e, &e->tmp_dynamic, e->path_sep, 1);
}
/* wbin contient les binaires : lw, lwc, lwa, lwf, lib dynamique wlib.so et modules C xxx.o (appeles par invoke) */
if(wsrc == NULL)
wsrc = getenv("WSRC");
dynStoreSz(e, &e->tmp_dynamic, 2, DYN_NONE, wsrc, DYN_LGNONE, cFM, DYN_NONE);
if(wsrc)
{
lg = strlen(wsrc);
if(lg > 0 && wsrc[lg - 1] != e->path_sep[0])
dynConcatSz(e, &e->tmp_dynamic, e->path_sep, 1);
}
/* wsrc utilise en mode debug, via "_wdir" pour afficher la ligne de source correspondant au code assembleur */
if(wlib == NULL)
wlib = getenv("WLIB");
dynStoreSz(e, &e->tmp_dynamic, 3, DYN_NONE, wlib, DYN_LGNONE, cFM, DYN_NONE);
if(wlib)
{
lg = strlen(wlib);
if(lg > 0 && wlib[lg - 1] != e->path_sep[0])
dynConcatSz(e, &e->tmp_dynamic, e->path_sep, 1);
}
/* wlib : repertoire des library w (fichiers *.wp de type programme et "library"), appeles par call ou directement depuis le shell */
/* ---------- TODO : verifier partout ou _env est utilise que code erreur ok si non renseigne */
//if(wbin == NULL)
// e->except_ex = EX_NOENVVAR;
//else if(*wbin == 0)
// e->except_ex = EX_NOENVVAR;
if(prog == NULL)
e->except_ex = EX_CMDLINE_ARG;
else if (*prog == 0)
e->except_ex = EX_CMDLINE_ARG;
else
{
#ifdef WINLIB
if(GetConsoleWindow() == NULL)
{
// sans doute lance en mode DETACHED : prog BACK
e->trace = 0;
e->demon = 1;
}
#endif
/* 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/lire du source
//#else
//if(lire_regles_lex(e, &e->debugreglelex, "/etc/wlanguage/debuglex") == DYN_OK) // au lieu de lex/debuglex
//#endif
if(lire_regles_lex(e, &e->debugreglelex, "debuglex") == DYN_OK)
init_reg(e, &e->debugreglelex, &e->debugcmd); // e->debugcmd sert de var tmp ici
/* ajout */
var * v = &e->int_dynamic;
e->nom64[0] = 0; e->nom64[1] = 0; e->nom64[2] = 0;
strncpy(e->nom, "_arg", 4);
hashtable_do(e, HASH_WRITE, &e->g, e->nom, &v);
/* "_arg" est accessible avec la pseudo var "@ARG" */
dynLet(e, &e->int_dynamic, "", 0);
/* refaire la ligne de commande complete si windows, si premiere instruction = BACK */
#ifdef WINLIB
for(i = 0; i < argc; i++)
dynStoreSz(e, &e->int_dynamic, i+1, DYN_NONE, argv[i], DYN_LGNONE, ' ', DYN_NONE);
e->nom64[0] = 0; e->nom64[1] = 0; e->nom64[2] = 0;
strncpy(e->nom, "_argback", 8);
hashtable_do(e, HASH_WRITE, &e->g, e->nom, &v);
#endif
/* */
/* @FILE est le nom du fichier source en cours, lu avec GetFile() (rep.c) : pas d'init a faire */
/* */
dynLet(e, &e->int_dynamic, "", 0);
/* @BIN donne les noms des binaires qui s'executent : 1er est un prog/back, les autres en MV sont les library appelees (1 seule occurence de chaque, pas l'arbre d'appel) */
//dynStoreSz(e, &e->int_dynamic, 1, DYN_NONE, prog, strlen(prog), cFM, DYN_NONE);
v = &e->int_dynamic;
e->nom64[0] = 0; e->nom64[1] = 0; e->nom64[2] = 0;
strncpy(e->nom, "_bin", 4);
hashtable_do(e, HASH_WRITE, &e->g, e->nom, &v);
/* */
dynLet(e, &e->int_dynamic, "", 0);
v = &e->int_dynamic;
/* _binaddr est en "binaire" dans la var : ad debut/ad fin/nb appel (meme ordre que _bin) */
e->nom64[0] = 0; e->nom64[1] = 0; e->nom64[2] = 0;
strncpy(e->nom, "_binaddr", 8);
hashtable_do(e, HASH_WRITE, &e->g, e->nom, &v);
e->binaddr = hashtable_lastitemwritten(&e->g)->ptr;
/* */
/* @ENV donne les chemins des binaires, library et sources */
e->nom64[0] = 0; e->nom64[1] = 0; e->nom64[2] = 0;
strncpy(e->nom, "_env", 4);
v = &e->tmp_dynamic;
hashtable_do(e, HASH_WRITE, &e->g, e->nom, &v);
/* */
dynLet(e, &e->int_dynamic, "", 0);
if(wsrc != NULL)
{
long nb, dup;
v = &e->int_dynamic;
ScanDirectory(e, wsrc, v, NULL, v, &nb, &dup); // init
e->nom64[0] = 0; e->nom64[1] = 0; e->nom64[2] = 0;
strncpy(e->nom, "_wdir", 5);
hashtable_do(e, HASH_WRITE, &e->g, e->nom, &v); // _wdir utilise en mode debug, pas wsrc directement
}
/* */
/* dans la hash globale, creer la classe "Base" */
e->int_hash.type = VAR_OBJECT;
v = &e->int_hash;
e->nom64[0] = 0;
e->nom64[1] = 0;
e->nom64[2] = 0;
strcpy(e->nom, (char *)CLASS_BASE);
hashtable_do(e, HASH_WRITE, &e->g, e->nom, &v);
//var * obj = ((entry *)(e->g.ptr))->pvar;
var * obj = hashtable_lastitemwritten(&e->g);
e->nom64[0] = 0;
e->nom64[1] = 0;
e->nom64[2] = 0;
strncpy(e->nom, "_class", 6);
dynLet(e, &e->int_dynamic, CLASS_BASE, DYN_LGNONE);
v = &e->int_dynamic;
hashtable_do(e, HASH_WRITE, obj, e->nom, &v);
}
// sans doute lance en mode DETACHED : prog BACK
e->trace = 0;
e->demon = 1;
}
#endif
/* 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/lire du source
//#else
//if(lire_regles_lex(e, &e->debugreglelex, "/etc/wlanguage/debuglex") == DYN_OK) // au lieu de lex/debuglex
//#endif
if(lire_regles_lex(e, &e->debugreglelex, "debuglex") == DYN_OK)
init_reg(e, &e->debugreglelex, &e->debugcmd); // e->debugcmd sert de var tmp ici
/* ajout */
v = &e->int_dynamic;
e->nom64[0] = 0; e->nom64[1] = 0; e->nom64[2] = 0;
strncpy(e->nom, "_arg", 4);
hashtable_do(e, HASH_WRITE, &e->g, e->nom, &v);
varEnv = hashtable_lastitemwritten(&e->g);
/* "_arg" est accessible avec la pseudo var "@ARG" */
dynLet(e, &e->int_dynamic, "", 0);
/* refaire la ligne de commande complete si windows, si premiere instruction = BACK */
#ifdef WINLIB
for(i = 0; i < argc; i++)
dynStoreSz(e, &e->int_dynamic, i+1, DYN_NONE, argv[i], DYN_LGNONE, ' ', DYN_NONE);
e->nom64[0] = 0; e->nom64[1] = 0; e->nom64[2] = 0;
strncpy(e->nom, "_argback", 8);
hashtable_do(e, HASH_WRITE, &e->g, e->nom, &v);
#endif
/* */
/* @FILE est le nom du fichier source en cours, lu avec GetFile() (rep.c) : pas d'init a faire */
/* */
dynLet(e, &e->int_dynamic, "", 0);
/* @BIN donne les noms des binaires qui s'executent : 1er est un prog/back, les autres en MV sont les library appelees (1 seule occurence de chaque, pas l'arbre d'appel) */
//dynStoreSz(e, &e->int_dynamic, 1, DYN_NONE, prog, strlen(prog), cFM, DYN_NONE);
v = &e->int_dynamic;
e->nom64[0] = 0; e->nom64[1] = 0; e->nom64[2] = 0;
strncpy(e->nom, "_bin", 4);
hashtable_do(e, HASH_WRITE, &e->g, e->nom, &v);
/* */
dynLet(e, &e->int_dynamic, "", 0);
v = &e->int_dynamic;
/* _binaddr est en "binaire" dans la var : ad debut/ad fin/nb appel (meme ordre que _bin) */
e->nom64[0] = 0; e->nom64[1] = 0; e->nom64[2] = 0;
strncpy(e->nom, "_binaddr", 8);
hashtable_do(e, HASH_WRITE, &e->g, e->nom, &v);
e->binaddr = hashtable_lastitemwritten(&e->g)->ptr;
/* */
dynExtractField(e, &e->tmp_dynamic, 4, &e->int_dynamic);
dynSetAs(e, &e->tmp_dynamic, &e->int_dynamic); // wsrc
if(e->tmp_dynamic.mLg > 0)
{
long nb, dup;
v = &e->int_dynamic;
ScanDirectory(e, e->tmp_dynamic.mPtr, v, NULL, v, &nb, &dup); // init
e->nom64[0] = 0; e->nom64[1] = 0; e->nom64[2] = 0;
strncpy(e->nom, "_wdir", 5);
hashtable_do(e, HASH_WRITE, &e->g, e->nom, &v); // _wdir utilise en mode debug, pas wsrc directement
}
/* */
return e->except_ex;
/* dans la hash globale, creer la classe "Base" */
e->int_hash.type = VAR_OBJECT;
v = &e->int_hash;
e->nom64[0] = 0;
e->nom64[1] = 0;
e->nom64[2] = 0;
strcpy(e->nom, (char *)CLASS_BASE);
hashtable_do(e, HASH_WRITE, &e->g, e->nom, &v);
//var * obj = ((entry *)(e->g.ptr))->pvar;
var * obj = hashtable_lastitemwritten(&e->g);
e->nom64[0] = 0;
e->nom64[1] = 0;
e->nom64[2] = 0;
strncpy(e->nom, "_class", 6);
dynLet(e, &e->int_dynamic, CLASS_BASE, DYN_LGNONE);
v = &e->int_dynamic;
hashtable_do(e, HASH_WRITE, obj, e->nom, &v);
/* */
dynExtractField(e, varEnv, 1, &e->tmp_dynamic); // for the caller, tmp_dynamic contain wp's prog
return (e->except_ex = OK);
}
void FreeContext(env * ctx)
@@ -6290,8 +6055,8 @@ int ReadProg(env * ctx, char * fichier, pointeur * prg, int * lg)
void Load(env * ctx, char * fichier, pointeur ** binaddr)
{
/* lire _bin, chercher fichier */
/* si pas trouve lire le fichier */
/* lire _bin, chercher fichier ; si pas trouve lire le fichier */
/* !!! ne pas utiliser e->tmp_dynamic !!! */
ctx->nom64[0] = 0;
ctx->nom64[1] = 0;
ctx->nom64[2] = 0;
@@ -6489,86 +6254,33 @@ int main(int argc, char *argv[])
{
/* incorrect command line */
printf("Usage: lw [-d] [-c|-k] [-t] [-WBIN:<chemin>] [-WLIB:<chemin>] [-WSRC:<chemin>] <prog> [parms...]\n");
#ifdef BUILD
printf("Build %ld\n", BUILD);
#endif
exit(-1);
}
/* */
setlocale(LC_ALL, "");
/* */
initReseau();
/* */
if((cr = CreateContext(&ctx_env, TRUE, argc, argv)) == OK)
{
ctx_env->except_ex = EX_CMDLINE_ARG; // incorrect arg in command line : no program to run
if(argv != NULL)
for(int i = 1; i < argc; i++)
if(argv[i] != NULL)
if(argv[i][0] != '-')
{
// assuming here that the first arg found and not beginning with hyphen is the program to run
ctx_env->except_ex = OK;
pointeur * addr;
Load(ctx_env, argv[i], &addr);
if(ctx_env->except_ex == OK)
Execute(ctx_env, addr);
// test -----------------------------------------------
//ctx_env->exception = OK;
//var v, d;
//var_init(ctx_env, &v, VAR_BUFFER, 0, 0, NULL);
//var_init(ctx_env, &d, VAR_DYNAMIC, 0, 0, NULL);
////
//dynLet(ctx_env, &d, "message1", DYN_LGNONE);
//buffer_write(ctx_env, &v, &d);
//dynLet(ctx_env, &d, "message123", DYN_LGNONE);
//buffer_write(ctx_env, &v, &d);
//ctx_env->exception = OK;
//for(int i = 1; i < 30; i++)
//{
// dynLet(ctx_env, &d, "abcdefghijklmnop", DYN_LGNONE);
// buffer_write(ctx_env, &v, &d);
// if(ctx_env->exception != OK)
// {
// printf("except:%lld\n", ctx_env->exception);
// break;
// }
//}
//ctx_env->exception = OK;
//dynLet(ctx_env, &d, "1", DYN_LGNONE);
//buffer_write(ctx_env, &v, &d);
//if(ctx_env->exception != OK) printf("except lg:1\n");
////
//for (int i = 1; i <= 3; i++)
//{
// buffer_read(ctx_env, &v, &d); printf("msg (%lld): %s\n", ctx_env->exception, d.mPtr);
//}
//dynLet(ctx_env, &d, "zzzzzzzzzzzzz", DYN_LGNONE);
//buffer_write(ctx_env, &v, &d);
//for (int i = 1; i <= 28; i++)
//{
// buffer_read(ctx_env, &v, &d); printf("msg (%lld): %s\n", ctx_env->exception, d.mPtr);
//}
//buffer_read(ctx_env, &v, &d); printf("msg vide (%lld): %s\n", ctx_env->exception, d.mPtr);
////
//buffer_printdebug(ctx_env, &v, 0);
// test -----------------------------------------------
/* TODO : avant de liberer, supprimer toutes les fonctions des modules dans les vars : ?? */
/* supprimer tous les progs de _binaddr */
Unload(ctx_env);
//memfree(ctx_env, ctx_env->debut); // attention si sortie sur erreur avec END au milieu du code : ctx->debut n'est pas forcement le bloc de base...
/* TODO : prevoir un ExecLibr (utilisation de w comme langage de plugins type lua dans Garry's Mod) */
break;
}
pointeur * addr;
Load(ctx_env, ctx_env->tmp_dynamic.mPtr, &addr);
if(ctx_env->except_ex == OK)
Execute(ctx_env, addr);
/* TODO : avant de liberer, supprimer toutes les fonctions des modules dans les vars : ?? */
/* supprimer tous les progs de _binaddr */
Unload(ctx_env);
/* TODO : prevoir un ExecLibr (utilisation de w comme langage de plugins type lua dans Garry's Mod)
non, prevoir un prog de base + instruction WAIT qui rend la main et attend un Execlibr = CALL */
cr = ctx_env->except_ex;
}
/* */
FreeContext(ctx_env);
/* */
finReseau();
/* */
if((cr >> 8) != 0)
cr = EX_EXCEPTNUM;
printf("exit:%llu ", cr);
printf("\nexit:%llu ", cr);
if(cr > 0 && cr <= EXNB)
printf("%s ",strerr[cr - 1]);
if(lap < 1500)
+1 -1
View File
@@ -2,7 +2,7 @@
__ __ __
\ \/ \/ / W language
\ /\ /
\/ \/ Copyright 2024 lanisys.fr
\/ \/ Copyright 2024,2025 lanisys.fr
This file is part of W language.
+7 -7
View File
@@ -2,7 +2,7 @@
__ __ __
\ \/ \/ / W language
\ /\ /
\/ \/ Copyright 2024 lanisys.fr
\/ \/ Copyright 2024,2025 lanisys.fr
This file is part of W language.
@@ -81,7 +81,7 @@ extern long execModule(env * e, var * param, var * param2, var * param3, void **
//
/* ----------------------------------------------------------------------------------------------- */
/* les 4 fonctions suivantes doivent toujours exister dans chaque module */
if(strncmp(e->fn, "init", 4) == 0)
if(modFnIs(e, "init", 4))
{
// alloc ptr sur zone memoire pour memoriser l'etat du module
*etat = memalloc(e, sizeof(modEtat));
@@ -98,7 +98,7 @@ extern long execModule(env * e, var * param, var * param2, var * param3, void **
//dynInit(e, &p_etat->w, 256);
}
}
else if(strncmp(e->fn, "end", 3) == 0)
else if(modFnIs(e, "end", 3))
{
// liberation specifique au module avant arret process
if(p_etat != NULL)
@@ -111,7 +111,7 @@ extern long execModule(env * e, var * param, var * param2, var * param3, void **
memfree(e, p_etat);
}
}
else if(strncmp(e->fn, "vers", 4) == 0)
else if(modFnIs(e, "vers", 4))
{
// renvoie la version du module/plugins
if(param->type == VAR_DYNAMIC)
@@ -121,7 +121,7 @@ extern long execModule(env * e, var * param, var * param2, var * param3, void **
else
exc = EX_MODPARAM; // variable en parametre du mauvais type
}
else if(strncmp(e->fn, "error", 5) == 0)
else if(modFnIs(e, "error", 5))
{
// renvoie la derniere erreur specifique au module
if(p_etat == NULL)
@@ -135,7 +135,7 @@ extern long execModule(env * e, var * param, var * param2, var * param3, void **
}
}
/* ============================================================================================= */
else if(strncmp(e->fn, "set", 3) == 0)
else if(modFnIs(e, "set", 3))
{
/* compression du clair de param, en une fois */
/* sinon utiliser : setinit, setnext, setend */
@@ -151,7 +151,7 @@ extern long execModule(env * e, var * param, var * param2, var * param3, void **
}
}
/* ============================================================================================= */
else if(strncmp(e->fn, "get", 3) == 0)
else if(modFnIs(e, "get", 3))
{
/* decompression du code de param, en une fois */
/* sinon utiliser getinit, getnext, getend */
+5 -5
View File
@@ -74,7 +74,7 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
//
/* ----------------------------------------------------------------------------------------------- */
/* les 4 fonctions suivantes doivent toujours exister dans chaque module */
if(strncmp(e->fn, "init", 4) == 0)
if(modFnIs(e, "init", 4))
{
// alloc ptr sur zone memoire pour memoriser l'etat du module
*etat = memalloc(e, sizeof(modEtat));
@@ -88,7 +88,7 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
//
}
}
else if(strncmp(e->fn, "end", 3) == 0)
else if(modFnIs(e, "end", 3))
{
//*** code specifique ici
//
@@ -96,7 +96,7 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
if(p_etat != NULL)
memfree(e, p_etat);
}
else if(strncmp(e->fn, "vers", 4) == 0)
else if(modFnIs(e, "vers", 4))
{
if(param1 == NULL)
exc = EX_MODPARAM;
@@ -111,7 +111,7 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
exc = EX_MODPARAM; // variable en parametre du mauvais type
}
}
else if(strncmp(e->fn, "error", 5) == 0)
else if(modFnIs(e, "error", 5))
{
// renvoie la derniere erreur specifique au module
if(p_etat == NULL)
@@ -127,7 +127,7 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
}
}
/* ============================================================================================= */
else if(strncmp(e->fn, "xxx", 3) == 0)
else if(modFnIs(e, "xxx", 3))
{
//*** coder les autres fonctions ici de la meme maniere, au a mettre au debut !
exc = setError(p_etat, EXMOD_xxx);
+1
View File
@@ -56,6 +56,7 @@ void initPdf(env * e, modContextPdf * ctxPdf);
void freePdf(env * e, modContextPdf * ctxPdf);
int newPdf(env * e, modContextPdf * ctxPdf, Dynamic * titre, long nb_page, long format, Dynamic * fonts);
int endPdf(env * e, modContextPdf * ctxPdf);
Dynamic * getPdf(env * e, modContextPdf * ctxPdf);
int setPdfPage(env * e, modContextPdf * ctxPdf, int compression);
int setPdfText(env * e, modContextPdf * ctxPdf, long x, long y, long w, long h, long font, long taille, long couleur, Dynamic * txt);
int setPdfGraph(env * e, modContextPdf * ctxPdf, char type, long x, long y, long w, long h, long coul_trait, long coul_rempl, long epaisseur, long pointille);
+267
View File
@@ -0,0 +1,267 @@
/* **********************************************
__ __ __
\ \/ \/ / W language
\ /\ /
\/ \/ Copyright 2024,2025 lanisys.fr
This file is part of W language.
W language is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version (GPL-3.0-or-later).
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
********************************************** */
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <string.h>
#include "langage.h"
#include "dynamic.h"
#include "var.h"
#include "hashtable.h"
#include "pdf.h"
typedef struct {
int error; // dernier code erreur specifique au module
//*** a completer selon le besoin du module
modContextPdf cp;
} modEtat;
/* mettre ici les codes d'erreurs specifiques au module */
/* codes a passer a la fonction setError */
#define EXMOD_xxx 1
static int setError(modEtat * p, int err)
{
if(p != NULL)
p->error = err;
return err == OK ? OK : EX_MODERR;
}
#ifndef UNIX
/* Sous Windows, export de la fonction de base au sein d'une DLL : 1 module = 1 DLL */
__declspec(dllexport) long execModule(env * , var * , var * , var * , void ** );
long execModule(env * e, var * param1, var * param2, var * param3, void ** etat)
#else
extern long execModule(env * e, var * param1, var * param2, var * param3, void ** etat)
#endif
{
modEtat * p_etat;
long exc = OK;
// init/end/vers/error sont obligatoires pour tout module
// - - - - - - - - - - - - - - - - - - - -
if(etat == NULL)
return EX_MODPARAM;
else
p_etat = (modEtat *)(*etat); /* evite de la faire a chaque fonction */
//
if(param1 != NULL)
if(param1->type == VAR_PARAM)
param1 = (var *)param1->ptr; /* evite de le faire a chaque fonction */
if(param2 != NULL)
if(param2->type == VAR_PARAM)
param2 = (var *)param2->ptr; /* evite de le faire a chaque fonction */
if(param3 != NULL)
if(param3->type == VAR_PARAM)
param3 = (var *)param3->ptr; /* evite de le faire a chaque fonction */
//
/* ----------------------------------------------------------------------------------------------- */
/* les 4 fonctions suivantes doivent toujours exister dans chaque module */
if(modFnIs(e, "init", 4))
{
// alloc ptr sur zone memoire pour memoriser l'etat du module
*etat = memalloc(e, sizeof(modEtat));
if(*etat == NULL)
exc = EX_MODETAT;
else
{
p_etat = (modEtat *)(*etat);
p_etat->error = 0;
//*** code specifique ici
initPdf(e, &p_etat->cp);
}
}
else if(modFnIs(e, "end", 3))
{
if(p_etat != NULL)
{
//*** code specifique ici
freePdf(e, &p_etat->cp);
// fin liberation specifique module avant arret process
memfree(e, p_etat);
}
}
else if(modFnIs(e, "vers", 4))
{
if(p_etat == NULL)
exc = EX_MODETAT;
else if(param1 == NULL)
exc = EX_MODPARAM;
else
{
// renvoie la version du module/plugins
if(param1->type == VAR_DYNAMIC)
dynLet(e, param1, "1", 1); //*** version en alpha
else if(param1->type == VAR_NUMBER)
param1->num = NUM_UN; //*** version en numerique
else
exc = EX_MODPARAM; // variable en parametre du mauvais type
}
}
else if(modFnIs(e, "error", 5))
{
// renvoie la derniere erreur specifique au module
if(p_etat == NULL)
exc = EX_MODETAT;
else if(param1 == NULL)
exc = EX_MODPARAM;
else
{
if(param1->type == VAR_NUMBER)
param1->num = (ent64)(NUM_FACTEUR * p_etat->error);
else
exc = EX_MODPARAM; // bad type of parameter
}
}
/* ============================================================================================= */
else if(modFnIs(e, "beginDoc", 8))
{
// nouveau document pdf
if(p_etat == NULL)
exc = EX_MODETAT;
else if(param1->type != VAR_HASHTABLE)
exc = EX_MODPARAM;
else
{
// lire les infos necessaires a la creation d'un nouveau doc. pdf :
// titre, nb pages, format, fontes utilisees
var * titre, * fontes, * nbPage, * format;
hashtable_do(e, HASH_READ, param1, copy_nom(e, "Titre"), &titre);
hashtable_do(e, HASH_READ, param1, copy_nom(e, "Fontes"), &fontes);
hashtable_do(e, HASH_READ, param1, copy_nom(e, "Pages"), &nbPage);
hashtable_do(e, HASH_READ, param1, copy_nom(e, "Format"), &format);
if(titre && fontes && nbPage && format)
{
if(titre->type == VAR_DYNAMIC && fontes->type == VAR_DYNAMIC && nbPage->type == VAR_NUMBER && format->type == VAR_NUMBER)
exc = setError(p_etat, ! newPdf(e, &p_etat->cp, titre, nbPage->num / NUM_FACTEUR, format->num / NUM_FACTEUR, fontes));
else
exc = EX_MODPARAM;
}
else
exc = EX_MODPARAM;
}
}
/* ============================================================================================= */
else if(modFnIs(e, "endDoc", 6))
{
// finalise le document pdf, et renvoi le contenu dans param1
if(p_etat == NULL)
exc = EX_MODETAT;
else if(param1 == NULL)
exc = EX_MODPARAM;
else
{
int cr = endPdf(e, &p_etat->cp);
if(cr)
{
var_let(e, param1, getPdf(e, &p_etat->cp), FALSE, FALSE);
}
exc = setError(p_etat, ! cr);
}
}
/* ============================================================================================= */
else if(modFnIs(e, "addPage", 7))
{
if(p_etat == NULL)
exc = EX_MODETAT;
else
// ajouter la page en cours au doucment pdf
exc = setError(p_etat, ! setPdfPage(e, &p_etat->cp, 1)); // 1 = avec compression ; parametrer ?
}
/* ============================================================================================= */
else if(modFnIs(e, "addText", 7))
{
if(p_etat == NULL)
exc = EX_MODETAT;
else if(param1 == NULL)
exc = EX_MODPARAM;
else if(param2 == NULL)
exc = EX_MODPARAM;
else if(param1->type != VAR_HASHTABLE || param2->type != VAR_DYNAMIC)
exc = EX_MODPARAM;
else
{
// ajouter le texte
var * x, * y, * w, * h; // cadre englobant
var * fonte, * taille, * couleur;
hashtable_do(e, HASH_READ, param1, copy_nom(e, "X"), &x);
hashtable_do(e, HASH_READ, param1, copy_nom(e, "Y"), &y);
hashtable_do(e, HASH_READ, param1, copy_nom(e, "W"), &w);
hashtable_do(e, HASH_READ, param1, copy_nom(e, "H"), &h);
hashtable_do(e, HASH_READ, param1, copy_nom(e, "Fonte"), &fonte);
hashtable_do(e, HASH_READ, param1, copy_nom(e, "Taille"), &taille);
hashtable_do(e, HASH_READ, param1, copy_nom(e, "Couleur"), &couleur);
if(x && y && w && h && fonte && taille && couleur)
{
// TODO tester le type des variables !?
exc = setError(p_etat, ! setPdfText(e, &p_etat->cp, x->num / NUM_FACTEUR, y->num / NUM_FACTEUR, w->num / NUM_FACTEUR, h->num / NUM_FACTEUR,
fonte->num / NUM_FACTEUR, taille->num / NUM_FACTEUR, couleur->num / NUM_FACTEUR, param2)); // param2 = texte
}
else
exc = EX_MODPARAM;
}
}
/* ============================================================================================= */
else if(modFnIs(e, "addGraph", 8))
{
if(p_etat == NULL)
exc = EX_MODETAT;
else if(param1 == NULL)
exc = EX_MODPARAM;
else if(param1->type != VAR_HASHTABLE)
exc = EX_MODPARAM;
else
{
// ajouter l'element graphique
var * x, * y, * w, * h; // cadre englobant
var * couleurTrait, * couleurRemplissage, * epaisseur, * pointille, * type;
hashtable_do(e, HASH_READ, param1, copy_nom(e, "X"), &x); // TODO tester le type des variables !?
hashtable_do(e, HASH_READ, param1, copy_nom(e, "Y"), &y);
hashtable_do(e, HASH_READ, param1, copy_nom(e, "W"), &w);
hashtable_do(e, HASH_READ, param1, copy_nom(e, "H"), &h);
hashtable_do(e, HASH_READ, param1, copy_nom(e, "CouleurTrait"), &couleurTrait);
hashtable_do(e, HASH_READ, param1, copy_nom(e, "CouleurRemplissage"), &couleurRemplissage);
hashtable_do(e, HASH_READ, param1, copy_nom(e, "EpaisseurTrait"), &epaisseur);
hashtable_do(e, HASH_READ, param1, copy_nom(e, "Pointille"), &pointille);
hashtable_do(e, HASH_READ, param1, copy_nom(e, "Type"), &type);
if(x && y && w && h && couleurTrait && couleurRemplissage && epaisseur && pointille && type)
{
// TODO tester le type des variables !?
exc = setError(p_etat, ! setPdfGraph(e, &p_etat->cp, *type->mPtr, x->num / NUM_FACTEUR, y->num / NUM_FACTEUR, w->num / NUM_FACTEUR, h->num / NUM_FACTEUR,
couleurTrait->num / NUM_FACTEUR, couleurRemplissage->num / NUM_FACTEUR, epaisseur->num / NUM_FACTEUR, pointille->num / NUM_FACTEUR));
}
else
exc = EX_MODPARAM;
}
}
/* ----------------------------------------------------------------------------------------------- */
else
{
setError(p_etat, 0); // evite un warning de compil
exc = EX_MODFUNC; // fonction non prise en charge
}
//
return exc;
}
+9 -3
View File
@@ -211,7 +211,6 @@ static int fmtc(env * e, Dynamic * res, long coul)
long r = (coul >> 16) & 255; // red
long g = (coul >> 8) & 255; // green
long b = coul & 255; // blue
printf("r %ld, g %ld b %ld\n", r, g, b);
cr = cr && !dynConcatSz(e, res, r == 255 ? "1" : "0", 1);
cr = cr && (r != 255 ? !dynConcatSz(e, res, &table100[((int)(r * 100 / 255)) * 4], 3) : TRUE);
cr = cr && !dynConcatSz(e, res, g == 255 ? " 1" : " 0", 2);
@@ -238,10 +237,12 @@ void initPdf(env * e, modContextPdf * ctxPdf)
dynInit(e, &ctxPdf->mTmp2, 1024);
dynInit(e, &ctxPdf->mPage, 4096);
dynInit(e, &ctxPdf->mPdf, 8192);
ctxPdf->mPdf.type = VAR_DYNAMIC;
dynInit(e, &ctxPdf->mXref, 1024);
dynInit(e, &ctxPdf->mImg, 2048);
/* nom des fontes standards */
dynLet(e, &ctxPdf->mFont, "Courier,Courier-Bold,Courier-BoldOblique,Courier-Oblique,Helvetica,Helvetica-Bold,Helvetica-BoldOblique,Helvetica-Oblique,Times-Roman,Times-Bold,Times-Italic,Times-BoldItalic,Symbol,ZapfDingbats", DYN_LGNONE);
dynLet(e, &ctxPdf->mFont, "Courier,Courier-Bold,Courier-BoldOblique,Courier-Oblique,Helvetica,Helvetica-Bold,Helvetica-BoldOblique,Helvetica-Oblique,"
"Times-Roman,Times-Bold,Times-Italic,Times-BoldItalic,Symbol,ZapfDingbats", DYN_LGNONE);
dynConvert(e, &ctxPdf->mFont, ",", sFM);
//
initLzw(e, &ctxPdf->mCtxLzw);
@@ -302,7 +303,7 @@ int newPdf(env * e, modContextPdf * ctxPdf, Dynamic * titre, long nb_page, long
dynSetLen(e, &ctxPdf->mXref, 0);
/* */
cr = cr && pdfEchap(e, &ctxPdf->mTmp1, titre); // dans les chaines "echapper" ( ) \ avec \( \) \\ (seuls cas)
cr = cr && dynConcat(e, &ctxPdf->mXref, &ctxPdf->mTmp1); // xref<1> = titre
dynConcat(e, &ctxPdf->mXref, &ctxPdf->mTmp1); // xref<1> = titre
/* */
nb_font = dynDcount(e, fonts, cFM, DYN_NONE, DYN_NONE);
nb_img = dynDcount(e, &ctxPdf->mImg, cFM, DYN_NONE, DYN_NONE);
@@ -435,6 +436,11 @@ int endPdf(env * e, modContextPdf * ctxPdf)
return TRUE;
}
Dynamic * getPdf(env * e, modContextPdf * ctxPdf)
{
return &ctxPdf->mPdf;
}
int setPdfPage(env * e, modContextPdf * ctxPdf, int compression)
{
int cr = TRUE;
+6 -6
View File
@@ -114,7 +114,7 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
//
/* ----------------------------------------------------------------------------------------------- */
/* les 4 fonctions suivantes doivent toujours exister dans chaque module */
if(strncmp(e->fn, "init", 4) == 0)
if(modFnIs(e, "init", 4))
{
// alloc ptr sur zone memoire pour memoriser l'etat du module
*etat = memalloc(e, sizeof(modEtat));
@@ -129,7 +129,7 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
//
}
}
else if(strncmp(e->fn, "end", 3) == 0)
else if(modFnIs(e, "end", 3))
{
//*** code specifique ici
//
@@ -137,7 +137,7 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
if(p_etat != NULL)
memfree(e, p_etat);
}
else if(strncmp(e->fn, "vers", 4) == 0)
else if(modFnIs(e, "vers", 4))
{
if(param1 == NULL)
exc = EX_MODPARAM;
@@ -152,7 +152,7 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
exc = EX_MODPARAM; // variable en parametre du mauvais type
}
}
else if(strncmp(e->fn, "error", 5) == 0)
else if(modFnIs(e, "error", 5))
{
// renvoie la derniere erreur specifique au module
if(p_etat == NULL)
@@ -168,7 +168,7 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
}
}
/* ============================================================================================= */
else if(strncmp(e->fn, "setSeed", 7) == 0)
else if(modFnIs(e, "setSeed", 7))
{
if(param1 == NULL)
exc = EX_MODPARAM;
@@ -180,7 +180,7 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
}
}
/* ============================================================================================= */
else if(strncmp(e->fn, "get", 3) == 0)
else if(modFnIs(e, "get", 3))
{
if(param1 == NULL)
exc = EX_MODPARAM;
+8 -6
View File
@@ -81,9 +81,10 @@ long ScanDirectory(env * e, const char * path, Dynamic * directory, const char *
#ifdef UNIX
if((dir = opendir(workPath.mPtr)) == NULL)
{
// TODO ?! exit or continue to next item ?
dynFree(e, &workPath);
return 0;
// continue to next item (no access right for example for this directory, etc.)
//dynFree(e, &workPath);
//return 0;
continue;
}
while ((entry = readdir(dir)) != NULL)
{
@@ -129,9 +130,10 @@ long ScanDirectory(env * e, const char * path, Dynamic * directory, const char *
dynConcatSz(e, &workPath, "\\*", DYN_LGNONE); /* sinon ko... */
if((hFind = FindFirstFile(workPath.mPtr, &FindFileData)) == INVALID_HANDLE_VALUE)
{
// TODO ?! exit or continue to next item ?
dynFree(e, &workPath);
return 0;
// continue to next item (no access right for example for this directory, etc.)
//dynFree(e, &workPath);
//return 0;
continue;
}
dynSetLen(e, &workPath, workPath.mLg - 2); // enlever \* mis a la fin...
for(int cr = -1;cr != 0;)
+67
View File
@@ -0,0 +1,67 @@
/* **********************************************
__ __ __
\ \/ \/ / W language
\ /\ /
\/ \/ Copyright 2024,2025 lanisys.fr
This file is part of W language.
W language is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version (GPL-3.0-or-later).
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
********************************************** */
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#ifndef WINLIB
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#else
#include <windows.h>
#endif
#include "langage.h"
#ifdef WINLIB
typedef int key_t;
#endif
/* codes a passer a la fonction setError */
#define EXMOD_BUFFER_INIT 1
#define EXMOD_BUFFER_WRITE 2
typedef struct {
// proprietaire
key_t cle;
char nom[24]; // 23 cars + \0
long taille;
var * buffer;
#ifndef WINLIB
int handle;
int semId;
#else
HANDLE handle;
char semDesti[25]; // 23 cars + '#' + \0 (different desti sinon ko sous windows)
#endif
// destinataire
char desti[24]; // 23 cars + \0
// message lu/ecrit
var * message;
} modContextShm;
void initShm(env * e, modContextShm * ctx);
void freeShm(env * e, modContextShm * ctx);
long readShm(env * e, modContextShm * ctx);
long writeShm(env * e, modContextShm * ctx);
+175
View File
@@ -0,0 +1,175 @@
/* **********************************************
__ __ __
\ \/ \/ / W language
\ /\ /
\/ \/ Copyright 2024,2025 lanisys.fr
This file is part of W language.
W language is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version (GPL-3.0-or-later).
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
********************************************** */
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <string.h>
#include "langage.h"
#include "dynamic.h"
#include "hashtable.h"
#include "shm.h"
typedef struct {
int error; // dernier code erreur specifique au module
//*** a completer selon le besoin du module
modContextShm cs;
} modEtat;
static int setError(modEtat * p, int err)
{
if(p != NULL)
p->error = err;
return err == OK ? OK : EX_MODERR;
}
#ifndef UNIX
/* Sous Windows, export de la fonction de base au sein d'une DLL : 1 module = 1 DLL */
__declspec(dllexport) long execModule(env * , var * , var * , var * , void ** );
long execModule(env * e, var * param1, var * param2, var * param3, void ** etat)
#else
extern long execModule(env * e, var * param1, var * param2, var * param3, void ** etat)
#endif
{
/* TODO : gestion des 3 parametres (au lieu d'un seul) */
modEtat * p_etat;
long exc = OK;
// init/end/vers/error sont obligatoires pour tout module
// - - - - - - - - - - - - - - - - - - - -
if(etat == NULL)
return EX_MODPARAM;
else
p_etat = (modEtat *)(*etat); /* evite de la faire a chaque fonction */
//
if(param1 != NULL)
if(param1->type == VAR_PARAM)
param1 = (var *)param1->ptr; /* evite de le faire a chaque fonction */
if(param2 != NULL)
if(param2->type == VAR_PARAM)
param2 = (var *)param2->ptr; /* evite de le faire a chaque fonction */
if(param3 != NULL)
if(param3->type == VAR_PARAM)
param3 = (var *)param3->ptr; /* evite de le faire a chaque fonction */
//
/* ----------------------------------------------------------------------------------------------- */
/* les 4 fonctions suivantes doivent toujours exister dans chaque module */
if(modFnIs(e, "init", 4))
{
// alloc ptr sur zone memoire pour memoriser l'etat du module
*etat = memalloc(e, sizeof(modEtat));
if(*etat == NULL)
exc = EX_MODETAT;
else
{
p_etat = (modEtat *)(*etat);
p_etat->error = 0;
//*** code specifique ici
var * prog;
hashtable_do(e, HASH_READ, &e->g, copy_nom(e, "_prog"), &prog);
// maj ctx avec _prog et taille
*((ent64 *)(p_etat->cs.nom)) = 0;
*(((ent64 *)(p_etat->cs.nom)) + 1) = 0;
*(((ent64 *)(p_etat->cs.nom)) + 2) = 0;
if(prog && prog->type == VAR_DYNAMIC && prog->mLg < 24)
strncpy(p_etat->cs.nom, prog->mPtr, prog->mLg);
p_etat->cs.taille = 4000;
//
initShm(e, &p_etat->cs);
}
}
else if(modFnIs(e, "end", 3))
{
// liberation specifique au module avant arret process
if(p_etat != NULL)
{
freeShm(e, &p_etat->cs);
//*** FIN du code specifique ici
memfree(e, p_etat);
}
}
else if(modFnIs(e, "vers", 4))
{
// renvoie la version du module/plugins
if(param1->type == VAR_DYNAMIC)
dynLet(e, param1, "1", 1); //*** version en alpha
else if(param1->type == VAR_NUMBER)
param1->num = NUM_UN; //*** version en numerique
else
exc = EX_MODPARAM; // variable en parametre du mauvais type
}
else if(modFnIs(e, "error", 5))
{
// renvoie la derniere erreur specifique au module
if(p_etat == NULL)
exc = EX_MODETAT;
else
{
if(param1->type == VAR_NUMBER)
param1->num = (ent64)(NUM_FACTEUR * p_etat->error);
else
exc = EX_MODPARAM; // variable en parametre du mauvais type
}
}
/* ============================================================================================= */
else if(modFnIs(e, "get", 3))
{
if(!param1)
exc = EX_MODPARAM;
else if(param1->type != VAR_DYNAMIC)
exc = EX_MODPARAM;
else
{
p_etat->cs.message = param1;
exc = setError(p_etat, readShm(e, &p_etat->cs));
// param1 vide si rien a lire
}
}
/* ============================================================================================= */
else if(modFnIs(e, "set", 3))
{
if(!param1 || !param2)
exc = EX_MODPARAM;
else if(param1->type != VAR_DYNAMIC || param2->type != VAR_DYNAMIC)
exc = EX_MODPARAM;
else
{
*((ent64 *)(p_etat->cs.desti)) = 0;
*(((ent64 *)(p_etat->cs.desti)) + 1) = 0;
*(((ent64 *)(p_etat->cs.desti)) + 2) = 0;
if(param1->mLg < 24)
strncpy(p_etat->cs.desti, param1->mPtr, param1->mLg);
p_etat->cs.message = param2;
exc = setError(p_etat, writeShm(e, &p_etat->cs));
}
}
/* ----------------------------------------------------------------------------------------------- */
else
{
exc = setError(p_etat, EX_MODFUNC); // fonction non prise en charge
}
//
return exc;
}
/* **************************************************************************************************** */
+248
View File
@@ -0,0 +1,248 @@
/* **********************************************
__ __ __
\ \/ \/ / W language
\ /\ /
\/ \/ Copyright 2024,2025 lanisys.fr
This file is part of W language.
W language is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version (GPL-3.0-or-later).
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
********************************************** */
#include "shm.h"
#include "buffer.h"
#include <errno.h>
#ifndef WINLIB
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#endif
#define NBSEM 1
/* PRIVATE */
static key_t Hash32(const char * cle, int lg)
{
// lg multiple de 4 et > 0
// cle est une zone memoire de lg cars
ent64 k, h = 0;
if(lg > 0 && (lg % 4 == 0))
{
h = *(int *)cle;
for(int i = 0; i < lg; )
{
k = (ent64)cle[i++];
k |= ((ent64)cle[i++]) << 8;
k |= ((ent64)cle[i++]) << 16;
k |= ((ent64)cle[i++]) << 24;
k *= 0xcc9e2d51;
k = (k << 15) | (k >> 17); // 32 - 15
k *= 0x1b873593;
h ^= k;
h = (h << 13) | (h >> 19); // 32 - 13
h = h * 5 + 0xe6546b64;
}
}
h ^= lg;
h ^= h >> 16;
h *= 0x85ebca6b;
h ^= h >> 13;
h *= 0xc2b2ae35;
h ^= h >> 16;
return (key_t)h;
}
/* --------------------------------------------------------------------------------------- */
void initShm(env * e, modContextShm * ctx)
{
#ifndef WINLIB
ctx->buffer = NULL;
ctx->handle = -1;
ctx->semId = -1;
// creer la sharedmemory du process, pour lecture
// ne pas controler la taille, sera fait par 'shmget'
// calculer la cle a partir du nom du prog (ctx->nom)
ctx->cle = Hash32(ctx->nom, 24); // chaine de 23 cars max + \0 de fin
// creer le buffer
ctx->handle = shmget(ctx->cle, ctx->taille, IPC_CREAT | IPC_EXCL | 0666); // < 0 si ko
if(ctx->handle < 0)
return; // erreur creation sharedmemory
// lire le pointeur
ctx->buffer = (var *)shmat(ctx->handle, NULL, 0);
if(ctx->buffer == (var *)(-1))
{
shmctl(ctx->handle, IPC_RMID, NULL);
ctx->buffer = NULL;
ctx->handle = -1;
return; // erreur recup pointeur
}
// creer le semaphore pour les writers
ctx->semId = semget(ctx->cle, NBSEM, IPC_CREAT | IPC_EXCL | 0666); // < 0 si ko
if(ctx->semId < 0)
{
freeShm(e, ctx); // erreur
return;
}
// init semaphore
unsigned short table[NBSEM];
table[0] = 1;
if(semctl(ctx->semId, 0, SETALL, table) < 0)
{
freeShm(e, ctx); // erreur
return;
}
#else
ctx->buffer = NULL;
ctx->handle = NULL;
strncpy(ctx->semDesti, ctx->desti, 24);
ctx->semDesti[24] = 0;
ctx->semDesti[strlen(ctx->desti)] = '#';
// creer la sharedmemory du process, pour lecture
// ne pas controler la taille, sera fait par 'CreateFileMapping'
// la cle est directement le nom
// creer le buffer
ctx->handle = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, ctx->taille, ctx->nom); // NULL si ko, attention au \0 de fin de ctx->nom
if( ! ctx->handle)
return; // erreur creation sharedmemory
ctx->buffer = (var *)MapViewOfFile(ctx->handle, FILE_MAP_ALL_ACCESS, 0, 0, 0);
if( ! ctx->buffer)
{
CloseHandle(ctx->handle);
ctx->buffer = NULL;
ctx->handle = NULL;
return; // erreur recup pointeur
}
#endif
ctx->buffer->type = VAR_BUFFER;
ctx->buffer->lgmax = ctx->taille - sizeof(var);
ctx->buffer->read = 0;
ctx->buffer->write = 0;
ctx->buffer->ptr = NULL; // NULL signifie que le contenu est a la suite de l'entete de la variable (utilise uniquement ici avec les IPC)
}
void freeShm(env * e, modContextShm * ctx)
{
#ifndef WINLIB
if(ctx->buffer)
shmdt(ctx->buffer);
if(ctx->handle >= 0)
shmctl(ctx->handle, IPC_RMID, NULL);
if(ctx->semId >= 0)
semctl(ctx->semId, IPC_RMID, 0);
ctx->buffer = NULL;
ctx->handle = -1;
ctx->semId = -1;
#else
if(ctx->buffer)
UnmapViewOfFile(ctx->buffer);
if(ctx->handle >= 0)
CloseHandle(ctx->handle); // verif que bien detruit
ctx->buffer = NULL;
ctx->handle = NULL;
#endif
}
long readShm(env * e, modContextShm * ctx)
{
#ifndef WINLIB
if( ! ctx->buffer || ctx->handle < 0)
return EXMOD_BUFFER_INIT;
#else
if( ! ctx->buffer || ! ctx->handle)
return EXMOD_BUFFER_INIT;
#endif
buffer_read(e, ctx->buffer, ctx->message);
// e->exception != OK si exception en lecture (que EX_MEM) ! vide si rien a lire (Dynamic)
return e->exception;
}
long writeShm(env * e, modContextShm * ctx)
{
// TODO gestion verrou !
#ifndef WINLIB
// calculer la cle a partir du nom du prog (ctx->nom)
key_t cle = Hash32(ctx->desti, 24); // chaine de 23 cars + \0
// acceder au buffer
int handle = shmget(cle, 0, 0);
if(handle < 0)
return EXMOD_BUFFER_WRITE; // erreur access
// lire le pointeur
var * buffer = (var *)shmat(handle, NULL, 0);
if(buffer == (var *)(-1))
return EXMOD_BUFFER_WRITE; // seul le ptr se libere
// prendre le verrou (semaphore) pour ecrire, avec attente
int semId = semget(cle, NBSEM, 0);
if(semId < 0)
{
shmdt(buffer);
return EXMOD_BUFFER_WRITE;
}
struct sembuf bufw;
bufw.sem_num = 0;
bufw.sem_op = -1; // prendre
bufw.sem_flg = SEM_UNDO; // | IPC_NOWAIT ?
if(semop(semId, &bufw, 1) < 0)
{
shmdt(buffer);
return EXMOD_BUFFER_WRITE;
}
// EcrireBuffer
buffer_write(e, buffer, ctx->message);
// e->exception != OK si exception en ecriture (que EX_BUFOVF) !
// liberer le verrou
bufw.sem_op = 1; // liberer
semop(semId, &bufw, 1);
// ne liberer que le ptr sous unix
shmdt(buffer);
#else
// la cle est directement le destinataire
HANDLE handle = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, ctx->desti); // attention au \0 de fin
if( ! handle)
return EXMOD_BUFFER_WRITE; // erreur access
// lire le pointeur
var * buffer = (var *)MapViewOfFile(handle, FILE_MAP_ALL_ACCESS, 0, 0, 0);
if( ! buffer)
{
CloseHandle(handle);
return EXMOD_BUFFER_WRITE; // erreur recup pointeur
}
// prendre le verrou (semaphore) pour ecrire, avec attente
HANDLE hSem = CreateSemaphore(NULL, 1, 1, ctx->semDesti); // NULL si erreur
if( ! hSem)
{
UnmapViewOfFile(buffer);
CloseHandle(handle);
return EXMOD_BUFFER_WRITE; // erreur recup pointeur
}
if(WaitForSingleObject(hSem, 0) != WAIT_OBJECT_0) // retour WAIT_OBJECT_0 si ok, WAIT_TIMEOUT ou autre si pas dispo ou erreur ; 0 = timeout en secondes
{
ReleaseSemaphore(hSem, 1, NULL);
UnmapViewOfFile(buffer);
CloseHandle(handle);
return EXMOD_BUFFER_WRITE; // erreur recup pointeur
}
// EcrireBuffer
buffer_write(e, buffer, ctx->message);
// e->exception != OK si exception en ecriture (que EX_BUFOVF) !
// liberer le verrou
ReleaseSemaphore(hSem, 1, NULL);
// liberations
UnmapViewOfFile(buffer);
CloseHandle(handle);
#endif
return e->exception;
}
+12 -12
View File
@@ -2,7 +2,7 @@
__ __ __
\ \/ \/ / W language
\ /\ /
\/ \/ Copyright 2024 lanisys.fr
\/ \/ Copyright 2024,2025 lanisys.fr
This file is part of W language.
@@ -86,7 +86,7 @@ extern long execModule(env * e, var * param, var * param2, var * param3, void **
//
/* ----------------------------------------------------------------------------------------------- */
/* les 4 fonctions suivantes doivent toujours exister dans chaque module */
if(strncmp(e->fn, "init", 4) == 0)
if(modFnIs(e, "init", 4))
{
// alloc ptr sur zone memoire pour memoriser l'etat du module
*etat = memalloc(e, sizeof(modEtat));
@@ -101,7 +101,7 @@ extern long execModule(env * e, var * param, var * param2, var * param3, void **
p_etat->mServeur = 0;
}
}
else if(strncmp(e->fn, "end", 3) == 0)
else if(modFnIs(e, "end", 3))
{
// liberation specifique au module avant arret process
p_etat = (modEtat *)(*etat);
@@ -114,7 +114,7 @@ extern long execModule(env * e, var * param, var * param2, var * param3, void **
memfree(e, p_etat);
}
}
else if(strncmp(e->fn, "vers", 4) == 0)
else if(modFnIs(e, "vers", 4))
{
// renvoie la version du module/plugins
if(param->type == VAR_DYNAMIC)
@@ -124,7 +124,7 @@ extern long execModule(env * e, var * param, var * param2, var * param3, void **
else
exc = EX_MODPARAM; // variable en parametre du mauvais type
}
else if(strncmp(e->fn, "error", 5) == 0)
else if(modFnIs(e, "error", 5))
{
// renvoie la derniere erreur specifique au module
if(p_etat == NULL)
@@ -138,7 +138,7 @@ extern long execModule(env * e, var * param, var * param2, var * param3, void **
}
}
/* ============================================================================================= */
else if(strncmp(e->fn, "server", 6) == 0)
else if(modFnIs(e, "server", 6))
{
/* cree un point d'entree serveur */
if(p_etat == NULL)
@@ -244,7 +244,7 @@ extern long execModule(env * e, var * param, var * param2, var * param3, void **
}
}
/* ----------------------------------------------------------------------------------------------- */
else if(strncmp(e->fn, "connect", 7) == 0)
else if(modFnIs(e, "connect", 7))
{
char ** tParam;
/* connexion a un serveur */
@@ -347,7 +347,7 @@ extern long execModule(env * e, var * param, var * param2, var * param3, void **
}
}
/* ----------------------------------------------------------------------------------------------- */
else if(strncmp(e->fn, "arret", 5) == 0)
else if(modFnIs(e, "arret", 5))
{
/* arret connexion cliente ou serveur */
if(p_etat != NULL)
@@ -358,7 +358,7 @@ extern long execModule(env * e, var * param, var * param2, var * param3, void **
}
}
/* ----------------------------------------------------------------------------------------------- */
else if(strncmp(e->fn, "attente", 7) == 0)
else if(modFnIs(e, "attente", 7))
{
if(p_etat == NULL)
exc = EX_MODETAT;
@@ -404,7 +404,7 @@ extern long execModule(env * e, var * param, var * param2, var * param3, void **
}
}
/* ----------------------------------------------------------------------------------------------- */
else if(strncmp(e->fn, "get", 3) == 0)
else if(modFnIs(e, "get", 3))
{
long nblu = 0, arg = 1, flagInProgress = 0, pas = 16000, would_block;
/* lecture sur la connexion */
@@ -446,7 +446,7 @@ extern long execModule(env * e, var * param, var * param2, var * param3, void **
}
}
/* ----------------------------------------------------------------------------------------------- */
else if(strncmp(e->fn, "set", 3) == 0)
else if(modFnIs(e, "set", 3))
{
long nb , pos = 0, lg, would_block;
/* ecriture sur la connexion */
@@ -481,7 +481,7 @@ extern long execModule(env * e, var * param, var * param2, var * param3, void **
}
}
/* ----------------------------------------------------------------------------------------------- */
else if(strncmp(e->fn, "accept", 6) == 0)
else if(modFnIs(e, "accept", 6))
{
/* ecriture sur la connexion */
if(p_etat == NULL)
+17 -17
View File
@@ -100,7 +100,7 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
//
/* ----------------------------------------------------------------------------------------------- */
/* les 4 fonctions suivantes doivent toujours exister dans chaque module */
if(strncmp(e->fn, "init", 4) == 0)
if(modFnIs(e, "init", 4))
{
// alloc ptr sur zone memoire pour memoriser l'etat du module
*etat = memalloc(e, sizeof(modEtat));
@@ -113,7 +113,7 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
//*** code specifique ici
}
}
else if(strncmp(e->fn, "end", 3) == 0)
else if(modFnIs(e, "end", 3))
{
// liberation specifique au module avant arret process
if(p_etat != NULL)
@@ -122,7 +122,7 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
memfree(e, p_etat);
}
}
else if(strncmp(e->fn, "vers", 4) == 0)
else if(modFnIs(e, "vers", 4))
{
// renvoie la version du module/plugins
if(param1->type == VAR_DYNAMIC)
@@ -132,7 +132,7 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
else
exc = EX_MODPARAM; // variable en parametre du mauvais type
}
else if(strncmp(e->fn, "error", 5) == 0)
else if(modFnIs(e, "error", 5))
{
// renvoie la derniere erreur specifique au module
if(p_etat == NULL)
@@ -146,14 +146,14 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
}
}
/* ============================================================================================= */
else if(strncmp(e->fn, "execute", 7) == 0)
else if(modFnIs(e, "execute", 7))
{
p_etat->error = 0;
// execute(command, returning, capturing)
// pour les vars en sortie, forcer le chgt de type si besoin ?
if(param1->type != VAR_DYNAMIC)
if(!param1 || param1->type != VAR_DYNAMIC)
exc = EX_MODPARAM;
else if(param2->type != VAR_NUMBER)
else if(!param2 || param2->type != VAR_NUMBER)
exc = EX_MODPARAM;
else
{
@@ -198,7 +198,7 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
}
}
/* ----------------------------------------------------------------------------------------------- */
else if(strncmp(e->fn, "getEnv", 6) == 0)
else if(modFnIs(e, "getEnv", 6))
{
p_etat->error = 0;
/* utilisation de dynRead qui fait le travail */
@@ -223,7 +223,7 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
}
}
/* ----------------------------------------------------------------------------------------------- */
else if(strncmp(e->fn, "createEnv", 9) == 0)
else if(modFnIs(e, "createEnv", 9))
{
p_etat->error = 0;
// setEnv(nom, valeur, overwritting)
@@ -258,7 +258,7 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
}
}
/* ----------------------------------------------------------------------------------------------- */
else if(strncmp(e->fn, "updateEnv", 9) == 0)
else if(modFnIs(e, "updateEnv", 9))
{
p_etat->error = 0;
// setEnv(nom, valeur, overwritting)
@@ -286,7 +286,7 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
}
}
/* ----------------------------------------------------------------------------------------------- */
else if(strncmp(e->fn, "deleteEnv", 9) == 0)
else if(modFnIs(e, "deleteEnv", 9))
{
p_etat->error = 0;
// setEnv(nom, valeur, overwritting)
@@ -312,7 +312,7 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
}
}
/* ----------------------------------------------------------------------------------------------- */
else if(strncmp(e->fn, "getOS", 5) == 0)
else if(modFnIs(e, "getOS", 5))
{
p_etat->error = 0;
// uname() donne les infos
@@ -341,7 +341,7 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
}
}
/* ----------------------------------------------------------------------------------------------- */
else if(strncmp(e->fn, "getHostname", 5) == 0)
else if(modFnIs(e, "getHostname", 11))
{
p_etat->error = 0;
// uname() donne les infos
@@ -424,7 +424,7 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
}
}
/* ----------------------------------------------------------------------------------------------- */
else if(strncmp(e->fn, "fork", 4) == 0)
else if(modFnIs(e, "fork", 4))
{
p_etat->error = 0;
#ifndef UNIX
@@ -446,7 +446,7 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
#endif
}
/* ----------------------------------------------------------------------------------------------- */
else if(strncmp(e->fn, "wait", 4) == 0)
else if(modFnIs(e, "wait", 4))
{
#ifndef UNIX
// faire differemment sous windows : pas de wait dispo ? WaitForSingleObject()
@@ -457,7 +457,7 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
#endif
}
/* ----------------------------------------------------------------------------------------------- */
else if(strncmp(e->fn, "kill", 4) == 0)
else if(modFnIs(e, "kill", 4))
{
#ifndef UNIX
// faire differemment sous windows : pas de kill dispo ?
@@ -466,7 +466,7 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
#endif
}
/* ----------------------------------------------------------------------------------------------- */
else if(strncmp(e->fn, "sleep", 5) == 0)
else if(modFnIs(e, "sleep", 5))
{
#ifdef WINLIB
if(param1->type != VAR_NUMBER)
+17 -17
View File
@@ -2,7 +2,7 @@
__ __ __
\ \/ \/ / W language
\ /\ /
\/ \/ Copyright 2024 lanisys.fr
\/ \/ Copyright 2024,2025 lanisys.fr
This file is part of W language.
@@ -329,7 +329,7 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
//
/* ----------------------------------------------------------------------------------------------- */
/* les 4 fonctions suivantes doivent toujours exister dans chaque module */
if(strncmp(e->fn, "init", 4) == 0)
if(modFnIs(e, "init", 4))
{
// alloc ptr sur zone memoire pour memoriser l'etat du module
*etat = memalloc(e, sizeof(modEtat));
@@ -346,7 +346,7 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
dynInit(e, &p_etat->valNum, DYN_LGMIN);
}
}
else if(strncmp(e->fn, "end", 3) == 0)
else if(modFnIs(e, "end", 3))
{
// liberation specifique au module avant arret process
if(p_etat != NULL)
@@ -355,7 +355,7 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
dynFree(e, &p_etat->horodate);
dynFree(e, &p_etat->valNum);
}
else if(strncmp(e->fn, "vers", 4) == 0)
else if(modFnIs(e, "vers", 4))
{
// renvoie la version du module/plugins
if(param1 == NULL)
@@ -367,7 +367,7 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
else
exc = EX_MODPARAM; // variable en parametre du mauvais type
}
else if(strncmp(e->fn, "error", 5) == 0)
else if(modFnIs(e, "error", 5))
{
// renvoie la derniere erreur specifique au module
if(p_etat == NULL)
@@ -383,7 +383,7 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
}
}
/* ============================================================================================= */
else if(strncmp(e->fn, "startChrono", 11) == 0)
else if(modFnIs(e, "startChrono", 11))
{
if(p_etat == NULL)
exc = EX_MODETAT;
@@ -401,7 +401,7 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
}
}
/* ----------------------------------------------------------------------------------------------- */
else if(strncmp(e->fn, "lapChrono", 9) == 0)
else if(modFnIs(e, "lapChrono", 9))
{
if(p_etat == NULL)
exc = EX_MODETAT;
@@ -420,7 +420,7 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
}
}
/* ----------------------------------------------------------------------------------------------- */
else if(strncmp(e->fn, "setUTC", 6) == 0)
else if(modFnIs(e, "setUTC", 6))
{
if(p_etat == NULL)
exc = EX_MODETAT;
@@ -448,7 +448,7 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
}
}
/* ----------------------------------------------------------------------------------------------- */
else if(strncmp(e->fn, "setLocal", 8) == 0)
else if(modFnIs(e, "setLocal", 8))
{
if(p_etat == NULL)
exc = EX_MODETAT;
@@ -483,7 +483,7 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
}
}
/* ----------------------------------------------------------------------------------------------- */
else if(strncmp(e->fn, "setNowLocal", 11) == 0)
else if(modFnIs(e, "setNowLocal", 11))
{
if(p_etat == NULL)
exc = EX_MODETAT;
@@ -511,7 +511,7 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
}
}
/* ----------------------------------------------------------------------------------------------- */
else if(strncmp(e->fn, "setNowUTC", 9) == 0)
else if(modFnIs(e, "setNowUTC", 9))
{
if(p_etat == NULL)
exc = EX_MODETAT;
@@ -533,7 +533,7 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
}
}
/* ----------------------------------------------------------------------------------------------- */
else if(strncmp(e->fn, "set", 3) == 0)
else if(modFnIs(e, "set", 3))
{
if(p_etat == NULL)
exc = EX_MODETAT;
@@ -566,7 +566,7 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
}
}
/* ----------------------------------------------------------------------------------------------- */
else if(strncmp(e->fn, "getUTC", 6) == 0)
else if(modFnIs(e, "getUTC", 6))
{
if(p_etat == NULL)
exc = EX_MODETAT;
@@ -586,7 +586,7 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
}
}
/* ----------------------------------------------------------------------------------------------- */
else if(strncmp(e->fn, "getLocal", 8) == 0)
else if(modFnIs(e, "getLocal", 8))
{
if(p_etat == NULL)
exc = EX_MODETAT;
@@ -612,7 +612,7 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
}
}
/* ----------------------------------------------------------------------------------------------- */
else if(strncmp(e->fn, "get", 3) == 0)
else if(modFnIs(e, "get", 3))
{
if(p_etat == NULL)
exc = EX_MODETAT;
@@ -635,7 +635,7 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
}
}
/* ----------------------------------------------------------------------------------------------- */
else if(strncmp(e->fn, "alarmUTCHM", 16) == 0)
else if(modFnIs(e, "alarmUTCHM", 10))
{
if(p_etat == NULL)
exc = EX_MODETAT;
@@ -673,7 +673,7 @@ extern long execModule(env * e, var * param1, var * param2, var * param3, void *
}
}
/* ----------------------------------------------------------------------------------------------- */
else if(strncmp(e->fn, "alarmLocalHM", 18) == 0)
else if(modFnIs(e, "alarmLocalHM", 12))
{
if(p_etat == NULL)
exc = EX_MODETAT;