@@ -1,5 +1,15 @@ | |||
History of Nife releases : | |||
2014-08-31 - Nife 0.51 is released. | |||
* Finalising the version 1.0 of the functions dump and restore with the | |||
definition of the NBLF, Nife Binary Linkable Format. | |||
* Modify some labels to clarify the perception of internal mechanisms. | |||
* Some modifications to avoid unnecessary warnings at compilation. | |||
* Temporary suspension of some functions related to the dynamic aspect | |||
of the language because, used improperly, it could be dangerous. | |||
These functions will be include again, but with more explanations and | |||
examples. | |||
2014-06-27 - Nife 0.49 is released. | |||
* Add DEC, HEX, OCT and BIN functions to define the print mode for the | |||
integers. The default is decimal. | |||
@@ -1,6 +1,6 @@ | |||
#! /bin/sh | |||
# Guess values for system-dependent variables and create Makefiles. | |||
# Generated by GNU Autoconf 2.69 for nife 0.49. | |||
# Generated by GNU Autoconf 2.69 for nife 0.51. | |||
# | |||
# Report bugs to <nife@seriane.fr>. | |||
# | |||
@@ -580,8 +580,8 @@ MAKEFLAGS= | |||
# Identity of this package. | |||
PACKAGE_NAME='nife' | |||
PACKAGE_TARNAME='nife' | |||
PACKAGE_VERSION='0.49' | |||
PACKAGE_STRING='nife 0.49' | |||
PACKAGE_VERSION='0.51' | |||
PACKAGE_STRING='nife 0.51' | |||
PACKAGE_BUGREPORT='nife@seriane.fr' | |||
PACKAGE_URL='' | |||
@@ -1262,7 +1262,7 @@ if test "$ac_init_help" = "long"; then | |||
# Omit some internal or obsolete options to make the list less imposing. | |||
# This message is too long to be a string in the A/UX 3.1 sh. | |||
cat <<_ACEOF | |||
\`configure' configures nife 0.49 to adapt to many kinds of systems. | |||
\`configure' configures nife 0.51 to adapt to many kinds of systems. | |||
Usage: $0 [OPTION]... [VAR=VALUE]... | |||
@@ -1328,7 +1328,7 @@ fi | |||
if test -n "$ac_init_help"; then | |||
case $ac_init_help in | |||
short | recursive ) echo "Configuration of nife 0.49:";; | |||
short | recursive ) echo "Configuration of nife 0.51:";; | |||
esac | |||
cat <<\_ACEOF | |||
@@ -1415,7 +1415,7 @@ fi | |||
test -n "$ac_init_help" && exit $ac_status | |||
if $ac_init_version; then | |||
cat <<\_ACEOF | |||
nife configure 0.49 | |||
nife configure 0.51 | |||
generated by GNU Autoconf 2.69 | |||
Copyright (C) 2012 Free Software Foundation, Inc. | |||
@@ -1838,7 +1838,7 @@ cat >config.log <<_ACEOF | |||
This file contains any messages produced by compilers while | |||
running configure, to aid debugging if configure makes a mistake. | |||
It was created by nife $as_me 0.49, which was | |||
It was created by nife $as_me 0.51, which was | |||
generated by GNU Autoconf 2.69. Invocation command line was | |||
$ $0 $@ | |||
@@ -2653,7 +2653,7 @@ fi | |||
# Define the identity of the package. | |||
PACKAGE='nife' | |||
VERSION='0.49' | |||
VERSION='0.51' | |||
cat >>confdefs.h <<_ACEOF | |||
@@ -5480,7 +5480,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 | |||
# report actual input values of CONFIG_FILES etc. instead of their | |||
# values after options handling. | |||
ac_log=" | |||
This file was extended by nife $as_me 0.49, which was | |||
This file was extended by nife $as_me 0.51, which was | |||
generated by GNU Autoconf 2.69. Invocation command line was | |||
CONFIG_FILES = $CONFIG_FILES | |||
@@ -5546,7 +5546,7 @@ _ACEOF | |||
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 | |||
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" | |||
ac_cs_version="\\ | |||
nife config.status 0.49 | |||
nife config.status 0.51 | |||
configured by $0, generated by GNU Autoconf 2.69, | |||
with options \\"\$ac_cs_config\\" | |||
@@ -2,7 +2,7 @@ | |||
# Process this file with autoconf to produce a configure script. | |||
AC_PREREQ([2.67]) | |||
AC_INIT([nife], [0.49], [nife@seriane.fr]) | |||
AC_INIT([nife], [0.51], [nife@seriane.fr]) | |||
AM_INIT_AUTOMAKE | |||
AC_CONFIG_SRCDIR([src/tasks.c]) | |||
@@ -20,7 +20,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/> | |||
#ifdef HAVE_CONFIG_H | |||
#include "../config.h" | |||
#else | |||
#define VERSION "0.47" | |||
#define VERSION "0.51" | |||
#endif | |||
#ifdef HAVE_COMEDILIB_H | |||
@@ -32,9 +32,9 @@ int Debug=1; /* OK by default */ | |||
void D_Reset(void) | |||
{ | |||
int fd; | |||
int fd, nc; | |||
char NF[24]; | |||
chdir(".nife"); | |||
nc=chdir(".nife"); | |||
if (Debug) { | |||
sprintf(NF,".nife_%d.log",getpid()); | |||
if ((fd=open(NF,O_CREAT|O_RDWR|O_TRUNC,0644)) < 0) perror(NF); | |||
@@ -43,7 +43,7 @@ char NF[24]; | |||
close(fd); | |||
} | |||
} else dup2(1,2); | |||
chdir(".."); | |||
nc=chdir(".."); | |||
} | |||
void D_Update(void) | |||
@@ -134,6 +134,7 @@ void stopErr(char *M, char *F) | |||
static void traiteErr(int n, char * L) | |||
{ | |||
int v; | |||
ERROR=n; | |||
if (D_Cod==0) { | |||
if (ECHOOFF) printf("\n"); | |||
@@ -155,7 +156,7 @@ static void traiteErr(int n, char * L) | |||
if (iTERM) { | |||
printf("In loading stdin : line %d !\n", getFDlig()); | |||
close(FD_IN); /* pipe ou autre */ | |||
dup(iTERM); /* stdin on term */ | |||
v = dup(iTERM); /* stdin on term */ | |||
iTERM = 0; | |||
} | |||
} | |||
@@ -52,13 +52,13 @@ static void *stackGP = VIDE; | |||
/* file manipulations */ | |||
static void GPF_init(char *f) | |||
{ | |||
int fd, r; | |||
int fd, r, nc; | |||
r = chdir(".nife"); | |||
if ((fd = creat(f,0600)) != -1) { | |||
write(fd,"# Nife auto-generated GNUplot file !\n",37); | |||
nc=write(fd,"# Nife auto-generated GNUplot file !\n",37); | |||
close(fd); | |||
} | |||
if (r==0) chdir(".."); | |||
if (r==0) r=chdir(".."); | |||
} | |||
static void GPF_del(char *f) | |||
@@ -157,6 +157,7 @@ int iTERM=0; | |||
void termInit(void) | |||
{ | |||
int nc; | |||
for (iTERM=0; iTERM<3; iTERM++) { | |||
if (tcgetattr(iTERM, &t0) != -1) break; | |||
if (iTERM<2) continue; | |||
@@ -174,7 +175,7 @@ void termInit(void) | |||
t1.c_cflag |= CS8; | |||
if (tcsetattr(iTERM, TCSAFLUSH, &t1) == -1) perror("tcsetattr"); /* raw */ | |||
/* clear screen */ | |||
system("clear"); | |||
nc=system("clear"); | |||
} | |||
void termReset(void) | |||
@@ -204,7 +205,7 @@ int lireLigne(int fd, char *b, char *s, int nc) | |||
nc = nb de caracteres possible (longueur du buffer */ | |||
{ | |||
char *d, *f, c, c2, c3, *h, *w, *Wl, *rac; | |||
int n, i, l, ls=0, ins=0, ignTild=0, nbT=0; | |||
int n, i, l, ls=0, ins=0, ignTild=0, nbT=0, Nc; | |||
unsigned int j; | |||
/* printf("lireLigne ... \n"); */ | |||
d = b; | |||
@@ -330,8 +331,8 @@ unsigned int j; | |||
/* gestion des caracteres speciaux */ | |||
case '\033': /* ESCAPE */ | |||
ignTild=1; | |||
read(fd,&c2,1); | |||
read(fd,&c3,1); | |||
Nc=read(fd,&c2,1); | |||
Nc=read(fd,&c3,1); | |||
if (c2 == '[') { | |||
switch(c3) { | |||
case '2' : /* Insert */ | |||
@@ -441,7 +442,7 @@ finBoucle: | |||
} | |||
if ((n<1) && iTERM) { | |||
close(FD_IN); /* pipe ou autre */ | |||
dup(iTERM); /* stdin on term */ | |||
Nc=dup(iTERM); /* stdin on term */ | |||
iTERM = 0; | |||
if (ECHOOFF) printf("\n"); | |||
return 0; | |||
@@ -83,6 +83,12 @@ char *LMax; | |||
pLibs += strlen(l); | |||
*pLibs++ = '\0'; | |||
} | |||
void rmAllFonU(void) | |||
{ | |||
while (Fonctions[NBFonc-1].fam == F_USR) NBFonc--; | |||
} | |||
static void addFonc(char *l, void (*f)(void)) | |||
{ | |||
addFoncT(l,f,0,F_CORE); | |||
@@ -351,9 +357,11 @@ void initLib(void) | |||
addFonP("install",IF_INSTALL); | |||
addFonP("install_f",IF_INSTALLF); | |||
addFonP("install_v",IF_INSTALLV); | |||
/* pas pour le moment !! | |||
addFonP("df_init",IF_DF_INIT); | |||
addFonP("df_start",IF_DF_START); | |||
addFonP("df_stop",IF_DF_STOP); | |||
****************/ | |||
addFonc("?ls",IF_show_stackL); | |||
addFonc("?s",IF_show_stack); | |||
/* addFonc("?libX",show_lib_addr); for debugging */ | |||
@@ -544,6 +552,10 @@ int i; | |||
} | |||
return VIDE; | |||
} | |||
void * libByInd(long i) | |||
{ | |||
return((void*)Fonctions[i].fct); | |||
} | |||
int execLibNrpc(char *C) | |||
{ | |||
@@ -666,3 +678,14 @@ int i; | |||
return NULL; | |||
} | |||
long iLibByAddr(void *A) | |||
{ | |||
PFC f; | |||
int i; | |||
f = (PFC)A; | |||
for (i=0;i<NBFonc;i++) { | |||
if (f == (PFC)(Fonctions[i].fct)) return (long)i; | |||
} | |||
return 0L; | |||
} | |||
@@ -24,10 +24,13 @@ extern int InstallOn; | |||
extern void initLib(void); | |||
extern int execLibNrpc(char * C); | |||
extern int execLib(char * C); | |||
extern void * libByInd(long i); | |||
extern char * libByAddr(void *A); | |||
extern long iLibByAddr(void *A); | |||
extern void listLibBegin(char *b); | |||
extern char * getLibBegin(char *b); | |||
extern int nbLibBegin(char *b, char **rac); | |||
extern void addFonU(char *l, void *A); | |||
extern void rmAllFonU(void); | |||
#endif |
@@ -208,54 +208,132 @@ int i=0; | |||
struct DumpEnt { | |||
double V; | |||
char L[4]; | |||
long Scs; | |||
char L[8]; | |||
uint32_t Scs; | |||
}; | |||
/* Dump and Restore Nblf : Nife Binary Linkable Format */ | |||
#define LENT 20 | |||
#define LMARK 3 | |||
char * DumpRest_ext(char * L) | |||
{ | |||
void * M; | |||
char *F; | |||
if ((M = malloc(strlen(L)+5)) == NULL) stopErr("DumpRest_ext","malloc"); | |||
F = (char*)M; | |||
sprintf(F,"%s.nblf",L); | |||
return F; | |||
} | |||
void dump_marque(int fd, char C) | |||
{ | |||
char b[LMARK+1]; | |||
sprintf(b,"<%c>",C); | |||
if ((write (fd, (void*)b, LMARK)) != LMARK) | |||
stopErr("dump","marque"); | |||
} | |||
void restore_marque(int fd, char C) | |||
{ | |||
char b[LMARK+1]; | |||
/* printf("Restore %c ! \n", C); */ | |||
if ((read(fd, (void*)b, LMARK)) == LMARK) | |||
if (b[1] == C) return; | |||
stopErr("restore","marque"); | |||
} | |||
void rest_links_pr(int i, char *O, char *C) | |||
{ | |||
if (i) { | |||
printf("Linking %d %s", i, O); | |||
if (i > 1) printf("s"); | |||
printf(" to %s stack.\n",C); | |||
} | |||
} | |||
void dump_rest_pr(int T, int N, char * L) /* T=0 dump, T=1 restore */ | |||
{ | |||
if (T==0) printf("Dump "); | |||
printf("%d elt",N); | |||
if (N>1) printf("s"); | |||
printf(" for %s stack",L); | |||
if (T) printf(" restored"); | |||
printf(".\n"); | |||
} | |||
static void restoreFic(char *L) | |||
{ | |||
int fd; | |||
struct DumpEnt E; | |||
char * F; | |||
dropTrSuite(); | |||
if ((fd = open(L,O_RDONLY)) == -1) { | |||
perror(L); | |||
F = DumpRest_ext(L); | |||
if ((fd = open(F,O_RDONLY)) == -1) { | |||
perror(F); | |||
messErr(43); | |||
} else { | |||
if (read(fd,(void*)&E, sizeof(E)) != sizeof(E)) { | |||
if (read(fd,(void*)&E, LENT) != LENT) { | |||
printf("File too small !\n"); | |||
messErr(59); | |||
} else { | |||
if (strncmp(E.L,"Nblf", 4) == 0) { | |||
if (strncmp(E.L,"Nblf010", 7) == 0) { | |||
if (E.Scs == (long)getScs()) { | |||
if (E.V == atof(VERSION)) { | |||
restore_marque(fd, 'N'); | |||
restore_stackN(fd); | |||
restore_marque(fd, 'C'); | |||
restore_stackC(fd); | |||
restore_marque(fd, 'L'); | |||
restore_stackL(fd); | |||
restore_marque(fd, 'V'); | |||
restore_stackV(fd); | |||
restore_links_stackN(); | |||
restore_marque(fd, 'F'); | |||
restore_stackF(fd); | |||
restore_marque(fd, 'X'); | |||
restore_links_stackV(); | |||
} else printf("This file is just available for Nife v %g !\n",E.V); | |||
} else printf("This file have another SCS !\n"); | |||
} else printf("Not a NBLF File !\n"); | |||
close(fd); | |||
} | |||
} | |||
free((void*)F); | |||
} | |||
static void dumpFic(char *L) | |||
{ | |||
int fd; | |||
struct DumpEnt E; | |||
char * F; | |||
dropTrSuite(); | |||
if ((fd = open(L,O_CREAT|O_WRONLY,0600)) == -1) { | |||
perror(L); | |||
F = DumpRest_ext(L); | |||
if ((fd = open(F,O_CREAT|O_WRONLY,0600)) == -1) { | |||
perror(F); | |||
messErr(58); | |||
} else { | |||
strncpy(E.L,"Nblf", 4); | |||
strncpy(E.L,"Nblf010", 7); | |||
E.V=atof(VERSION); | |||
E.Scs=(long)getScs(); | |||
write(fd,(void*)&E, sizeof(E)); | |||
dump_stackV(fd); | |||
dump_stackF(fd); | |||
close(fd); | |||
if ((write(fd,(void*)&E, LENT)) == LENT) { | |||
dump_marque(fd, 'N'); | |||
dump_stackN(fd); | |||
dump_marque(fd, 'C'); | |||
dump_stackC(fd); | |||
dump_marque(fd, 'L'); | |||
dump_stackL(fd); | |||
dump_marque(fd, 'V'); | |||
dump_stackV(fd); | |||
dump_marque(fd, 'F'); | |||
dump_stackF(fd); | |||
dump_marque(fd, 'X'); | |||
close(fd); | |||
} else messErr(58); | |||
} | |||
free((void*)F); | |||
} | |||
static void lectFic(char *L) | |||
@@ -42,5 +42,9 @@ extern void putTrSuite(PFC); | |||
extern void dropTrSuite(void); | |||
extern void compileFile(char *); | |||
extern PFC getTrSuite(void); | |||
extern void dump_marque(int fd, char C); | |||
extern void restore_marque(int fd, char C); | |||
extern void dump_rest_pr(int T, int N, char * L); | |||
extern void rest_links_pr(int i, char *O, char *C); | |||
#endif |
@@ -241,3 +241,43 @@ void IF_debString(void) | |||
_MODIF_stringEnCours_(1); | |||
} | |||
void dump_eltC(int fd, char *A) | |||
{ | |||
uint32_t l; | |||
l=strlen(A); | |||
write(fd, (void*)&l, sizeof(l)); | |||
write(fd, A, l+1); | |||
} | |||
void dump_stackC(int fd) | |||
{ | |||
uint32_t n, i, l; | |||
n = i_StackC; | |||
write(fd, (void*)&n, sizeof(n)); | |||
for (i=0; i<n; i++) dump_eltC(fd, stackC[i]); | |||
dump_rest_pr(0,n,"character"); | |||
} | |||
char * restore_eltC(int fd) | |||
{ | |||
uint32_t l; | |||
void * M; | |||
read(fd, (void*)&l, sizeof(l)); | |||
if ((M = malloc(l+1)) == NULL) stopErr("restore_eltC","malloc"); | |||
read(fd, M, l+1); | |||
return (char*)M; | |||
} | |||
void restore_stackC(int fd) | |||
{ | |||
uint32_t n=0, i, j; | |||
if (read(fd, (void*)&n, sizeof(n)) != sizeof(n)) return; | |||
IF_stackC_clear(); | |||
for (i=0; i<n; i++) { | |||
j = i_StackC; | |||
stackC[j++] = restore_eltC(fd); | |||
_MODIF_i_StackC_(j); | |||
} | |||
dump_rest_pr(1,n,"character"); | |||
} | |||
@@ -35,4 +35,9 @@ extern void IF_dateC(void); | |||
extern void IF_show_stackC(void); | |||
extern void IF_debString(void); | |||
extern void dump_eltC(int fd, char*A); | |||
extern char * restore_eltC(int fd); | |||
extern void dump_stackC(int fd); | |||
extern void restore_stackC(int fd); | |||
#endif |
@@ -109,6 +109,7 @@ int i,n; | |||
char *C, *E; | |||
void *A, *W; | |||
struct Fct *F, *FD; | |||
if (AF == VIDE) return; | |||
F = (struct Fct *)AF; | |||
/* printf("updDynFct(%s) at 0x%lx\n", F->l, (long)F); */ | |||
if (F->c == VIDE) return; | |||
@@ -227,7 +228,7 @@ char Ctyp; | |||
printf(" %-25s%c %d octets\n",N->l,Ctyp,*((int*)N->c)); | |||
Next = N->n; | |||
} | |||
printf("<end of function list>\n"); | |||
printf("<end of functions stack>\n"); | |||
} | |||
static char cod[MAXCODE]; | |||
@@ -921,6 +922,36 @@ struct Fct * N; | |||
return VIDE; | |||
} | |||
void * codFctByInd(long i) | |||
{ | |||
void * Next; | |||
struct Fct * N; | |||
long j=0; | |||
Next = stackF; | |||
while (Next != VIDE) { | |||
N = (struct Fct*) Next; | |||
j++; | |||
if (i==j) return (N->c); | |||
Next = N->n; | |||
} | |||
return VIDE; | |||
} | |||
void * fctByInd(long i) | |||
{ | |||
void * Next; | |||
struct Fct * N; | |||
long j=0; | |||
Next = stackF; | |||
while (Next != VIDE) { | |||
N = (struct Fct*) Next; | |||
j++; | |||
if (i==j) return Next; | |||
Next = N->n; | |||
} | |||
return VIDE; | |||
} | |||
void * fctByCode(void * C) | |||
{ | |||
void * Next; | |||
@@ -1003,6 +1034,36 @@ struct Fct * N; | |||
return NULL; | |||
} | |||
long iFctByCode(void * A) | |||
{ | |||
void * Next; | |||
struct Fct * N; | |||
long i=0; | |||
Next = stackF; | |||
while (Next != VIDE) { | |||
i++; | |||
N = (struct Fct*) Next; | |||
if (N->c==A) return i; | |||
Next = N->n; | |||
} | |||
return 0L; | |||
} | |||
long iFctByAddr(void * A) | |||
{ | |||
void * Next; | |||
struct Fct * N; | |||
long i=0; | |||
Next = stackF; | |||
while (Next != VIDE) { | |||
i++; | |||
N = (struct Fct*) Next; | |||
if (Next==A) return i; | |||
Next = N->n; | |||
} | |||
return 0L; | |||
} | |||
char * codByAddr(void * A) | |||
{ | |||
void * Next; | |||
@@ -1330,13 +1391,74 @@ void IF_debBackC1(void) | |||
putTrSuite(suiteBackC1); | |||
} | |||
void dump_code(int fd, char * C) | |||
{ | |||
void * A; | |||
uint32_t i; | |||
write(fd, C, 1); | |||
bcopy((void*)(C+1),(void*)&A,sizeof(A)); | |||
switch((Code)*C) { | |||
case T_ONER : | |||
case T_RET : | |||
case T_END : | |||
case T_JEND : | |||
case T_NOP : | |||
case T_DO_I : | |||
case T_DO_J : | |||
case T_DO_K : | |||
case T_LOOP : | |||
case T_PLOO : | |||
case T_EXEK : | |||
break; /* nothing */ | |||
case T_NUM : | |||
dump_eltN(fd, A, 0); | |||
break; | |||
case T_CHA : | |||
case T_BKC : | |||
case T_BKC1 : | |||
dump_eltC(fd, (char*)A); | |||
break; | |||
case T_LIB : | |||
i = iLibByAddr(A); | |||
write(fd, (void*)&i, sizeof(i)); | |||
break; | |||
case T_FCT : | |||
i = iFctByCode(A); | |||
write(fd, (void*)&i, sizeof(i)); | |||
break; | |||
case T_VAR : | |||
i = iVarByAddr(A); | |||
write(fd, (void*)&i, sizeof(i)); | |||
break; | |||
case T_IF : | |||
case T_IFN : | |||
case T_DO : | |||
case T_IFD : | |||
case T_JMP : | |||
case T_GOTO : | |||
bcopy((void*)(C+1),(void*)&i,sizeof(i)); | |||
write(fd, (void*)&i, sizeof(i)); | |||
break; | |||
/* en principe pas possible !!! | |||
case T_FCTP : | |||
i = iFctByAddr(A); | |||
write(fd, (void*)&i, sizeof(i)); | |||
break; | |||
*********************/ | |||
default : | |||
printf("dump_code : Code %d inconnu !\n",(int)(*C)); | |||
messErr(58); | |||
} | |||
} | |||
void dump_stackF(int fd) | |||
{ | |||
long n=0, i, j, v, vi; | |||
uint32_t n=0, vv; | |||
long v, vi, i, j, pas, t; | |||
int *av; | |||
void *Next, *A; | |||
struct Fct * N; | |||
char * C, *F, *D; | |||
char * C, *F; | |||
Next = stackF; | |||
while (Next != VIDE) { | |||
N = (struct Fct*) Next; | |||
@@ -1344,6 +1466,7 @@ char * C, *F, *D; | |||
Next = N->n; | |||
} | |||
write(fd, (void*)&n, sizeof(n)); | |||
t = sizeof(A) + 1; | |||
for (i=n; i>0; i--) { | |||
Next = stackF; | |||
j=0; | |||
@@ -1353,35 +1476,139 @@ char * C, *F, *D; | |||
if (i==j) break; | |||
Next = N->n; | |||
} | |||
updDynFct(Next,0); | |||
write(fd, (void*)&(N->typ), sizeof(N->typ)); | |||
write(fd, (void*)(N->l), strlen(N->l)+1); | |||
dump_eltC(fd, N->l); | |||
A = N->c; | |||
av = (int*)A; | |||
vi = (long)*av++; /* i */ | |||
write(fd, (void*)&v, sizeof(v)); | |||
vv = vi / t; | |||
write(fd, (void*)&vv, sizeof(vv)); | |||
v = (long)*av++; /* ea */ | |||
write(fd, (void*)&v, sizeof(v)); | |||
vv = v / t; | |||
write(fd, (void*)&vv, sizeof(vv)); | |||
v = (long)*av++; /* Ea */ | |||
write(fd, (void*)&v, sizeof(v)); | |||
vv = v / t; | |||
write(fd, (void*)&vv, sizeof(vv)); | |||
C = (char*)A+(3*sizeof(int)); | |||
D = C; | |||
F = C+vi; | |||
pas = sizeof(A) + 1; | |||
while (C < F) { | |||
dump_code(fd, C); | |||
C += pas; | |||
} | |||
} | |||
dump_rest_pr(0,n,"user functions"); | |||
} | |||
void restore_links_stackF(void) | |||
{ | |||
void **ANext, *A; | |||
return; | |||
} | |||
static int NbARIV, NbARIL, NbARIF; | |||
void restore_code(int fd, char * b, long delta) | |||
{ | |||
void * A; | |||
uint32_t i; | |||
int nc; | |||
if ((read(fd, (void*)b, 1)) != 1) return; | |||
switch((Code)*b) { | |||
case T_NUM : | |||
A = restore_eltN(fd); | |||
bcopy((void*)(&A),(void*)(b+1),sizeof(A)); | |||
break; | |||
case T_CHA : | |||
case T_BKC : | |||
case T_BKC1 : | |||
A = (void*)restore_eltC(fd); | |||
bcopy((void*)(&A),(void*)(b+1),sizeof(A)); | |||
break; | |||
case T_LIB : | |||
nc = read(fd, (void*)&i, sizeof(i)); | |||
A = libByInd(i); | |||
bcopy((void*)(&A),(void*)(b+1),sizeof(A)); | |||
NbARIL++; | |||
break; | |||
case T_FCT : | |||
nc = read(fd, (void*)&i, sizeof(i)); | |||
A = codFctByInd(i-delta); | |||
/* printf("i=%d delta=%d A=%lx\n",i,delta,(long)A); */ | |||
bcopy((void*)(&A),(void*)(b+1),sizeof(A)); | |||
NbARIF++; | |||
break; | |||
case T_VAR : | |||
nc = read(fd, (void*)&i, sizeof(i)); | |||
A = varAddrByInd(i); | |||
bcopy((void*)(&A),(void*)(b+1),sizeof(A)); | |||
NbARIV++; | |||
break; | |||
case T_IF : | |||
case T_IFN : | |||
case T_DO : | |||
case T_IFD : | |||
case T_JMP : | |||
case T_GOTO : | |||
nc = read(fd, (void*)&i, sizeof(i)); | |||
bcopy((void*)(&i),(void*)(b+1),sizeof(i)); | |||
break; | |||
default : | |||
break; | |||
} | |||
/* printf("\tCODE=%d i=%d\n", (int)*b, (int)i); */ | |||
} | |||
void restore_stackF(int fd) | |||
{ | |||
long n=0, i; | |||
uint32_t n=0, vv; | |||
long i, vi, v, pas, t; | |||
short typ; | |||
char Lib[LDFLT+2], *b; | |||
char *Lib, *C, *F; | |||
void * M; | |||
struct Fct *Elt; | |||
int *bi, nc; | |||
if (read(fd, (void*)&n, sizeof(n)) != sizeof(n)) return; | |||
/* printf("Il y a %ld fonctions !\n",n); */ | |||
/* suppress all fcts */ | |||
rmAllFonU(); | |||
while (stackF != VIDE) { | |||
Elt = (struct Fct *)stackF; | |||
stackF = Elt->n; | |||
eraseFct(Elt); | |||
} | |||
/* printf("Nb fct : %d\n", n); */ | |||
NbARIV=NbARIF=NbARIL=0; | |||
t = sizeof(M) + 1; | |||
for (i=0; i<n; i++) { | |||
read(fd, (void*)&typ, sizeof(typ)); | |||
b=Lib; | |||
while(*b != '\0') read(fd,++b,1); | |||
/* printf("Fct %s (%d)\n", Lib+1, typ); */ | |||
nc = read(fd, (void*)&typ, sizeof(typ)); | |||
Lib = restore_eltC(fd); | |||
initFct(Lib,typ); | |||
nc=read(fd, (void*)&vv, sizeof(vv)); | |||
vi = vv * t; | |||
if ((M = malloc((3*sizeof(int))+vi)) == NULL) | |||
stopErr("restore_stackF","malloc"); | |||
bi = (int*)M; | |||
*bi++ = (int)vi; | |||
nc=read(fd, (void*)&vv, sizeof(vv)); | |||
v = vv * t; | |||
*bi++ = (int)v; | |||
/* printf("Nom=<%s> type=%d vi=%d v1=%d", Lib, typ, (int)vi, (int)v); */ | |||
nc=read(fd, (void*)&vv, sizeof(vv)); | |||
v = vv * t; | |||
*bi = (int)v; | |||
/* printf(" v2=%d\n", (int)v); */ | |||
C = (char*)M+(3*sizeof(int)); | |||
F = C+vi; | |||
pas = sizeof(M) + 1; | |||
putCodeFct(M); | |||
while (C < F) { | |||
restore_code(fd, C, n-(i+1)); | |||
C += pas; | |||
} | |||
} | |||
dump_rest_pr(1,n,"user functions"); | |||
rest_links_pr(NbARIV, "variable", "user functions"); | |||
rest_links_pr(NbARIL, "library function", "user functions"); | |||
rest_links_pr(NbARIF, "user function", "user functions"); | |||
} | |||
@@ -82,9 +82,11 @@ extern void IF_DO_Next(void); | |||
extern void IF_DO_Show(void); | |||
extern void execCode(void *C); | |||
extern void * fctByName(char *L); | |||
extern void * fctByInd(long i); | |||
extern void * fctByCode(void *C); | |||
extern void execFctV(void * A); | |||
extern char * fctByAddr(void *A); | |||
extern long iFctByAddr(void *A); | |||
extern char * codByAddr(void *A); | |||
extern void IF_nDO(void); | |||
@@ -178,3 +178,24 @@ char s; | |||
} else printf("<end of logical stack>\n"); | |||
} | |||
void dump_stackL(int fd) | |||
{ | |||
uint32_t n; | |||
n = i_StackL; | |||
write(fd, (void*)&n, sizeof(n)); | |||
if (n) write(fd, (void*)stackL, n); | |||
dump_rest_pr(0,n,"logical"); | |||
} | |||
void restore_stackL(int fd) | |||
{ | |||
uint32_t n=0; | |||
if (read(fd, (void*)&n, sizeof(n)) != sizeof(n)) return; | |||
IF_stackL_clear(); | |||
if (n) { | |||
read(fd, (void*)stackL, n); | |||
_MODIF_i_StackL_(n); | |||
} | |||
dump_rest_pr(1,n,"logical"); | |||
} |
@@ -37,4 +37,8 @@ extern void IF_true(void); | |||
extern void IF_false(void); | |||
extern void IF_show_stackL(void); | |||
extern void dump_stackL(int fd); | |||
extern void restore_stackL(int fd); | |||
#endif |
@@ -494,7 +494,6 @@ int s; | |||
NElt->n = StackN; | |||
NElt->t = Elt->t & ~MSK_V; /* au cas ou Var */ | |||
_MODIF_STACKN_(M); | |||
; | |||
} | |||
void IF_dup(void) | |||
@@ -1958,3 +1957,111 @@ void IF_TABProd(void) { TAB_Fct('*'); } | |||
void IF_TABSum(void) { TAB_Fct('+'); } | |||
void IF_TABMinMax(void) { TAB_Fct('E'); } | |||
#define LENT 20 | |||
void dump_eltN(int fd, void *A, uint32_t MSK) | |||
{ | |||
struct Num * N; | |||
long l; | |||
long long v; | |||
uint32_t t; | |||
N = (struct Num*)A; | |||
t = N->t; | |||
if ((MSK) && (t & MSK_V)) { | |||
v = (long long)iVarByAddrA(A); | |||
t = 1 | MSK_V; | |||
write(fd, (void*)&t, sizeof(t)); | |||
write(fd, (void*)&v, sizeof(v)); | |||
} else { | |||
/* t &= ~MSK_V; */ | |||
write(fd, (void*)&t, sizeof(t)); | |||
l = t & MSK_T; | |||
write(fd, (void*)&(N->l), (size_t)(l*sizeof(double))); | |||
} | |||
} | |||
static int NbARIV; | |||
void restore_links_stackN(void) | |||
{ | |||
void **ANext, *A; | |||
struct Num * N, *T; | |||
if (NbARIV == 0) return; | |||
ANext = &StackN; | |||
while (*ANext != VIDE) { | |||
N = (struct Num*) *ANext; | |||
if (N->t & MSK_V) { | |||
A = varAddrAByInd(N->l); | |||
T = (struct Num*) A; | |||
T->n = N->n; | |||
*ANext = A; | |||
free((void*)N); | |||
} | |||
ANext = &(N->n); | |||
} | |||
rest_links_pr(NbARIV, "variable", "numerical"); | |||
} | |||
void dump_stackN(int fd) | |||
{ | |||
void * Next; | |||
struct Num * N; | |||
uint32_t n=0; | |||
int i,j; | |||
Next = StackN; | |||
while (Next != VIDE) { | |||
N = (struct Num*) Next; | |||
n++; | |||
Next = N->n; | |||
} | |||
write(fd, (void*)&n, sizeof(n)); | |||
for (i=n; i>0; i--) { | |||
Next = StackN; | |||
j=0; | |||
while (Next != VIDE) { | |||
N = (struct Num*) Next; | |||
j++; | |||
if (i==j) break; | |||
Next = N->n; | |||
} | |||
dump_eltN(fd, Next, MSK_V); | |||
} | |||
dump_rest_pr(0,n,"numerical"); | |||
} | |||
static void * restore_eltN_l(int fd, int K) | |||
{ | |||
uint32_t t, u; | |||
int s; | |||
void * M; | |||
struct Num * N; | |||
read(fd, (void*)&t, sizeof(t)); | |||
u = t & MSK_T; | |||
if ((t & MSK_V) && K) NbARIV++; | |||
/* printf("%u : %d\n", u, NbARIV); /* debug */ | |||
s = sizeof(struct Num)+((u-1)*(sizeof(double))); | |||
if ((M = malloc(s)) == NULL) stopErr("restore_eltN","malloc"); | |||
N = (struct Num*)M; | |||
N->t = t; | |||
N->n = StackN; | |||
read(fd, (void*)&(N->l), u*sizeof(double)); | |||
return M; | |||
} | |||
void * restore_eltN(int fd) | |||
{ | |||
return restore_eltN_l(fd,0); | |||
} | |||
void restore_stackN(int fd) | |||
{ | |||
uint32_t n=0, i; | |||
void * M; | |||
NbARIV = 0; | |||
if (read(fd, (void*)&n, sizeof(n)) != sizeof(n)) return; | |||
IF_stack_clear(); | |||
for (i=0; i<n; i++) { | |||
M = restore_eltN_l(fd,1); | |||
_MODIF_STACKN_(M); | |||
} | |||
dump_rest_pr(1,n,"numerical"); | |||
} | |||
@@ -91,23 +91,23 @@ extern void IF_Linfeg(void); | |||
extern void IF_inFile_1(FILE * fd); | |||
extern void IF_inFile_1d(FILE * fd, char delim, int virg); | |||
extern void IF_inFile_2(FILE * fd); | |||
void IF_TShiftR(void); | |||
void IF_TShiftL(void); | |||
void IF_NTShiftR(void); | |||
void IF_NTShiftL(void); | |||
void IF_TNShiftR(void); | |||
void IF_TNShiftL(void); | |||
void IF_NTNShiftR(void); | |||
void IF_NTNShiftL(void); | |||
void IF_subTab(void); | |||
void IF_subTabR(void); | |||
void IF_NsubTab(void); | |||
void IF_NsubTabR(void); | |||
void IF_TabRev(void); | |||
void IF_NTabRev(void); | |||
void IF_TabTransp(void); | |||
void IF_TabTranspN(void); | |||
void IF_TabTranspT(void); | |||
extern void IF_TShiftR(void); | |||
extern void IF_TShiftL(void); | |||
extern void IF_NTShiftR(void); | |||
extern void IF_NTShiftL(void); | |||
extern void IF_TNShiftR(void); | |||
extern void IF_TNShiftL(void); | |||
extern void IF_NTNShiftR(void); | |||
extern void IF_NTNShiftL(void); | |||
extern void IF_subTab(void); | |||
extern void IF_subTabR(void); | |||
extern void IF_NsubTab(void); | |||
extern void IF_NsubTabR(void); | |||
extern void IF_TabRev(void); | |||
extern void IF_NTabRev(void); | |||
extern void IF_TabTransp(void); | |||
extern void IF_TabTranspN(void); | |||
extern void IF_TabTranspT(void); | |||
extern int is1Tab(void); | |||
extern int is2Tab(void); | |||
extern int isNTabSameDim(int n); | |||
@@ -117,6 +117,12 @@ extern void IF_TABProd(void); | |||
extern void IF_TABSum(void); | |||
extern void IF_TABMinMax(void); | |||
extern void dump_eltN(int fd, void *A, uint32_t M); | |||
extern void * restore_eltN(int fd); | |||
extern void dump_stackN(int fd); | |||
extern void restore_stackN(int fd); | |||
extern void restore_links_stackN(void); | |||
/* net functions */ | |||
extern void IF_NetKey(void); | |||
extern void IF_NetErrVal(void); | |||
@@ -38,6 +38,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/> | |||
#define VT_N 3 /* NUMBER */ | |||
#define VT_L 4 /* LIB FUNCTION */ | |||
#define VT_F 5 /* USER FUNCTION */ | |||
#define VT_XF 15 /* USER FUNCTION NOT IDENTIFIED during restore */ | |||
#define VT_V 9 /* VARIABLE (for "install_v ... in" only) */ | |||
@@ -73,20 +74,26 @@ struct Var *vS, *vD; | |||
vD->a = duplicateNum(vS->a, 0); | |||
} | |||
void initVar(char *Lib) | |||
void initVarSL(char *L) | |||
{ | |||
void * M, *L; | |||
void * M; | |||
struct Var * N; | |||
if ((M = malloc(sizeof(struct Var))) == NULL) stopErr("initVar","malloc"); | |||
if ((L = malloc(strlen(Lib)+1)) == NULL) stopErr("initVar","malloc"); | |||
strcpy((char*)L,Lib); | |||
if ((M = malloc(sizeof(struct Var))) == NULL) stopErr("initVarSL","malloc"); | |||
N = (struct Var*)M; | |||
N->l = (char*)L; | |||
N->l = L; | |||
N->n = stackV; | |||
N->t = VT_I; | |||
stackV = M; | |||
} | |||
void initVar(char *Lib) | |||
{ | |||
void *L; | |||
if ((L = malloc(strlen(Lib)+1)) == NULL) stopErr("initVar","malloc"); | |||
strcpy((char*)L,Lib); | |||
initVarSL((char*)L); | |||
} | |||
static void setCodeVar(struct Var * Elt, short t, void* A) | |||
{ | |||
switch (Elt->t) { /* TODO VT_F */ | |||
@@ -147,49 +154,13 @@ struct Var * N; | |||
case VT_F : | |||
printf("User Fct. %s", fctByAddr(N->a)); | |||
break; | |||
default : | |||
printf("Undefined (%d) !??", N->t); | |||
} | |||
printf("\n"); | |||
Next = N->n; | |||
} | |||
printf("<end of variable list>\n"); | |||
} | |||
void dump_stackV(int fd) | |||
{ | |||
void * Next, *A; | |||
char * noms, *pn; | |||
struct Var * N; | |||
long n, l, i; | |||
n=l=0; | |||
Next = stackV; | |||
while (Next != VIDE) { | |||
N = (struct Var*) Next; | |||
n++; | |||
l += (strlen(N->l)+1); | |||
Next = N->n; | |||
} | |||
l++; | |||
write(fd, (void*)&n, sizeof(n)); | |||
if (n>0) { | |||
if ((A = malloc(l)) == NULL) stopErr("dump_stackV","malloc"); | |||
noms = (char*)A; | |||
pn = noms; | |||
Next = stackV; | |||
while (Next != VIDE) { | |||
N = (struct Var*) Next; | |||
strcpy(pn,N->l); | |||
pn += (strlen(N->l)+1); | |||
Next = N->n; | |||
} | |||
/* on remonte la liste */ | |||
while (pn > noms) { | |||
pn -= 2; | |||
while (*pn != '\0') pn--; | |||
pn++; | |||
write (fd,pn,strlen(pn)+1); | |||
} | |||
free(A); | |||
} | |||
printf("<end of variables stack>\n"); | |||
} | |||
static void newVar(char * S) | |||
@@ -201,19 +172,6 @@ char Lib[LDFLT+1]; | |||
dropTrSuite(); | |||
} | |||
void restore_stackV(int fd) | |||
{ | |||
long n=0, i; | |||
char Lib[LDFLT+2], *b; | |||
if (read(fd, (void*)&n, sizeof(n)) != sizeof(n)) return; | |||
*Lib=' '; | |||
for (i=0; i<n; i++) { | |||
b=Lib; | |||
while(*b != '\0') read(fd,++b,1); | |||
initVar(Lib+1); | |||
} | |||
} | |||
void IF_debVar(void) | |||
{ | |||
putTrSuite(newVar); | |||
@@ -267,6 +225,66 @@ struct Var * N; | |||
return NULL; | |||
} | |||
long iVarByAddr(void * A) | |||
{ | |||
void * Next; | |||
struct Var * N; | |||
long i=0; | |||
Next = stackV; | |||
while (Next != VIDE) { | |||
i++; | |||
if (Next==A) return(i); | |||
N = (struct Var*) Next; | |||
Next = N->n; | |||
} | |||
return 0L; | |||
} | |||
long iVarByAddrA(void * A) | |||
{ | |||
void * Next; | |||
struct Var * N; | |||
long i=0; | |||
Next = stackV; | |||
while (Next != VIDE) { | |||
i++; | |||
N = (struct Var*) Next; | |||
if (N->a==A) return(i); | |||
Next = N->n; | |||
} | |||
return 0L; | |||
} | |||
void * varAddrByInd(long i) | |||
{ | |||
void * Next; | |||
struct Var * N; | |||
long j=0; | |||
Next = stackV; | |||
while (Next != VIDE) { | |||
j++; | |||
if (i==j) return(Next); | |||
N = (struct Var*) Next; | |||
Next = N->n; | |||
} | |||
return NULL; | |||
} | |||
void * varAddrAByInd(long i) | |||
{ | |||
void * Next; | |||
struct Var * N; | |||
long j=0; | |||
Next = stackV; | |||
while (Next != VIDE) { | |||
j++; | |||
N = (struct Var*) Next; | |||
if (i==j) return(N->a); | |||
Next = N->n; | |||
} | |||
return NULL; | |||
} | |||
int isVarChar(void * A) | |||
{ | |||
struct Var * N; | |||
@@ -440,3 +458,147 @@ struct Var * N; | |||
return 0; | |||
} | |||
void dump_eltV(int fd, void *A) | |||
{ | |||
struct Var * N; | |||
uint32_t a; | |||
int nc; | |||
N = (struct Var*)A; | |||
nc = write(fd, (void*)&(N->t), sizeof(N->t)); | |||
dump_eltC(fd, N->l); | |||
switch(N->t) { | |||
case VT_I : | |||
break; | |||
case VT_B : | |||
nc = write(fd, (void*)&(N->b), sizeof(N->b)); | |||
break; | |||
case VT_C : | |||
dump_eltC(fd, (char*)N->a); | |||
break; | |||
case VT_N : | |||
dump_eltN(fd, N->a, 0); | |||
break; | |||
case VT_L : | |||
a = iLibByAddr(N->a); | |||
nc = write(fd, (void*)&a, sizeof(a)); | |||
break; | |||
case VT_F : | |||
a = iFctByAddr(N->a); | |||
nc = write(fd, (void*)&a, sizeof(a)); | |||
break; | |||
default : | |||
printf("Var type %d !?\n", N->t); | |||
break; | |||
} | |||
} | |||
void dump_stackV(int fd) | |||
{ | |||
void * Next, *A; | |||
struct Var * N; | |||
uint32_t n=0; | |||
long l, i, j; | |||
int nc; | |||
Next = stackV; | |||
while (Next != VIDE) { | |||
N = (struct Var*) Next; | |||
n++; | |||
Next = N->n; | |||
} | |||
nc = write(fd, (void*)&n, sizeof(n)); | |||
for (i=n; i>0; i--) { | |||
Next = stackV; | |||
j=0; | |||
while (Next != VIDE) { | |||
N = (struct Var*) Next; | |||
j++; | |||
if (i==j) break; | |||
Next = N->n; | |||
} | |||
dump_eltV(fd, Next); | |||
} | |||
dump_rest_pr(0,n,"variables"); | |||
} | |||
void restore_links_stackV(void) | |||
{ | |||
void * Next; | |||
struct Var * N; | |||
long i, j=0; | |||
Next = stackV; | |||
while (Next != VIDE) { | |||
N = (struct Var*) Next; | |||
if (N->t == VT_XF) { | |||
i = (long)(N->a); | |||
N->a = fctByInd(i); | |||
N->t = VT_F; | |||
j++; | |||
} | |||
Next = N->n; | |||
} | |||
rest_links_pr(j, "user function", "variables"); | |||
} | |||
static int NbARIL; | |||
void restore_eltV(int fd) | |||
{ | |||
struct Var * N; | |||
short t; | |||
char *L; | |||
void *A; | |||
bool b; | |||
uint32_t i; | |||
long Vi; | |||
int nc; | |||
if (read(fd, (void*)&t, sizeof(t)) != sizeof(t)) return; | |||
L = restore_eltC(fd); | |||
initVarSL(L); | |||
/* printf("Var %s %d\n", L, t); */ | |||
N = (struct Var *)stackV; | |||
switch(t) { | |||
case VT_I : | |||
A = VIDE; | |||
break; | |||
case VT_B : | |||
A = VIDE; | |||
nc = read(fd, (void*)&b, sizeof(b)); | |||
break; | |||
case VT_C : | |||
A = (void*) restore_eltC(fd); | |||
break; | |||
case VT_N : | |||
A = restore_eltN(fd); | |||
break; | |||
case VT_L : | |||
nc = read(fd, (void*)&i, sizeof(i)); | |||
A = libByInd(i); | |||
NbARIL++; | |||
break; | |||
case VT_F : | |||
nc = read(fd, (void*)&i, sizeof(i)); | |||
/* A = fctByInd(i); not possible ! */ | |||
Vi = (long)i; | |||
A = (void*)Vi; | |||
t = VT_XF; | |||
break; | |||
default : | |||
printf("Var type %d !?\n", N->t); | |||
break; | |||
} | |||
setCodeVar(N, t, A); | |||
if (t == VT_B) N->b = b; | |||
} | |||
void restore_stackV(int fd) | |||
{ | |||
uint32_t n=0, i; | |||
if (read(fd, (void*)&n, sizeof(n)) != sizeof(n)) return; | |||
NbARIL=0; | |||
while (stackV != VIDE) rmVar(&stackV, (struct Var *)stackV); | |||
for (i=0; i<n; i++) { | |||
restore_eltV(fd); | |||
} | |||
dump_rest_pr(1,n,"variables"); | |||
rest_links_pr(NbARIL, "library function", "variables"); | |||
} | |||
@@ -24,12 +24,17 @@ extern void IF_show_stackV(void); | |||
extern void IF_delVar(void); | |||
extern void dump_stackV(int fd); | |||
extern void restore_stackV(int fd); | |||
extern void restore_links_stackV(void); | |||
extern void rmLastVar(void); | |||
extern int IF_execVar(char *L); | |||
extern int isVarChar(void *A); | |||
extern void * varByName(char *L); | |||
extern char * varByAddr(void *A); | |||
extern char * varByAddrA(void *A); | |||
extern long iVarByAddrA(void *A); | |||
extern long iVarByAddr(void *A); | |||
extern void * varAddrByInd(long i); | |||
extern void * varAddrAByInd(long i); | |||
extern void putInVar(void *A, short t); | |||
extern void IF_setVarI(void); | |||
extern void IF_setVarB(void); | |||