Compare commits
7
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3384b0df85 | ||
|
|
fcb62ff71c | ||
|
|
0871ed56fc | ||
|
|
a6f8d2aefa | ||
|
|
ba010944e2 | ||
|
|
2b076ebd18 | ||
|
|
7cdd94920e |
No files matched your search
@@ -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
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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
|
||||
@@ -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
@@ -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)
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
__ __ __
|
||||
\ \/ \/ / W language
|
||||
\ /\ /
|
||||
\/ \/ Copyright 2024 lanisys.fr
|
||||
\/ \/ Copyright 2024,2025 lanisys.fr
|
||||
|
||||
This file is part of W language.
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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, ®les, 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, ®les, "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, ®les);
|
||||
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;
|
||||
|
||||
@@ -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.) */
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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 ?
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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, ¶m1);
|
||||
cpop(e, ¶m1); // seule exception possible ici : EX_BUFOVF car pas/plus de parametre empile
|
||||
if(!e->exception) p1 = ¶m1;
|
||||
cpop(e, ¶m2);
|
||||
if(!e->exception) p2 = ¶m2;
|
||||
cpop(e, ¶m3);
|
||||
if(!e->exception) p3 = ¶m3;
|
||||
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)
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
__ __ __
|
||||
\ \/ \/ / W language
|
||||
\ /\ /
|
||||
\/ \/ Copyright 2024 lanisys.fr
|
||||
\/ \/ Copyright 2024,2025 lanisys.fr
|
||||
|
||||
This file is part of W language.
|
||||
|
||||
|
||||
@@ -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
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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
@@ -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;
|
||||
|
||||
@@ -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;)
|
||||
|
||||
@@ -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);
|
||||
@@ -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;
|
||||
}
|
||||
/* **************************************************************************************************** */
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in new issue
Block a user