| @@ -1,5 +1,15 @@ | |||||
| History of Nife releases : | 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. | 2014-06-27 - Nife 0.49 is released. | ||||
| * Add DEC, HEX, OCT and BIN functions to define the print mode for the | * Add DEC, HEX, OCT and BIN functions to define the print mode for the | ||||
| integers. The default is decimal. | integers. The default is decimal. | ||||
| @@ -1,6 +1,6 @@ | |||||
| #! /bin/sh | #! /bin/sh | ||||
| # Guess values for system-dependent variables and create Makefiles. | # 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>. | # Report bugs to <nife@seriane.fr>. | ||||
| # | # | ||||
| @@ -580,8 +580,8 @@ MAKEFLAGS= | |||||
| # Identity of this package. | # Identity of this package. | ||||
| PACKAGE_NAME='nife' | PACKAGE_NAME='nife' | ||||
| PACKAGE_TARNAME='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_BUGREPORT='nife@seriane.fr' | ||||
| PACKAGE_URL='' | 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. | # 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. | # This message is too long to be a string in the A/UX 3.1 sh. | ||||
| cat <<_ACEOF | 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]... | Usage: $0 [OPTION]... [VAR=VALUE]... | ||||
| @@ -1328,7 +1328,7 @@ fi | |||||
| if test -n "$ac_init_help"; then | if test -n "$ac_init_help"; then | ||||
| case $ac_init_help in | case $ac_init_help in | ||||
| short | recursive ) echo "Configuration of nife 0.49:";; | |||||
| short | recursive ) echo "Configuration of nife 0.51:";; | |||||
| esac | esac | ||||
| cat <<\_ACEOF | cat <<\_ACEOF | ||||
| @@ -1415,7 +1415,7 @@ fi | |||||
| test -n "$ac_init_help" && exit $ac_status | test -n "$ac_init_help" && exit $ac_status | ||||
| if $ac_init_version; then | if $ac_init_version; then | ||||
| cat <<\_ACEOF | cat <<\_ACEOF | ||||
| nife configure 0.49 | |||||
| nife configure 0.51 | |||||
| generated by GNU Autoconf 2.69 | generated by GNU Autoconf 2.69 | ||||
| Copyright (C) 2012 Free Software Foundation, Inc. | Copyright (C) 2012 Free Software Foundation, Inc. | ||||
| @@ -1838,7 +1838,7 @@ cat >config.log <<_ACEOF | |||||
| This file contains any messages produced by compilers while | This file contains any messages produced by compilers while | ||||
| running configure, to aid debugging if configure makes a mistake. | 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 | generated by GNU Autoconf 2.69. Invocation command line was | ||||
| $ $0 $@ | $ $0 $@ | ||||
| @@ -2653,7 +2653,7 @@ fi | |||||
| # Define the identity of the package. | # Define the identity of the package. | ||||
| PACKAGE='nife' | PACKAGE='nife' | ||||
| VERSION='0.49' | |||||
| VERSION='0.51' | |||||
| cat >>confdefs.h <<_ACEOF | 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 | # report actual input values of CONFIG_FILES etc. instead of their | ||||
| # values after options handling. | # values after options handling. | ||||
| ac_log=" | 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 | generated by GNU Autoconf 2.69. Invocation command line was | ||||
| CONFIG_FILES = $CONFIG_FILES | CONFIG_FILES = $CONFIG_FILES | ||||
| @@ -5546,7 +5546,7 @@ _ACEOF | |||||
| cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 | cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 | ||||
| ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" | ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" | ||||
| ac_cs_version="\\ | ac_cs_version="\\ | ||||
| nife config.status 0.49 | |||||
| nife config.status 0.51 | |||||
| configured by $0, generated by GNU Autoconf 2.69, | configured by $0, generated by GNU Autoconf 2.69, | ||||
| with options \\"\$ac_cs_config\\" | with options \\"\$ac_cs_config\\" | ||||
| @@ -2,7 +2,7 @@ | |||||
| # Process this file with autoconf to produce a configure script. | # Process this file with autoconf to produce a configure script. | ||||
| AC_PREREQ([2.67]) | AC_PREREQ([2.67]) | ||||
| AC_INIT([nife], [0.49], [nife@seriane.fr]) | |||||
| AC_INIT([nife], [0.51], [nife@seriane.fr]) | |||||
| AM_INIT_AUTOMAKE | AM_INIT_AUTOMAKE | ||||
| AC_CONFIG_SRCDIR([src/tasks.c]) | 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 | #ifdef HAVE_CONFIG_H | ||||
| #include "../config.h" | #include "../config.h" | ||||
| #else | #else | ||||
| #define VERSION "0.47" | |||||
| #define VERSION "0.51" | |||||
| #endif | #endif | ||||
| #ifdef HAVE_COMEDILIB_H | #ifdef HAVE_COMEDILIB_H | ||||
| @@ -32,9 +32,9 @@ int Debug=1; /* OK by default */ | |||||
| void D_Reset(void) | void D_Reset(void) | ||||
| { | { | ||||
| int fd; | |||||
| int fd, nc; | |||||
| char NF[24]; | char NF[24]; | ||||
| chdir(".nife"); | |||||
| nc=chdir(".nife"); | |||||
| if (Debug) { | if (Debug) { | ||||
| sprintf(NF,".nife_%d.log",getpid()); | sprintf(NF,".nife_%d.log",getpid()); | ||||
| if ((fd=open(NF,O_CREAT|O_RDWR|O_TRUNC,0644)) < 0) perror(NF); | if ((fd=open(NF,O_CREAT|O_RDWR|O_TRUNC,0644)) < 0) perror(NF); | ||||
| @@ -43,7 +43,7 @@ char NF[24]; | |||||
| close(fd); | close(fd); | ||||
| } | } | ||||
| } else dup2(1,2); | } else dup2(1,2); | ||||
| chdir(".."); | |||||
| nc=chdir(".."); | |||||
| } | } | ||||
| void D_Update(void) | void D_Update(void) | ||||
| @@ -134,6 +134,7 @@ void stopErr(char *M, char *F) | |||||
| static void traiteErr(int n, char * L) | static void traiteErr(int n, char * L) | ||||
| { | { | ||||
| int v; | |||||
| ERROR=n; | ERROR=n; | ||||
| if (D_Cod==0) { | if (D_Cod==0) { | ||||
| if (ECHOOFF) printf("\n"); | if (ECHOOFF) printf("\n"); | ||||
| @@ -155,7 +156,7 @@ static void traiteErr(int n, char * L) | |||||
| if (iTERM) { | if (iTERM) { | ||||
| printf("In loading stdin : line %d !\n", getFDlig()); | printf("In loading stdin : line %d !\n", getFDlig()); | ||||
| close(FD_IN); /* pipe ou autre */ | close(FD_IN); /* pipe ou autre */ | ||||
| dup(iTERM); /* stdin on term */ | |||||
| v = dup(iTERM); /* stdin on term */ | |||||
| iTERM = 0; | iTERM = 0; | ||||
| } | } | ||||
| } | } | ||||
| @@ -52,13 +52,13 @@ static void *stackGP = VIDE; | |||||
| /* file manipulations */ | /* file manipulations */ | ||||
| static void GPF_init(char *f) | static void GPF_init(char *f) | ||||
| { | { | ||||
| int fd, r; | |||||
| int fd, r, nc; | |||||
| r = chdir(".nife"); | r = chdir(".nife"); | ||||
| if ((fd = creat(f,0600)) != -1) { | 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); | close(fd); | ||||
| } | } | ||||
| if (r==0) chdir(".."); | |||||
| if (r==0) r=chdir(".."); | |||||
| } | } | ||||
| static void GPF_del(char *f) | static void GPF_del(char *f) | ||||
| @@ -157,6 +157,7 @@ int iTERM=0; | |||||
| void termInit(void) | void termInit(void) | ||||
| { | { | ||||
| int nc; | |||||
| for (iTERM=0; iTERM<3; iTERM++) { | for (iTERM=0; iTERM<3; iTERM++) { | ||||
| if (tcgetattr(iTERM, &t0) != -1) break; | if (tcgetattr(iTERM, &t0) != -1) break; | ||||
| if (iTERM<2) continue; | if (iTERM<2) continue; | ||||
| @@ -174,7 +175,7 @@ void termInit(void) | |||||
| t1.c_cflag |= CS8; | t1.c_cflag |= CS8; | ||||
| if (tcsetattr(iTERM, TCSAFLUSH, &t1) == -1) perror("tcsetattr"); /* raw */ | if (tcsetattr(iTERM, TCSAFLUSH, &t1) == -1) perror("tcsetattr"); /* raw */ | ||||
| /* clear screen */ | /* clear screen */ | ||||
| system("clear"); | |||||
| nc=system("clear"); | |||||
| } | } | ||||
| void termReset(void) | 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 */ | nc = nb de caracteres possible (longueur du buffer */ | ||||
| { | { | ||||
| char *d, *f, c, c2, c3, *h, *w, *Wl, *rac; | 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; | unsigned int j; | ||||
| /* printf("lireLigne ... \n"); */ | /* printf("lireLigne ... \n"); */ | ||||
| d = b; | d = b; | ||||
| @@ -330,8 +331,8 @@ unsigned int j; | |||||
| /* gestion des caracteres speciaux */ | /* gestion des caracteres speciaux */ | ||||
| case '\033': /* ESCAPE */ | case '\033': /* ESCAPE */ | ||||
| ignTild=1; | ignTild=1; | ||||
| read(fd,&c2,1); | |||||
| read(fd,&c3,1); | |||||
| Nc=read(fd,&c2,1); | |||||
| Nc=read(fd,&c3,1); | |||||
| if (c2 == '[') { | if (c2 == '[') { | ||||
| switch(c3) { | switch(c3) { | ||||
| case '2' : /* Insert */ | case '2' : /* Insert */ | ||||
| @@ -441,7 +442,7 @@ finBoucle: | |||||
| } | } | ||||
| if ((n<1) && iTERM) { | if ((n<1) && iTERM) { | ||||
| close(FD_IN); /* pipe ou autre */ | close(FD_IN); /* pipe ou autre */ | ||||
| dup(iTERM); /* stdin on term */ | |||||
| Nc=dup(iTERM); /* stdin on term */ | |||||
| iTERM = 0; | iTERM = 0; | ||||
| if (ECHOOFF) printf("\n"); | if (ECHOOFF) printf("\n"); | ||||
| return 0; | return 0; | ||||
| @@ -83,6 +83,12 @@ char *LMax; | |||||
| pLibs += strlen(l); | pLibs += strlen(l); | ||||
| *pLibs++ = '\0'; | *pLibs++ = '\0'; | ||||
| } | } | ||||
| void rmAllFonU(void) | |||||
| { | |||||
| while (Fonctions[NBFonc-1].fam == F_USR) NBFonc--; | |||||
| } | |||||
| static void addFonc(char *l, void (*f)(void)) | static void addFonc(char *l, void (*f)(void)) | ||||
| { | { | ||||
| addFoncT(l,f,0,F_CORE); | addFoncT(l,f,0,F_CORE); | ||||
| @@ -351,9 +357,11 @@ void initLib(void) | |||||
| addFonP("install",IF_INSTALL); | addFonP("install",IF_INSTALL); | ||||
| addFonP("install_f",IF_INSTALLF); | addFonP("install_f",IF_INSTALLF); | ||||
| addFonP("install_v",IF_INSTALLV); | addFonP("install_v",IF_INSTALLV); | ||||
| /* pas pour le moment !! | |||||
| addFonP("df_init",IF_DF_INIT); | addFonP("df_init",IF_DF_INIT); | ||||
| addFonP("df_start",IF_DF_START); | addFonP("df_start",IF_DF_START); | ||||
| addFonP("df_stop",IF_DF_STOP); | addFonP("df_stop",IF_DF_STOP); | ||||
| ****************/ | |||||
| addFonc("?ls",IF_show_stackL); | addFonc("?ls",IF_show_stackL); | ||||
| addFonc("?s",IF_show_stack); | addFonc("?s",IF_show_stack); | ||||
| /* addFonc("?libX",show_lib_addr); for debugging */ | /* addFonc("?libX",show_lib_addr); for debugging */ | ||||
| @@ -544,6 +552,10 @@ int i; | |||||
| } | } | ||||
| return VIDE; | return VIDE; | ||||
| } | } | ||||
| void * libByInd(long i) | |||||
| { | |||||
| return((void*)Fonctions[i].fct); | |||||
| } | |||||
| int execLibNrpc(char *C) | int execLibNrpc(char *C) | ||||
| { | { | ||||
| @@ -666,3 +678,14 @@ int i; | |||||
| return NULL; | 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 void initLib(void); | ||||
| extern int execLibNrpc(char * C); | extern int execLibNrpc(char * C); | ||||
| extern int execLib(char * C); | extern int execLib(char * C); | ||||
| extern void * libByInd(long i); | |||||
| extern char * libByAddr(void *A); | extern char * libByAddr(void *A); | ||||
| extern long iLibByAddr(void *A); | |||||
| extern void listLibBegin(char *b); | extern void listLibBegin(char *b); | ||||
| extern char * getLibBegin(char *b); | extern char * getLibBegin(char *b); | ||||
| extern int nbLibBegin(char *b, char **rac); | extern int nbLibBegin(char *b, char **rac); | ||||
| extern void addFonU(char *l, void *A); | extern void addFonU(char *l, void *A); | ||||
| extern void rmAllFonU(void); | |||||
| #endif | #endif | ||||
| @@ -208,54 +208,132 @@ int i=0; | |||||
| struct DumpEnt { | struct DumpEnt { | ||||
| double V; | double V; | ||||
| char L[4]; | |||||
| long Scs; | |||||
| char L[8]; | |||||
| uint32_t Scs; | |||||
| }; | }; | ||||
| /* Dump and Restore Nblf : Nife Binary Linkable Format */ | /* 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) | static void restoreFic(char *L) | ||||
| { | { | ||||
| int fd; | int fd; | ||||
| struct DumpEnt E; | struct DumpEnt E; | ||||
| char * F; | |||||
| dropTrSuite(); | 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); | messErr(43); | ||||
| } else { | } else { | ||||
| if (read(fd,(void*)&E, sizeof(E)) != sizeof(E)) { | |||||
| if (read(fd,(void*)&E, LENT) != LENT) { | |||||
| printf("File too small !\n"); | printf("File too small !\n"); | ||||
| messErr(59); | messErr(59); | ||||
| } else { | } 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)) { | 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_stackV(fd); | ||||
| restore_links_stackN(); | |||||
| restore_marque(fd, 'F'); | |||||
| restore_stackF(fd); | 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 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"); | } else printf("Not a NBLF File !\n"); | ||||
| close(fd); | close(fd); | ||||
| } | } | ||||
| } | } | ||||
| free((void*)F); | |||||
| } | } | ||||
| static void dumpFic(char *L) | static void dumpFic(char *L) | ||||
| { | { | ||||
| int fd; | int fd; | ||||
| struct DumpEnt E; | struct DumpEnt E; | ||||
| char * F; | |||||
| dropTrSuite(); | 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); | messErr(58); | ||||
| } else { | } else { | ||||
| strncpy(E.L,"Nblf", 4); | |||||
| strncpy(E.L,"Nblf010", 7); | |||||
| E.V=atof(VERSION); | E.V=atof(VERSION); | ||||
| E.Scs=(long)getScs(); | 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) | static void lectFic(char *L) | ||||
| @@ -42,5 +42,9 @@ extern void putTrSuite(PFC); | |||||
| extern void dropTrSuite(void); | extern void dropTrSuite(void); | ||||
| extern void compileFile(char *); | extern void compileFile(char *); | ||||
| extern PFC getTrSuite(void); | 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 | #endif | ||||
| @@ -241,3 +241,43 @@ void IF_debString(void) | |||||
| _MODIF_stringEnCours_(1); | _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_show_stackC(void); | ||||
| extern void IF_debString(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 | #endif | ||||
| @@ -109,6 +109,7 @@ int i,n; | |||||
| char *C, *E; | char *C, *E; | ||||
| void *A, *W; | void *A, *W; | ||||
| struct Fct *F, *FD; | struct Fct *F, *FD; | ||||
| if (AF == VIDE) return; | |||||
| F = (struct Fct *)AF; | F = (struct Fct *)AF; | ||||
| /* printf("updDynFct(%s) at 0x%lx\n", F->l, (long)F); */ | /* printf("updDynFct(%s) at 0x%lx\n", F->l, (long)F); */ | ||||
| if (F->c == VIDE) return; | if (F->c == VIDE) return; | ||||
| @@ -227,7 +228,7 @@ char Ctyp; | |||||
| printf(" %-25s%c %d octets\n",N->l,Ctyp,*((int*)N->c)); | printf(" %-25s%c %d octets\n",N->l,Ctyp,*((int*)N->c)); | ||||
| Next = N->n; | Next = N->n; | ||||
| } | } | ||||
| printf("<end of function list>\n"); | |||||
| printf("<end of functions stack>\n"); | |||||
| } | } | ||||
| static char cod[MAXCODE]; | static char cod[MAXCODE]; | ||||
| @@ -921,6 +922,36 @@ struct Fct * N; | |||||
| return VIDE; | 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 * fctByCode(void * C) | ||||
| { | { | ||||
| void * Next; | void * Next; | ||||
| @@ -1003,6 +1034,36 @@ struct Fct * N; | |||||
| return NULL; | 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) | char * codByAddr(void * A) | ||||
| { | { | ||||
| void * Next; | void * Next; | ||||
| @@ -1330,13 +1391,74 @@ void IF_debBackC1(void) | |||||
| putTrSuite(suiteBackC1); | 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) | 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; | int *av; | ||||
| void *Next, *A; | void *Next, *A; | ||||
| struct Fct * N; | struct Fct * N; | ||||
| char * C, *F, *D; | |||||
| char * C, *F; | |||||
| Next = stackF; | Next = stackF; | ||||
| while (Next != VIDE) { | while (Next != VIDE) { | ||||
| N = (struct Fct*) Next; | N = (struct Fct*) Next; | ||||
| @@ -1344,6 +1466,7 @@ char * C, *F, *D; | |||||
| Next = N->n; | Next = N->n; | ||||
| } | } | ||||
| write(fd, (void*)&n, sizeof(n)); | write(fd, (void*)&n, sizeof(n)); | ||||
| t = sizeof(A) + 1; | |||||
| for (i=n; i>0; i--) { | for (i=n; i>0; i--) { | ||||
| Next = stackF; | Next = stackF; | ||||
| j=0; | j=0; | ||||
| @@ -1353,35 +1476,139 @@ char * C, *F, *D; | |||||
| if (i==j) break; | if (i==j) break; | ||||
| Next = N->n; | Next = N->n; | ||||
| } | } | ||||
| updDynFct(Next,0); | |||||
| write(fd, (void*)&(N->typ), sizeof(N->typ)); | 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; | A = N->c; | ||||
| av = (int*)A; | av = (int*)A; | ||||
| vi = (long)*av++; /* i */ | vi = (long)*av++; /* i */ | ||||
| write(fd, (void*)&v, sizeof(v)); | |||||
| vv = vi / t; | |||||
| write(fd, (void*)&vv, sizeof(vv)); | |||||
| v = (long)*av++; /* ea */ | v = (long)*av++; /* ea */ | ||||
| write(fd, (void*)&v, sizeof(v)); | |||||
| vv = v / t; | |||||
| write(fd, (void*)&vv, sizeof(vv)); | |||||
| v = (long)*av++; /* Ea */ | 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)); | C = (char*)A+(3*sizeof(int)); | ||||
| D = C; | |||||
| F = C+vi; | 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) | void restore_stackF(int fd) | ||||
| { | { | ||||
| long n=0, i; | |||||
| uint32_t n=0, vv; | |||||
| long i, vi, v, pas, t; | |||||
| short typ; | 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; | 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++) { | 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 IF_DO_Show(void); | ||||
| extern void execCode(void *C); | extern void execCode(void *C); | ||||
| extern void * fctByName(char *L); | extern void * fctByName(char *L); | ||||
| extern void * fctByInd(long i); | |||||
| extern void * fctByCode(void *C); | extern void * fctByCode(void *C); | ||||
| extern void execFctV(void * A); | extern void execFctV(void * A); | ||||
| extern char * fctByAddr(void *A); | extern char * fctByAddr(void *A); | ||||
| extern long iFctByAddr(void *A); | |||||
| extern char * codByAddr(void *A); | extern char * codByAddr(void *A); | ||||
| extern void IF_nDO(void); | extern void IF_nDO(void); | ||||
| @@ -178,3 +178,24 @@ char s; | |||||
| } else printf("<end of logical stack>\n"); | } 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_false(void); | ||||
| extern void IF_show_stackL(void); | extern void IF_show_stackL(void); | ||||
| extern void dump_stackL(int fd); | |||||
| extern void restore_stackL(int fd); | |||||
| #endif | #endif | ||||
| @@ -494,7 +494,6 @@ int s; | |||||
| NElt->n = StackN; | NElt->n = StackN; | ||||
| NElt->t = Elt->t & ~MSK_V; /* au cas ou Var */ | NElt->t = Elt->t & ~MSK_V; /* au cas ou Var */ | ||||
| _MODIF_STACKN_(M); | _MODIF_STACKN_(M); | ||||
| ; | |||||
| } | } | ||||
| void IF_dup(void) | void IF_dup(void) | ||||
| @@ -1958,3 +1957,111 @@ void IF_TABProd(void) { TAB_Fct('*'); } | |||||
| void IF_TABSum(void) { TAB_Fct('+'); } | void IF_TABSum(void) { TAB_Fct('+'); } | ||||
| void IF_TABMinMax(void) { TAB_Fct('E'); } | 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_1(FILE * fd); | ||||
| extern void IF_inFile_1d(FILE * fd, char delim, int virg); | extern void IF_inFile_1d(FILE * fd, char delim, int virg); | ||||
| extern void IF_inFile_2(FILE * fd); | 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 is1Tab(void); | ||||
| extern int is2Tab(void); | extern int is2Tab(void); | ||||
| extern int isNTabSameDim(int n); | extern int isNTabSameDim(int n); | ||||
| @@ -117,6 +117,12 @@ extern void IF_TABProd(void); | |||||
| extern void IF_TABSum(void); | extern void IF_TABSum(void); | ||||
| extern void IF_TABMinMax(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 */ | /* net functions */ | ||||
| extern void IF_NetKey(void); | extern void IF_NetKey(void); | ||||
| extern void IF_NetErrVal(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_N 3 /* NUMBER */ | ||||
| #define VT_L 4 /* LIB FUNCTION */ | #define VT_L 4 /* LIB FUNCTION */ | ||||
| #define VT_F 5 /* USER 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) */ | #define VT_V 9 /* VARIABLE (for "install_v ... in" only) */ | ||||
| @@ -73,20 +74,26 @@ struct Var *vS, *vD; | |||||
| vD->a = duplicateNum(vS->a, 0); | vD->a = duplicateNum(vS->a, 0); | ||||
| } | } | ||||
| void initVar(char *Lib) | |||||
| void initVarSL(char *L) | |||||
| { | { | ||||
| void * M, *L; | |||||
| void * M; | |||||
| struct Var * N; | 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 = (struct Var*)M; | ||||
| N->l = (char*)L; | |||||
| N->l = L; | |||||
| N->n = stackV; | N->n = stackV; | ||||
| N->t = VT_I; | N->t = VT_I; | ||||
| stackV = M; | 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) | static void setCodeVar(struct Var * Elt, short t, void* A) | ||||
| { | { | ||||
| switch (Elt->t) { /* TODO VT_F */ | switch (Elt->t) { /* TODO VT_F */ | ||||
| @@ -147,49 +154,13 @@ struct Var * N; | |||||
| case VT_F : | case VT_F : | ||||
| printf("User Fct. %s", fctByAddr(N->a)); | printf("User Fct. %s", fctByAddr(N->a)); | ||||
| break; | break; | ||||
| default : | |||||
| printf("Undefined (%d) !??", N->t); | |||||
| } | } | ||||
| printf("\n"); | printf("\n"); | ||||
| Next = N->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) | static void newVar(char * S) | ||||
| @@ -201,19 +172,6 @@ char Lib[LDFLT+1]; | |||||
| dropTrSuite(); | 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) | void IF_debVar(void) | ||||
| { | { | ||||
| putTrSuite(newVar); | putTrSuite(newVar); | ||||
| @@ -267,6 +225,66 @@ struct Var * N; | |||||
| return NULL; | 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) | int isVarChar(void * A) | ||||
| { | { | ||||
| struct Var * N; | struct Var * N; | ||||
| @@ -440,3 +458,147 @@ struct Var * N; | |||||
| return 0; | 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 IF_delVar(void); | ||||
| extern void dump_stackV(int fd); | extern void dump_stackV(int fd); | ||||
| extern void restore_stackV(int fd); | extern void restore_stackV(int fd); | ||||
| extern void restore_links_stackV(void); | |||||
| extern void rmLastVar(void); | extern void rmLastVar(void); | ||||
| extern int IF_execVar(char *L); | extern int IF_execVar(char *L); | ||||
| extern int isVarChar(void *A); | extern int isVarChar(void *A); | ||||
| extern void * varByName(char *L); | extern void * varByName(char *L); | ||||
| extern char * varByAddr(void *A); | extern char * varByAddr(void *A); | ||||
| extern char * varByAddrA(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 putInVar(void *A, short t); | ||||
| extern void IF_setVarI(void); | extern void IF_setVarI(void); | ||||
| extern void IF_setVarB(void); | extern void IF_setVarB(void); | ||||