* bug 7599 fixed - Intersci-n and intersci did not create code from a .desc file... 49/1549/3
Pierre MARECHAL [Mon, 16 Aug 2010 09:55:55 +0000 (11:55 +0200)]
Change-Id: I7c9304dcca1f27591dda1cd6e105a1df1ee5e48c

scilab/CHANGES_5.3.X
scilab/modules/intersci/src/exe/intersci.c
scilab/modules/intersci/src/exe/read.c
scilab/modules/intersci/tests/nonreg_tests/bug_7599.c [new file with mode: 0644]
scilab/modules/intersci/tests/nonreg_tests/bug_7599.desc [new file with mode: 0644]
scilab/modules/intersci/tests/nonreg_tests/bug_7599.dia.ref [new file with mode: 0644]
scilab/modules/intersci/tests/nonreg_tests/bug_7599.tst [new file with mode: 0644]

index 76342fd..17ad306 100644 (file)
@@ -79,6 +79,9 @@ Bug Fixes:
 
 * bug 7519 fixed - Help page of getcallbackobject() did not describe input argument.
 
+* bug 7599 fixed - Intersci-n and intersci did not create code from a .desc file
+                   if it was not ended by an empty line.
+
 * bug 7601 fixed - call_scilab C functions did not check if engine was started.
 
 * bug 7611 fixed - The cross to close a subwindow and the little arrow to undock
index 52966c9..5aa1c5b 100644 (file)
@@ -1,14 +1,14 @@
 /*
- * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
- * Copyright (C) ????-2008 - INRIA
- *
- * This file must be used under the terms of the CeCILL.
- * This source file is licensed as described in the file COPYING, which
- * you should have received as part of this distribution.  The terms
- * are also available at
- * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
- *
- */
+* Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+* Copyright (C) ????-2008 - INRIA
+*
+* This file must be used under the terms of the CeCILL.
+* This source file is licensed as described in the file COPYING, which
+* you should have received as part of this distribution.  The terms
+* are also available at
+* http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+*
+*/
 
 
 #ifdef _MSC_VER
@@ -34,131 +34,131 @@ static void SciEnv ();
 #endif
 
 int main(argc,argv)
-     unsigned int argc;
-     char **argv;
+unsigned int argc;
+char **argv;
 {
-  int InterFace = 0 ;
+    int InterFace = 0 ;
 #ifdef _MSC_VER
-  SciEnv();
+    SciEnv();
 #endif
-  switch (argc) {
+    switch (argc) {
   case 2:
-    InterFace = 0; break;
+      InterFace = 0; break;
   case 3:
-    InterFace = atoi(argv[2]);break;
+      InterFace = atoi(argv[2]);break;
   default:
-    printf("usage:  intersci <interface file> <interface number>\n");
-    exit(1);
-    break;
-  }
-  basfun = BasfunAlloc();
-  if (basfun == 0) {
-    printf("Running out of memory\n");
-    exit(1);
-  }
-  forsub = ForsubAlloc();
-  if (forsub == 0) {
-    printf("Running out of memory\n");
-    exit(1);
-  }
-  ISCIReadFile(argv[1]);
-  GenFundef(argv[1],InterFace);
-  return 0;
+      printf("usage:  intersci <interface file> <interface number>\n");
+      exit(1);
+      break;
+    }
+    basfun = BasfunAlloc();
+    if (basfun == 0) {
+        printf("Running out of memory\n");
+        exit(1);
+    }
+    forsub = ForsubAlloc();
+    if (forsub == 0) {
+        printf("Running out of memory\n");
+        exit(1);
+    }
+    ISCIReadFile(argv[1]);
+    GenFundef(argv[1],InterFace);
+    return 0;
 }
 
 void ISCIReadFile(file)
-     char *file;
+char *file;
 {
-  FILE *fin, *fout, *foutv;
-  char filout[MAXNAM];
-  char filin[MAXNAM];
-  sprintf(filin,"%s.desc",file);
-  fin = fopen(filin,"r");
-  if (fin == 0) {
-    printf("Interface file \"%s\" does not exist\n",filin);
-    exit(1);
-  }
-  Copyright();
-  strcpy(filout,file);
-  strcat(filout,".f");
-  fout = fopen(filout,"w");
-  strcpy(filout,file);
-  strcat(filout,".tmp");
-  foutv = fopen(filout,"w");
-  InitDeclare();
-  nFun = 0;
-  while(ReadFunction(fin)) {
-    nFun++;
-    if (nFun > MAXFUN) {
-      printf("Too many SCILAB functions. The maximum is %d\n",MAXFUN);
-      exit(1);
+    FILE *fin, *fout, *foutv;
+    char filout[MAXNAM];
+    char filin[MAXNAM];
+    sprintf(filin,"%s.desc",file);
+    fin = fopen(filin,"r");
+    if (fin == 0) {
+        printf("Interface file \"%s\" does not exist\n",filin);
+        exit(1);
     }
-    ResetDeclare();
-    /* first pass to collect declarations */
-    pass=0;
-    WriteFunctionCode(foutv);
-    /* cleaning added Fornames before pass 2 */
-    ForNameClean();
-    /* scond pass to produce code */
-    pass=1;
-    WriteFunctionCode(fout);
-    /** WriteInfoCode(fout); **/
-  }
-  WriteMain(fout,file);
-  printf("FORTRAN file \"%s.f\" has been created\n",file);
-  WriteAddInter(file) ;
-  printf("Scilab file \"%s.sce\" has been created\n",file);
-  fclose(fout);
-  fclose(fin);
+    Copyright();
+    strcpy(filout,file);
+    strcat(filout,".f");
+    fout = fopen(filout,"w");
+    strcpy(filout,file);
+    strcat(filout,".tmp");
+    foutv = fopen(filout,"w");
+    InitDeclare();
+    nFun = 0;
+    while(ReadFunction(fin)) {
+        nFun++;
+        if (nFun > MAXFUN) {
+            printf("Too many SCILAB functions. The maximum is %d\n",MAXFUN);
+            exit(1);
+        }
+        ResetDeclare();
+        /* first pass to collect declarations */
+        pass=0;
+        WriteFunctionCode(foutv);
+        /* cleaning added Fornames before pass 2 */
+        ForNameClean();
+        /* scond pass to produce code */
+        pass=1;
+        WriteFunctionCode(fout);
+        /** WriteInfoCode(fout); **/
+    }
+    WriteMain(fout,file);
+    printf("FORTRAN file \"%s.f\" has been created\n",file);
+    WriteAddInter(file) ;
+    printf("Scilab file \"%s.sce\" has been created\n",file);
+    fclose(fout);
+    fclose(fin);
 }
 
 void WriteMain(f,file)
-     FILE *f;
-     char* file;
+FILE *f;
+char* file;
 {
-  int i;
-  FCprintf(f,"\nc  interface function\n");
-  FCprintf(f,"c   ********************\n");
-  WriteMainHeader(f,file);
-  Fprintf(f,indent,"goto (");
-  for (i = 1; i < nFun ; i++) {
-    Fprintf(f,indent,"%d,",i);
-  }
-  Fprintf(f,indent,"%d) fin\nreturn\n",nFun);
-  for (i = 0; i < nFun; i++) {
-    FCprintf(f,"%d      call ints%s('%s')\n",i+1,funNames[i],funNames[i]);
-    Fprintf(f,indent,"return\n");
-  }
-  Fprintf(f,indent,"end\n");
+    int i;
+    FCprintf(f,"\nc  interface function\n");
+    FCprintf(f,"c   ********************\n");
+    WriteMainHeader(f,file);
+    Fprintf(f,indent,"goto (");
+    for (i = 1; i < nFun ; i++) {
+        Fprintf(f,indent,"%d,",i);
+    }
+    Fprintf(f,indent,"%d) fin\nreturn\n",nFun);
+    for (i = 0; i < nFun; i++) {
+        FCprintf(f,"%d      call ints%s('%s')\n",i+1,funNames[i],funNames[i]);
+        Fprintf(f,indent,"return\n");
+    }
+    Fprintf(f,indent,"end\n");
 }
 
 void WriteAddInter(file)
-     char *file;
+char *file;
 {
-  FILE *fout;
-  int i;
-  char filout[MAXNAM];
-  strcpy(filout,file);
-  strcat(filout,".sce");
-  fout = fopen(filout,"w");
-  if ( fout != (FILE*) 0)
+    FILE *fout;
+    int i;
+    char filout[MAXNAM];
+    strcpy(filout,file);
+    strcat(filout,".sce");
+    fout = fopen(filout,"w");
+    if ( fout != (FILE*) 0)
     {
- fprintf(fout,"// Addinter for file %s\n",file);
- fprintf(fout,"// for hppa/sun-solaris/linux/dec\n");
- fprintf(fout,"//--------------------------------\n");
- fprintf(fout,"//Scilab functions\n");
- fprintf(fout,"%s_funs=[...\n",file);
- for (i = 0; i < nFun -1; i++)
-      fprintf(fout,"  '%s';\n",funNames[i]);
-      fprintf(fout,"  '%s']\n",funNames[nFun-1]);
- fprintf(fout,"// interface file to link: ifile='%s.o'\n",file);
- fprintf(fout,"// user's files to link: ufiles=['file1.o','file2.o',....]\n");
- fprintf(fout,"// files = [ifile,ufiles]\n");
- fprintf(fout,"addinter(files,'%s',%s_funs);\n",file,file);
- fclose(fout);
-    }
-  else
-    fprintf(stderr,"Can't open file %s\n",file);
+        fprintf(fout,"// Addinter for file %s\n",file);
+        fprintf(fout,"// for hppa/sun-solaris/linux/dec\n");
+        fprintf(fout,"//--------------------------------\n");
+        fprintf(fout,"//Scilab functions\n");
+        fprintf(fout,"%s_funs=[...\n",file);
+        for (i = 0; i < nFun -1; i++)
+            fprintf(fout,"  '%s';\n",funNames[i]);
+        fprintf(fout,"  '%s']\n",funNames[nFun-1]);
+        fprintf(fout,"// interface file to link: ifile='%s.o'\n",file);
+        fprintf(fout,"// user's files to link: ufiles=['file1.o','file2.o',....]\n");
+        fprintf(fout,"// files = [ifile,ufiles]\n");
+        fprintf(fout,"addinter(files,'%s',%s_funs);\n",file,file);
+        fclose(fout);
+    }
+    else
+        fprintf(stderr,"Can't open file %s\n",file);
 }
 
 
@@ -166,1590 +166,1605 @@ void WriteAddInter(file)
 
 void Copyright()
 {
-  printf("\nINTERSCI Version %s (%s)\n",VERSION,DATE);
-  printf("    Copyright (C) INRIA All rights reserved\n\n");
+    printf("\nINTERSCI Version %s (%s)\n",VERSION,DATE);
+    printf("    Copyright (C) INRIA All rights reserved\n\n");
 }
 
 /**********************************************************
- *Reading the intersci description file
- **********************************************************/
+*Reading the intersci description file
+**********************************************************/
 
 int ReadFunction(f)
-     FILE *f;
+FILE *f;
 {
-  int i, j, l, type, ftype;
-  char s[MAXLINE];
-  char str[MAXNAM];
-  char *words[MAXLINE];
-  char *optwords[MAXLINE];
-  IVAR ivar;
-  int nwords, line1, inbas, fline1, infor, nopt, out1;
-
-  nVariable = 0;
-  maxOpt = 0;
-  line1 = 1;
-  inbas = 0;
-  fline1 = 0;
-  infor = 0;
-  out1 = 0;
-  while (fgets(s,MAXLINE,f))
+    int i, j, l, type, ftype;
+    char s[MAXLINE];
+    char str[MAXNAM];
+    char *words[MAXLINE];
+    char *optwords[MAXLINE];
+    IVAR ivar;
+    int nwords, line1, inbas, fline1, infor, nopt, out1;
+
+    nVariable = 0;
+    maxOpt = 0;
+    line1 = 1;
+    inbas = 0;
+    fline1 = 0;
+    infor = 0;
+    out1 = 0;
+    while (fgets(s,MAXLINE,f))
     {
-      /* analysis of one line */
-      if (line1 != 1) nwords = ParseLine(s,words);
-      else nwords = ParseScilabLine(s,words);
-      /* end of description */
-      if (words[0][0] == '*') return(1);
-      if (line1 == 1)
-       {
-         /* SCILAB function description */
-         if ((int)strlen(words[0]) > nlgh)
-           {
-             printf("SCILAB function name too long: \"%s\"\n",words[0]);
-             exit(1);
-           }
-         basfun->name = (char *)malloc((unsigned)(strlen(words[0])+1));
-         strcpy(basfun->name,words[0]);
-         printf("**************************\n");
-         printf("processing SCILAB function \"%s\"\n",words[0]);
-         funNames[nFun] = basfun->name;
-         i = nwords - 1;
-         if (i > MAXARG)
-           {
-             printf("too may input arguments for SCILAB function\"%s\"\n",
-                    words[0]);
-             printf("  augment constant \"MAXARG\" and recompile intersci\n");
-             exit(1);
-           }
-         basfun->nin = i;
-         for (i = 0; i < nwords - 1; i++)
-           {
-             if (words[i+1][0] == '{')
-               {
-                 maxOpt++;
-                 nopt = ParseLine(words[i+1]+1,optwords);
-                 if (nopt != 2) {
-                   printf("Bad syntax for optional argument. Two variables needed\n");
-                   exit(1);
-                 }
-                 ivar = GetVar(optwords[0],1);
-                 basfun->in[i] = ivar;
-                 variables[ivar-1]->opt_type = NAME;
-                 variables[ivar-1]->opt_name =
-                   (char *)malloc((unsigned)(strlen(optwords[1])+1));
-                 strcpy(variables[ivar-1]->opt_name,optwords[1]);
-               }
-             else if (words[i+1][0] == '[')
-               {
-                 maxOpt++;
-                 nopt = ParseLine(words[i+1]+1,optwords);
-                 if (nopt != 2)
-                   {
-                     printf("Bad syntax for optional argument. Two variables needed\n");
-                     exit(1);
-                   }
-                 ivar = GetVar(optwords[0],1);
-                 basfun->in[i] = ivar;
-                 variables[ivar-1]->opt_type = VALUE;
-                 variables[ivar-1]->opt_name =
-                   (char *)malloc((unsigned)(strlen(optwords[1])+1));
-                 strcpy(variables[ivar-1]->opt_name,optwords[1]);
-               }
-             else basfun->in[i] = GetVar(words[i+1],1);
-           }
-         line1 = 0;
-         inbas = 1;
-       }
-      else if (inbas == 1)
-       {
-         if (nwords == 0)
-           {
-             /* end of SCILAB variable description */
-             inbas = 0;
-             fline1 = 1;
-           }
-         else
-           {
-             /* SCILAB variable description */
-             ivar = GetVar(words[0],1);
-             i = ivar - 1;
-             if (nwords == 1)
-               {
-                 printf("type missing for variable \"%s\"\n",words[0]);
-                 exit(1);
-               }
-             type = GetBasType(words[1]);
-             variables[i]->type = type;
-             switch (type)
-               {
-               case SCALAR:
-               case ANY:
-               case SCIMPOINTER:
-               case SCISMPOINTER:
-               case SCILPOINTER:
-               case SCIBPOINTER:
-               case SCIOPOINTER:
-                 break;
-               case COLUMN:
-               case ROW:
-               case STRING:
-               case WORK:
-               case VECTOR:
-                 if (nwords != 3)
-                   {
-                     printf("bad type specification for variable \"%s\"\n", words[0]);
-                     printf("only %d argument given and %d are expected\n", nwords,3);
-                     exit(1);
-                   }
-                 variables[i]->el[0] = GetVar(words[2],1);
-                 break;
-               case LIST:
-               case TLIST:
-                 if (nwords != 3)
-                   {
-                     printf("bad type specification for variable \"%s\"\n", words[0]);
-                     printf("only %d argument given and %d are expected\n", nwords,3);
-                     exit(1);
-                   }
-                 ReadListFile(words[2],words[0],i);
-                 break;
-               case POLYNOM:
-               case MATRIX:
-               case BMATRIX:
-               case STRINGMAT:
-                 if (nwords != 4)
-                   {
-                     printf("bad type specification for variable \"%s\"\n",words[0]);
-                     printf("%d argument given and %d are expected\n", nwords,4);
-                     exit(1);
-                   }
-                 variables[i]->el[0] = GetVar(words[2],1);
-                 variables[i]->el[1] = GetVar(words[3],1);
-                 break;
-               case IMATRIX:
-                 if (nwords != 5)
-                   {
-                     printf("bad type specification for variable \"%s\"\n",words[0]);
-                     printf("%d argument given and %d are expected\n", nwords,5);
-                     exit(1);
-                   }
-                 variables[i]->el[0] = GetVar(words[2],1);
-                 variables[i]->el[1] = GetVar(words[3],1);
-                 variables[i]->el[2] = GetVar(words[4],1);
-                 break;
-               case SPARSE:
-                 if (nwords != 6)
-                   {
-                     printf("bad type specification for variable \"%s\"\n",words[0]);
-                     printf("%d argument given and %d are expected\n", nwords,6);
-                     printf("name sparse m n nel it\n");
-                     exit(1);
-                   }
-                 variables[i]->el[0] = GetVar(words[2],1);
-                 variables[i]->el[1] = GetVar(words[3],1);
-                 variables[i]->el[2] = GetVar(words[4],1);
-                 variables[i]->el[3] = GetVar(words[5],1);
-                 break;
-               case SEQUENCE:
-                 printf("variable \"%s\" cannot have type \"SEQUENCE\"\n",
-                        words[0]);
-                 exit(1);
-                 break;
-               case EMPTY:
-                 printf("variable \"%s\" cannot have type \"EMPTY\"\n",
-                        words[0]);
-                 exit(1);
-                 break;
-               }
-           }
-       }
-      else if (fline1 == 1)
-       {
-         /* FORTRAN subroutine description */
-         forsub->name = (char *)malloc((unsigned)(strlen(words[0])+1));
-         strcpy(forsub->name,words[0]);
-         i = nwords - 1;
-         if (i > MAXARG)
-           {
-             printf("too many argument for FORTRAN subroutine \"%s\"\n",
-                    words[0]);
-             printf("  augment constant \"MAXARG\" and recompile intersci\n");
-             exit(1);
-           }
-         forsub->narg = i;
-         for (i = 0; i < nwords - 1; i++)
-           {
-             forsub->arg[i] = GetExistVar(words[i+1]);
-           }
-         fline1 = 0;
-         infor = 1;
-       }
-      else if (infor == 1)
-       {
-         if (nwords == 0)
-           {
-             /* end of FORTRAN subroutine description */
-             infor = 0;
-             out1 = 1;
-           }
-         else
-           {
-             /* FORTRAN variable description */
-             if (nwords == 1)
-               {
-                 printf("type missing for FORTRAN argument \"%s\"\n",
-                        words[0]);
-                 exit(1);
-               }
-             ivar = GetExistVar(words[0]);
-             ftype = GetForType(words[1]);
-             variables[ivar-1]->for_type = ftype;
-             if (ftype == EXTERNAL)
-               {
-                 strcpy((char *)(variables[ivar-1]->fexternal),words[1]);
-                 switch (variables[ivar-1]->type)
-                   {
-                   case COLUMN:
-                   case POLYNOM:
-                   case ROW:
-                   case STRING:
-                   case VECTOR:
-                     sprintf(str,"ne%d",ivar);
-                     AddForName(variables[ivar-1]->el[0],str);
-                     break;
-                   case SPARSE:
-                     sprintf(str,"me%d",ivar);
-                     AddForName(variables[ivar-1]->el[0],str);
-                     sprintf(str,"ne%d",ivar);
-                     AddForName(variables[ivar-1]->el[1],str);
-                     sprintf(str,"nel%d",ivar);
-                     AddForName(variables[ivar-1]->el[2],str);
-                     sprintf(str,"it%d",ivar);
-                     AddForName(variables[ivar-1]->el[3],str);
-                     break;
-                   case IMATRIX:
-                     sprintf(str,"me%d",ivar);
-                     AddForName(variables[ivar-1]->el[0],str);
-                     sprintf(str,"ne%d",ivar);
-                     AddForName(variables[ivar-1]->el[1],str);
-                     sprintf(str,"it%d",ivar);
-                     AddForName(variables[ivar-1]->el[2],str);
-                     break;
-                   case MATRIX:
-                   case BMATRIX:
-                   case STRINGMAT:
-                     sprintf(str,"me%d",ivar);
-                     AddForName(variables[ivar-1]->el[0],str);
-                     sprintf(str,"ne%d",ivar);
-                     AddForName(variables[ivar-1]->el[1],str);
-                     break;
-                   default:
-                     printf("FORTRAN argument \"%s\" with external type \"%s\"\n",
-                            variables[ivar-1]->name,words[1]);
-                     printf("  cannot have a variable type of \"%s\"\n",SGetSciType(variables[ivar-1]->type));
-                     exit(1);
-                     break;
-                   }
-               }
-           }
-       }
-      else if (out1 == 1)
-       {
-         /* output variable description */
-         i = ivar - 1;
-         if (nwords == 1)
-           {
-             printf("type missing for output variable \"out\"\n");
-             exit(1);
-           }
-         ivar = GetOutVar(words[0]);
-         basfun->out = ivar;
-         i = ivar - 1;
-         type = GetBasType(words[1]);
-         variables[i]->type = type;
-         switch (type)
-           {
-           case LIST:
-           case TLIST:
-           case SEQUENCE:
-             l = nwords - 2;
-             if (l > MAXEL)
-               {
-                 printf("list or sequence too long for output variable \"out\"\n");
-                 printf("  augment constant \"MAXEL\" and recompile intersci\n");
-                 exit(1);
-               }
-             for (j = 0; j < l; j++)
-               variables[i]->el[j] = GetExistVar(words[j+2]);
-             variables[i]->length = l;
-             break;
-           case EMPTY:
-             break;
-           default:
-             printf("output variable \"out\" of SCILAB function\n");
-             printf("  must have type \"LIST\", \"TLIST\", \"SEQUENCE\" or\n");
-             printf("  \"EMPTY\"\n");
-             exit(1);
-             break;
-           }
-         out1 = 0;
-       }
-      else
-       {
-         /* possibly equal variables */
-         ivar = GetExistVar(words[0]);
-         i = ivar -1 ;
-         variables[i]->equal = GetExistVar(words[1]);
-       }
-    }
-  /* end of description file */
-  return(0);
+        /* analysis of one line */
+        if (line1 != 1) nwords = ParseLine(s,words);
+        else nwords = ParseScilabLine(s,words);
+        /* end of description */
+        if (words[0][0] == '*') return(1);
+        if (line1 == 1)
+        {
+            /* SCILAB function description */
+            if ((int)strlen(words[0]) > nlgh)
+            {
+                printf("SCILAB function name too long: \"%s\"\n",words[0]);
+                exit(1);
+            }
+            basfun->name = (char *)malloc((unsigned)(strlen(words[0])+1));
+            strcpy(basfun->name,words[0]);
+            printf("**************************\n");
+            printf("processing SCILAB function \"%s\"\n",words[0]);
+            funNames[nFun] = basfun->name;
+            i = nwords - 1;
+            if (i > MAXARG)
+            {
+                printf("too may input arguments for SCILAB function\"%s\"\n",
+                    words[0]);
+                printf("  augment constant \"MAXARG\" and recompile intersci\n");
+                exit(1);
+            }
+            basfun->nin = i;
+            for (i = 0; i < nwords - 1; i++)
+            {
+                if (words[i+1][0] == '{')
+                {
+                    maxOpt++;
+                    nopt = ParseLine(words[i+1]+1,optwords);
+                    if (nopt != 2) {
+                        printf("Bad syntax for optional argument. Two variables needed\n");
+                        exit(1);
+                    }
+                    ivar = GetVar(optwords[0],1);
+                    basfun->in[i] = ivar;
+                    variables[ivar-1]->opt_type = NAME;
+                    variables[ivar-1]->opt_name =
+                        (char *)malloc((unsigned)(strlen(optwords[1])+1));
+                    strcpy(variables[ivar-1]->opt_name,optwords[1]);
+                }
+                else if (words[i+1][0] == '[')
+                {
+                    maxOpt++;
+                    nopt = ParseLine(words[i+1]+1,optwords);
+                    if (nopt != 2)
+                    {
+                        printf("Bad syntax for optional argument. Two variables needed\n");
+                        exit(1);
+                    }
+                    ivar = GetVar(optwords[0],1);
+                    basfun->in[i] = ivar;
+                    variables[ivar-1]->opt_type = VALUE;
+                    variables[ivar-1]->opt_name =
+                        (char *)malloc((unsigned)(strlen(optwords[1])+1));
+                    strcpy(variables[ivar-1]->opt_name,optwords[1]);
+                }
+                else basfun->in[i] = GetVar(words[i+1],1);
+            }
+            line1 = 0;
+            inbas = 1;
+        }
+        else if (inbas == 1)
+        {
+            if (nwords == 0)
+            {
+                /* end of SCILAB variable description */
+                inbas = 0;
+                fline1 = 1;
+            }
+            else
+            {
+                /* SCILAB variable description */
+                ivar = GetVar(words[0],1);
+                i = ivar - 1;
+                if (nwords == 1)
+                {
+                    printf("type missing for variable \"%s\"\n",words[0]);
+                    exit(1);
+                }
+                type = GetBasType(words[1]);
+                variables[i]->type = type;
+                switch (type)
+                {
+                case SCALAR:
+                case ANY:
+                case SCIMPOINTER:
+                case SCISMPOINTER:
+                case SCILPOINTER:
+                case SCIBPOINTER:
+                case SCIOPOINTER:
+                    break;
+                case COLUMN:
+                case ROW:
+                case STRING:
+                case WORK:
+                case VECTOR:
+                    if (nwords != 3)
+                    {
+                        printf("bad type specification for variable \"%s\"\n", words[0]);
+                        printf("only %d argument given and %d are expected\n", nwords,3);
+                        exit(1);
+                    }
+                    variables[i]->el[0] = GetVar(words[2],1);
+                    break;
+                case LIST:
+                case TLIST:
+                    if (nwords != 3)
+                    {
+                        printf("bad type specification for variable \"%s\"\n", words[0]);
+                        printf("only %d argument given and %d are expected\n", nwords,3);
+                        exit(1);
+                    }
+                    ReadListFile(words[2],words[0],i);
+                    break;
+                case POLYNOM:
+                case MATRIX:
+                case BMATRIX:
+                case STRINGMAT:
+                    if (nwords != 4)
+                    {
+                        printf("bad type specification for variable \"%s\"\n",words[0]);
+                        printf("%d argument given and %d are expected\n", nwords,4);
+                        exit(1);
+                    }
+                    variables[i]->el[0] = GetVar(words[2],1);
+                    variables[i]->el[1] = GetVar(words[3],1);
+                    break;
+                case IMATRIX:
+                    if (nwords != 5)
+                    {
+                        printf("bad type specification for variable \"%s\"\n",words[0]);
+                        printf("%d argument given and %d are expected\n", nwords,5);
+                        exit(1);
+                    }
+                    variables[i]->el[0] = GetVar(words[2],1);
+                    variables[i]->el[1] = GetVar(words[3],1);
+                    variables[i]->el[2] = GetVar(words[4],1);
+                    break;
+                case SPARSE:
+                    if (nwords != 6)
+                    {
+                        printf("bad type specification for variable \"%s\"\n",words[0]);
+                        printf("%d argument given and %d are expected\n", nwords,6);
+                        printf("name sparse m n nel it\n");
+                        exit(1);
+                    }
+                    variables[i]->el[0] = GetVar(words[2],1);
+                    variables[i]->el[1] = GetVar(words[3],1);
+                    variables[i]->el[2] = GetVar(words[4],1);
+                    variables[i]->el[3] = GetVar(words[5],1);
+                    break;
+                case SEQUENCE:
+                    printf("variable \"%s\" cannot have type \"SEQUENCE\"\n",
+                        words[0]);
+                    exit(1);
+                    break;
+                case EMPTY:
+                    printf("variable \"%s\" cannot have type \"EMPTY\"\n",
+                        words[0]);
+                    exit(1);
+                    break;
+                }
+            }
+        }
+        else if (fline1 == 1)
+        {
+            /* FORTRAN subroutine description */
+            forsub->name = (char *)malloc((unsigned)(strlen(words[0])+1));
+            strcpy(forsub->name,words[0]);
+            i = nwords - 1;
+            if (i > MAXARG)
+            {
+                printf("too many argument for FORTRAN subroutine \"%s\"\n",
+                    words[0]);
+                printf("  augment constant \"MAXARG\" and recompile intersci\n");
+                exit(1);
+            }
+            forsub->narg = i;
+            for (i = 0; i < nwords - 1; i++)
+            {
+                forsub->arg[i] = GetExistVar(words[i+1]);
+            }
+            fline1 = 0;
+            infor = 1;
+        }
+        else if (infor == 1)
+        {
+            if (nwords == 0)
+            {
+                /* end of FORTRAN subroutine description */
+                infor = 0;
+                out1 = 1;
+            }
+            else
+            {
+                /* FORTRAN variable description */
+                if (nwords == 1)
+                {
+                    printf("type missing for FORTRAN argument \"%s\"\n",
+                        words[0]);
+                    exit(1);
+                }
+                ivar = GetExistVar(words[0]);
+                ftype = GetForType(words[1]);
+                variables[ivar-1]->for_type = ftype;
+                if (ftype == EXTERNAL)
+                {
+                    strcpy((char *)(variables[ivar-1]->fexternal),words[1]);
+                    switch (variables[ivar-1]->type)
+                    {
+                    case COLUMN:
+                    case POLYNOM:
+                    case ROW:
+                    case STRING:
+                    case VECTOR:
+                        sprintf(str,"ne%d",ivar);
+                        AddForName(variables[ivar-1]->el[0],str);
+                        break;
+                    case SPARSE:
+                        sprintf(str,"me%d",ivar);
+                        AddForName(variables[ivar-1]->el[0],str);
+                        sprintf(str,"ne%d",ivar);
+                        AddForName(variables[ivar-1]->el[1],str);
+                        sprintf(str,"nel%d",ivar);
+                        AddForName(variables[ivar-1]->el[2],str);
+                        sprintf(str,"it%d",ivar);
+                        AddForName(variables[ivar-1]->el[3],str);
+                        break;
+                    case IMATRIX:
+                        sprintf(str,"me%d",ivar);
+                        AddForName(variables[ivar-1]->el[0],str);
+                        sprintf(str,"ne%d",ivar);
+                        AddForName(variables[ivar-1]->el[1],str);
+                        sprintf(str,"it%d",ivar);
+                        AddForName(variables[ivar-1]->el[2],str);
+                        break;
+                    case MATRIX:
+                    case BMATRIX:
+                    case STRINGMAT:
+                        sprintf(str,"me%d",ivar);
+                        AddForName(variables[ivar-1]->el[0],str);
+                        sprintf(str,"ne%d",ivar);
+                        AddForName(variables[ivar-1]->el[1],str);
+                        break;
+                    default:
+                        printf("FORTRAN argument \"%s\" with external type \"%s\"\n",
+                            variables[ivar-1]->name,words[1]);
+                        printf("  cannot have a variable type of \"%s\"\n",SGetSciType(variables[ivar-1]->type));
+                        exit(1);
+                        break;
+                    }
+                }
+            }
+        }
+        else if (out1 == 1)
+        {
+            /* output variable description */
+            i = ivar - 1;
+            if (nwords == 1)
+            {
+                printf("type missing for output variable \"out\"\n");
+                exit(1);
+            }
+            ivar = GetOutVar(words[0]);
+            basfun->out = ivar;
+            i = ivar - 1;
+            type = GetBasType(words[1]);
+            variables[i]->type = type;
+            switch (type)
+            {
+            case LIST:
+            case TLIST:
+            case SEQUENCE:
+                l = nwords - 2;
+                if (l > MAXEL)
+                {
+                    printf("list or sequence too long for output variable \"out\"\n");
+                    printf("  augment constant \"MAXEL\" and recompile intersci\n");
+                    exit(1);
+                }
+                for (j = 0; j < l; j++)
+                    variables[i]->el[j] = GetExistVar(words[j+2]);
+                variables[i]->length = l;
+                break;
+            case EMPTY:
+                break;
+            default:
+                printf("output variable \"out\" of SCILAB function\n");
+                printf("  must have type \"LIST\", \"TLIST\", \"SEQUENCE\" or\n");
+                printf("  \"EMPTY\"\n");
+                exit(1);
+                break;
+            }
+            out1 = 0;
+        }
+        else
+        {
+            /* possibly equal variables */
+            ivar = GetExistVar(words[0]);
+            i = ivar -1 ;
+            variables[i]->equal = GetExistVar(words[1]);
+        }
+    }
+    /* end of description file */
+    return(0);
 }
 
 /*
-  put the words of SCILAB function description line "s" in "words" and
-  return the number of words with checking syntax of optional variables:
-  "{g  the_g }" => 1 word "{g  the_g\n"
-  "[f v]" => 1 word "[f v\n"
-  */
+put the words of SCILAB function description line "s" in "words" and
+return the number of words with checking syntax of optional variables:
+"{g  the_g }" => 1 word "{g  the_g\n"
+"[f v]" => 1 word "[f v\n"
+*/
 
 int ParseScilabLine(char *s,char *words[])
 {
-  char w[MAXNAM];
-  int nwords = 0;
-  int inword = 1;
-  int inopt1 = 0; /* {  } */
-  int inopt2 = 0; /* [  ] */
-  int i = 0;
-  if (*s == ' ' || *s == '\t') inword = 0;
-  if (*s == '{') inopt1 = 1;
-  if (*s == '[') inopt2 = 1;
-  while (*s) {
-    if (inopt1) {
-      w[i++] = *s++;
-      if (*s == '{' || *s == '[' || *s == ']' || *s == '\n') {
-       printf("Bad syntax for optional argument. No matching \"}\"\n");
-       exit(1);
-      }
-      else if (*s == '}') {
-       w[i++] = '\n';
-       w[i] = '\0';
-       words[nwords] = (char *)malloc((unsigned)(i+1));
-       strcpy(words[nwords],w);
-       nwords++;
-       inopt1 = 0;
-       inword = 0;
-      }
-    }
-    else if (inopt2) {
-      w[i++] = *s++;
-      if (*s == '[' || *s == '{' || *s == '}' || *s == '\n') {
-       printf("Bad syntax for optional argument. No matching \"]\"\n");
-       exit(1);
-      }
-      else if (*s == ']') {
-       w[i++] = '\n';
-       w[i] = '\0';
-       words[nwords] = (char *)malloc((unsigned)(i+1));
-       strcpy(words[nwords],w);
-       nwords++;
-       inopt2 = 0;
-       inword = 0;
-      }
+    char w[MAXNAM];
+    int nwords = 0;
+    int inword = 1;
+    int inopt1 = 0; /* {  } */
+    int inopt2 = 0; /* [  ] */
+    int i = 0;
+    if (*s == ' ' || *s == '\t') inword = 0;
+    if (*s == '{') inopt1 = 1;
+    if (*s == '[') inopt2 = 1;
+    while (*s) {
+        if (inopt1) {
+            w[i++] = *s++;
+            if (*s == '{' || *s == '[' || *s == ']' || *s == '\n') {
+                printf("Bad syntax for optional argument. No matching \"}\"\n");
+                exit(1);
+            }
+            else if (*s == '}') {
+                w[i++] = '\n';
+                w[i] = '\0';
+                words[nwords] = (char *)malloc((unsigned)(i+1));
+                strcpy(words[nwords],w);
+                nwords++;
+                inopt1 = 0;
+                inword = 0;
+            }
+        }
+        else if (inopt2) {
+            w[i++] = *s++;
+            if (*s == '[' || *s == '{' || *s == '}' || *s == '\n') {
+                printf("Bad syntax for optional argument. No matching \"]\"\n");
+                exit(1);
+            }
+            else if (*s == ']') {
+                w[i++] = '\n';
+                w[i] = '\0';
+                words[nwords] = (char *)malloc((unsigned)(i+1));
+                strcpy(words[nwords],w);
+                nwords++;
+                inopt2 = 0;
+                inword = 0;
+            }
+        }
+        else if (inword) {
+            w[i++] = *s++;
+            if (*s == ' ' || *s == '\t' || *s == '\n') {
+                w[i] = '\0';
+                words[nwords] = (char *)malloc((unsigned)(i+1));
+                strcpy(words[nwords],w);
+                nwords++;
+                inword = 0;
+            }
+        }
+        else {
+            s++; /* *s++; */
+            if (*s != ' ' && *s != '\t') {
+                /* beginning of a word */
+                i = 0;
+                inword = 1;
+                if (*s == '{') inopt1 = 1;
+                if (*s == '[') inopt2 = 1;
+            }
+        }
     }
-    else if (inword) {
-      w[i++] = *s++;
-      if (*s == ' ' || *s == '\t' || *s == '\n') {
-       w[i] = '\0';
-       words[nwords] = (char *)malloc((unsigned)(i+1));
-       strcpy(words[nwords],w);
-       nwords++;
-       inword = 0;
-      }
-    }
-    else {
-      s++; /* *s++; */
-      if (*s != ' ' && *s != '\t') {
-       /* beginning of a word */
-       i = 0;
-       inword = 1;
-       if (*s == '{') inopt1 = 1;
-       if (*s == '[') inopt2 = 1;
-      }
-    }
-  }
-  return(nwords);
+    return(nwords);
 }
 
 /* put the words of line "s" in "words" and return the number of words */
 
-int ParseLine(s,words)
-     char *s, *words[];
+int ParseLine(char *s, char *words[])
 {
-  char w[MAXNAM];
-  int nwords = 0;
-  int inword = 1;
-  int i = 0;
-  if(*s == ' ' || *s == '\t') inword = 0;
-  while (*s) {
-    if (inword) {
-      w[i++] = *s++;
-      if (*s == ' ' || *s == '\t' || *s == '\n') {
-       w[i] = '\0';
-       words[nwords] = (char *)malloc((unsigned)(i+1));
-       strcpy(words[nwords],w);
-       nwords++;
-       inword = 0;
-      }
+    char w[MAXNAM];
+    int nwords = 0;
+    int inword = 1;
+    int i = 0;
+    if(*s == ' ' || *s == '\t') inword = 0;
+    while (*s) 
+    {
+        if (inword) 
+        {
+            w[i++] = *s++;
+            if (*s == ' ' || *s == '\t' || *s == '\n') 
+            {
+                w[i] = '\0';
+                words[nwords] = (char *)malloc((unsigned)(i+1));
+                strcpy(words[nwords],w);
+                nwords++;
+                inword = 0;
+            }
+        }
+        else 
+        {
+            s++; /* *s++; */
+            if (*s != ' ' && *s != '\t') 
+            {
+                i = 0;
+                inword = 1;
+            }
+        }
     }
-    else {
-      s++; /* *s++; */
-      if (*s != ' ' && *s != '\t') {
-       i = 0;
-       inword = 1;
-      }
+
+    /* bug 7599 fixed: if the last line end with eof, not eol then one word missed */
+    if (i > 1)
+    {
+        w[i] = '\0';
+        words[nwords] = (char *)malloc((unsigned)(i+1));
+        strcpy(words[nwords],w);
+        nwords++;
     }
-  }
-  return(nwords);
+
+    return(nwords);
 }
 
 
 
 void ReadListFile(listname,varlistname,ivar)
-     char *listname;
-     char *varlistname;
-     IVAR ivar;
+char *listname;
+char *varlistname;
+IVAR ivar;
 {
-  FILE *fin;
-  char filin[MAXNAM];
-  int nel;
+    FILE *fin;
+    char filin[MAXNAM];
+    int nel;
 
-  sprintf(filin,"%s.list",listname);
-  fin = fopen(filin,"r");
-  if (fin == 0)
+    sprintf(filin,"%s.list",listname);
+    fin = fopen(filin,"r");
+    if (fin == 0)
     {
-      printf("description file for list or tlist \"%s\" does not exist\n",
-            filin);
-      exit(1);
+        printf("description file for list or tlist \"%s\" does not exist\n",
+            filin);
+        exit(1);
     }
-  printf("reading description file for list or tlist \"%s\"\n", listname);
+    printf("reading description file for list or tlist \"%s\"\n", listname);
 
-  nel = 0;
-  while(ReadListElement(fin,varlistname,ivar,nel))
+    nel = 0;
+    while(ReadListElement(fin,varlistname,ivar,nel))
     {
-      nel++;
+        nel++;
     }
 
-  fclose(fin);
+    fclose(fin);
 }
 
 int ReadListElement(f,varlistname,iivar,nel)
-     FILE *f;
-     char *varlistname;
-     int nel;
-     IVAR iivar;
+FILE *f;
+char *varlistname;
+int nel;
+IVAR iivar;
 {
-  char s[MAXLINE];
-  char *words[MAXLINE];
-  int i, nline, nwords, type;
-  IVAR ivar;
-  char str[MAXNAM];
-  nline = 0;
-  while (fgets(s,MAXLINE,f) != NULL)
+    char s[MAXLINE];
+    char *words[MAXLINE];
+    int i, nline, nwords, type;
+    IVAR ivar;
+    char str[MAXNAM];
+    nline = 0;
+    while (fgets(s,MAXLINE,f) != NULL)
     {
-      /* analyse of one line */
-      nline++;
-      switch (nline)
-       {
-       case 1:
-         break;
-       case 2:
-         /* SCILAB variable description */
-         nwords = ParseLine(s,words);
-         sprintf(str,"%s(%s)",words[0],varlistname);
-         ivar = GetVar(str,0);
-         i = ivar - 1;
-         if (nwords == 1)
-           {
-             printf("type missing for variable \"%s\"\n",words[0]);
-             exit(1);
-           }
-         type = GetBasType(words[1]);
-         variables[i]->type = type;
-         variables[i]->list_name = (char *)malloc((unsigned)(strlen(varlistname)+1));
-         strcpy(variables[i]->list_name,varlistname);
-         variables[i]->list_el = nel+1;
-         sprintf(str,"stk(l%de%d)",iivar+1,nel+1);
-         AddForName(ivar,str);
-         switch (type)
-           {
-           case SCALAR:
-           case ANY:
-             break;
-           case COLUMN:
-           case ROW:
-           case STRING:
-           case VECTOR:
-             if (nwords != 3)
-               {
-                 printf("bad type for variable \"%s\"\n",
-                        words[0]);
-                 exit(1);
-               }
-             if (isdigit(words[2][0]))
-               {
-                 variables[i]->el[0] = GetVar(words[2],0);
-               }
-             else
-               {
-                 sprintf(str,"%s(%s)",words[2],varlistname);
-                 variables[i]->el[0] = GetVar(str,0);
-               }
-             break;
-           case POLYNOM:
-           case MATRIX:
-           case BMATRIX:
-           case STRINGMAT:
-             if (nwords != 4)
-               {
-                 printf("bad type for variable \"%s\"\n",
-                        words[0]);
-                 exit(1);
-               }
-             if (isdigit(words[2][0]))
-               {
-                 variables[i]->el[0] = GetVar(words[2],0);
-               }
-             else
-               {
-                 sprintf(str,"%s(%s)",words[2],varlistname);
-                 variables[i]->el[0] = GetVar(str,0);
-               }
-             if (isdigit(words[3][0]))
-               {
-                 variables[i]->el[1] = GetVar(words[3],0);
-               }
-             else
-               {
-                 sprintf(str,"%s(%s)",words[3],varlistname);
-                 variables[i]->el[1] = GetVar(str,0);
-               }
-             break;
-           case IMATRIX:
-             if (nwords != 6)
-               {
-                 printf("bad type for variable \"%s\"\n",
-                        words[0]);
-                 exit(1);
-               }
-             if (isdigit(words[2][0]))
-               {
-                 variables[i]->el[0] = GetVar(words[2],0);
-               }
-             else
-               {
-                 sprintf(str,"%s(%s)",words[2],varlistname);
-                 variables[i]->el[0] = GetVar(str,0);
-               }
-             if (isdigit(words[3][0]))
-               {
-                 variables[i]->el[1] = GetVar(words[3],0);
-               }
-             else
-               {
-                 sprintf(str,"%s(%s)",words[3],varlistname);
-                 variables[i]->el[1] = GetVar(str,0);
-               }
-             sprintf(str,"%s(%s)",words[4],varlistname);
-             variables[i]->el[2] = GetVar(str,0);
-             break;
-           case SPARSE:
-             if (nwords != 6)
-               {
-                 printf("bad type for variable \"%s\"\n",
-                        words[0]);
-                 exit(1);
-               }
-             if (isdigit(words[2][0]))
-               {
-                 variables[i]->el[0] = GetVar(words[2],0);
-               }
-             else
-               {
-                 sprintf(str,"%s(%s)",words[2],varlistname);
-                 variables[i]->el[0] = GetVar(str,0);
-               }
-             if (isdigit(words[3][0]))
-               {
-                 variables[i]->el[1] = GetVar(words[3],0);
-               }
-             else
-               {
-                 sprintf(str,"%s(%s)",words[3],varlistname);
-                 variables[i]->el[1] = GetVar(str,0);
-               }
-             if (isdigit(words[4][0]))
-               {
-                 variables[i]->el[2] = GetVar(words[4],0);
-               }
-             else
-               {
-                 sprintf(str,"%s(%s)",words[4],varlistname);
-                 variables[i]->el[2] = GetVar(str,0);
-               }
-             sprintf(str,"%s(%s)",words[5],varlistname);
-             variables[i]->el[3] = GetVar(str,0);
-             break;
-           case WORK:
-           case SEQUENCE:
-           case EMPTY:
-           case LIST:
-           case TLIST:
-             printf("variable \"%s\" cannot have type \"%s\"\n",
-                    words[0],SGetSciType(type));
-             exit(1);
-           default:
-             printf("variable \"%s\" has unknown type \"%s\"\n",
-                    words[0],SGetSciType(type));
-           }
-         break;
-       default:
-         /* end of description */
-         if (s[0] == '*')
-           {
-             return(1);
-           }
-         else
-           {
-             printf("bad description file for list or tlist \"%s\"\n",
-                    varlistname);
-             exit(1);
-           }
-         break;
-       }
-    }
-  return(0);
+        /* analyse of one line */
+        nline++;
+        switch (nline)
+        {
+        case 1:
+            break;
+        case 2:
+            /* SCILAB variable description */
+            nwords = ParseLine(s,words);
+            sprintf(str,"%s(%s)",words[0],varlistname);
+            ivar = GetVar(str,0);
+            i = ivar - 1;
+            if (nwords == 1)
+            {
+                printf("type missing for variable \"%s\"\n",words[0]);
+                exit(1);
+            }
+            type = GetBasType(words[1]);
+            variables[i]->type = type;
+            variables[i]->list_name = (char *)malloc((unsigned)(strlen(varlistname)+1));
+            strcpy(variables[i]->list_name,varlistname);
+            variables[i]->list_el = nel+1;
+            sprintf(str,"stk(l%de%d)",iivar+1,nel+1);
+            AddForName(ivar,str);
+            switch (type)
+            {
+            case SCALAR:
+            case ANY:
+                break;
+            case COLUMN:
+            case ROW:
+            case STRING:
+            case VECTOR:
+                if (nwords != 3)
+                {
+                    printf("bad type for variable \"%s\"\n",
+                        words[0]);
+                    exit(1);
+                }
+                if (isdigit(words[2][0]))
+                {
+                    variables[i]->el[0] = GetVar(words[2],0);
+                }
+                else
+                {
+                    sprintf(str,"%s(%s)",words[2],varlistname);
+                    variables[i]->el[0] = GetVar(str,0);
+                }
+                break;
+            case POLYNOM:
+            case MATRIX:
+            case BMATRIX:
+            case STRINGMAT:
+                if (nwords != 4)
+                {
+                    printf("bad type for variable \"%s\"\n",
+                        words[0]);
+                    exit(1);
+                }
+                if (isdigit(words[2][0]))
+                {
+                    variables[i]->el[0] = GetVar(words[2],0);
+                }
+                else
+                {
+                    sprintf(str,"%s(%s)",words[2],varlistname);
+                    variables[i]->el[0] = GetVar(str,0);
+                }
+                if (isdigit(words[3][0]))
+                {
+                    variables[i]->el[1] = GetVar(words[3],0);
+                }
+                else
+                {
+                    sprintf(str,"%s(%s)",words[3],varlistname);
+                    variables[i]->el[1] = GetVar(str,0);
+                }
+                break;
+            case IMATRIX:
+                if (nwords != 6)
+                {
+                    printf("bad type for variable \"%s\"\n",
+                        words[0]);
+                    exit(1);
+                }
+                if (isdigit(words[2][0]))
+                {
+                    variables[i]->el[0] = GetVar(words[2],0);
+                }
+                else
+                {
+                    sprintf(str,"%s(%s)",words[2],varlistname);
+                    variables[i]->el[0] = GetVar(str,0);
+                }
+                if (isdigit(words[3][0]))
+                {
+                    variables[i]->el[1] = GetVar(words[3],0);
+                }
+                else
+                {
+                    sprintf(str,"%s(%s)",words[3],varlistname);
+                    variables[i]->el[1] = GetVar(str,0);
+                }
+                sprintf(str,"%s(%s)",words[4],varlistname);
+                variables[i]->el[2] = GetVar(str,0);
+                break;
+            case SPARSE:
+                if (nwords != 6)
+                {
+                    printf("bad type for variable \"%s\"\n",
+                        words[0]);
+                    exit(1);
+                }
+                if (isdigit(words[2][0]))
+                {
+                    variables[i]->el[0] = GetVar(words[2],0);
+                }
+                else
+                {
+                    sprintf(str,"%s(%s)",words[2],varlistname);
+                    variables[i]->el[0] = GetVar(str,0);
+                }
+                if (isdigit(words[3][0]))
+                {
+                    variables[i]->el[1] = GetVar(words[3],0);
+                }
+                else
+                {
+                    sprintf(str,"%s(%s)",words[3],varlistname);
+                    variables[i]->el[1] = GetVar(str,0);
+                }
+                if (isdigit(words[4][0]))
+                {
+                    variables[i]->el[2] = GetVar(words[4],0);
+                }
+                else
+                {
+                    sprintf(str,"%s(%s)",words[4],varlistname);
+                    variables[i]->el[2] = GetVar(str,0);
+                }
+                sprintf(str,"%s(%s)",words[5],varlistname);
+                variables[i]->el[3] = GetVar(str,0);
+                break;
+            case WORK:
+            case SEQUENCE:
+            case EMPTY:
+            case LIST:
+            case TLIST:
+                printf("variable \"%s\" cannot have type \"%s\"\n",
+                    words[0],SGetSciType(type));
+                exit(1);
+            default:
+                printf("variable \"%s\" has unknown type \"%s\"\n",
+                    words[0],SGetSciType(type));
+            }
+            break;
+        default:
+            /* end of description */
+            if (s[0] == '*')
+            {
+                return(1);
+            }
+            else
+            {
+                printf("bad description file for list or tlist \"%s\"\n",
+                    varlistname);
+                exit(1);
+            }
+            break;
+        }
+    }
+    return(0);
 }
 
 /*********************************************************************
-  Dealing with the set of variables
+Dealing with the set of variables
 *********************************************************************/
 
 
 /* return the variable number of variable name. if it does not already exist,
-   it is created and "nVariable" is incremented
-   p corresponds to the present slot of var structure:
-   - if the variable does not exist it is created with p value
-   - if the variable exists it is created with (p or 0) value
-   */
+it is created and "nVariable" is incremented
+p corresponds to the present slot of var structure:
+- if the variable does not exist it is created with p value
+- if the variable exists it is created with (p or 0) value
+*/
 
 IVAR GetVar(name,p)
-     char *name;
-     int p;
+char *name;
+int p;
 {
-  int i;
-  VARPTR var;
-  if (strcmp(name,"out") == 0) {
-    printf("the name of a variable which is not the output variable\n");
-    printf("  of SCILAB function cannot be \"out\"\n");
-    exit(1);
-  }
-  for (i = 0; i < nVariable; i++) {
-    var = variables[i];
-    if (strcmp(var->name,name) == 0) {
-      var->present = var->present || p;
-      return(i+1);
-    }
-  }
-  if (nVariable == MAXVAR) {
-    printf("too many variables\n");
-    printf("  augment constant \"MAXVAR\" and recompile intersci\n");
-    exit(1);
-  }
-  var = VarAlloc();
-  if (var == 0) {
-    printf("Running out of memory\n");
-    exit(1);
-  }
-  var->name = (char *)malloc((unsigned)(strlen(name) + 1));
-  strcpy(var->name,name);
-  var->type = 0;
-  var->length = 0;
-  var->for_type = 0;
-  var->equal = 0;
-  var->nfor_name = 0;
-  var->kp_state = -1;
-  var->list_el = 0;
-  var->opt_type = 0;
-  var->present = p;
-  variables[nVariable++] = var;
-  return(nVariable);
+    int i;
+    VARPTR var;
+    if (strcmp(name,"out") == 0) {
+        printf("the name of a variable which is not the output variable\n");
+        printf("  of SCILAB function cannot be \"out\"\n");
+        exit(1);
+    }
+    for (i = 0; i < nVariable; i++) {
+        var = variables[i];
+        if (strcmp(var->name,name) == 0) {
+            var->present = var->present || p;
+            return(i+1);
+        }
+    }
+    if (nVariable == MAXVAR) {
+        printf("too many variables\n");
+        printf("  augment constant \"MAXVAR\" and recompile intersci\n");
+        exit(1);
+    }
+    var = VarAlloc();
+    if (var == 0) {
+        printf("Running out of memory\n");
+        exit(1);
+    }
+    var->name = (char *)malloc((unsigned)(strlen(name) + 1));
+    strcpy(var->name,name);
+    var->type = 0;
+    var->length = 0;
+    var->for_type = 0;
+    var->equal = 0;
+    var->nfor_name = 0;
+    var->kp_state = -1;
+    var->list_el = 0;
+    var->opt_type = 0;
+    var->present = p;
+    var->list_name = 0; ;/* bug fixed : an uninitialized pointer */
+    variables[nVariable++] = var;
+    return(nVariable);
 }
 
 /* return the variable number of variable name which must already  exist */
 
 IVAR GetExistVar(char *name)
 {
-  int i;
-  VARPTR var;
-  if (strcmp(name,"out") == 0) {
-    printf("the name of a variable which is not the output variable\n");
-    printf("  of SCILAB function cannot be \"out\"\n");
+    int i;
+    VARPTR var;
+    if (strcmp(name,"out") == 0) {
+        printf("the name of a variable which is not the output variable\n");
+        printf("  of SCILAB function cannot be \"out\"\n");
+        exit(1);
+    }
+    for (i = 0; i < nVariable; i++) {
+        var = variables[i];
+        if (strcmp(var->name,name) == 0) {
+            /* always present */
+            var->present = 1;
+            return(i+1);
+        }
+    }
+    i=CreatePredefVar(name);
+    if ( i != -1) return(i);
+    printf("variable \"%s\" must exist\n",name);
     exit(1);
-  }
-  for (i = 0; i < nVariable; i++) {
-    var = variables[i];
-    if (strcmp(var->name,name) == 0) {
-      /* always present */
-      var->present = 1;
-      return(i+1);
-    }
-  }
-  i=CreatePredefVar(name);
-  if ( i != -1) return(i);
-  printf("variable \"%s\" must exist\n",name);
-  exit(1);
 }
 
 /* fname,rhs,lhs,err are predefined variables
-   if someone want to add them in the Fortran or C Calling sequence
-   it's done without aby checks
+if someone want to add them in the Fortran or C Calling sequence
+it's done without aby checks
 */
 
 int CreatePredefVar(name)
-     char *name;
+char *name;
 {
-  VARPTR var;
-  if (strcmp(name,"err")  == 0
-      || strcmp(name,"rhs") == 0
-      || strcmp(name,"lhs") == 0
-      || strcmp(name,"fname") == 0)
+    VARPTR var;
+    if (strcmp(name,"err")  == 0
+        || strcmp(name,"rhs") == 0
+        || strcmp(name,"lhs") == 0
+        || strcmp(name,"fname") == 0)
     {
-      int num ;
-      num=GetVar(name,1);
-      var = variables[num-1];
-      var->for_type = PREDEF;
-      return(num);
+        int num ;
+        num=GetVar(name,1);
+        var = variables[num-1];
+        var->for_type = PREDEF;
+        return(num);
     }
-  return(-1);
+    return(-1);
 }
 
 /* return the variable number of variable "out"
-   which is created and "nVariable" is incremented */
+which is created and "nVariable" is incremented */
 
 IVAR GetOutVar(name)
-     char *name;
+char *name;
 {
-  VARPTR var;
-  if (strcmp(name,"out") != 0) {
-    printf("the name of output variable of SCILAB function\n");
-    printf("  must be \"out\"\n");
-    exit(1);
-  }
-  if (nVariable == MAXVAR) {
-    printf("too many variables\n");
-    printf("  augmente constant \"MAXVAR\" and recompile intersci\n");
-    exit(1);
-  }
-  var = VarAlloc();
-  if (var == 0) {
-    printf("Running out of memory\n");
-    exit(1);
-  }
-  var->name = (char *)malloc((unsigned)(strlen(name) + 1));
-  strcpy(var->name,name);
-  var->type = 0;
-  var->length = 0;
-  var->for_type = 0;
-  var->equal = 0;
-  var->nfor_name = 0;
-  var->kp_state = -1;
-  var->list_el = 0;
-  var->opt_type = 0;
-  var->present = 0;
-  variables[nVariable++] = var;
-  return(nVariable);
+    VARPTR var;
+    if (strcmp(name,"out") != 0) {
+        printf("the name of output variable of SCILAB function\n");
+        printf("  must be \"out\"\n");
+        exit(1);
+    }
+    if (nVariable == MAXVAR) {
+        printf("too many variables\n");
+        printf("  augmente constant \"MAXVAR\" and recompile intersci\n");
+        exit(1);
+    }
+    var = VarAlloc();
+    if (var == 0) {
+        printf("Running out of memory\n");
+        exit(1);
+    }
+    var->name = (char *)malloc((unsigned)(strlen(name) + 1));
+    strcpy(var->name,name);
+    var->type = 0;
+    var->length = 0;
+    var->for_type = 0;
+    var->equal = 0;
+    var->nfor_name = 0;
+    var->kp_state = -1;
+    var->list_el = 0;
+    var->opt_type = 0;
+    var->present = 0;
+    variables[nVariable++] = var;
+    return(nVariable);
 }
 
 /* return the variable number of variable "out"
-   which must exist */
+which must exist */
 
 IVAR GetExistOutVar()
 {
-  int i;
-  char str[4];
-  strcpy(str,"out");
-  for (i = 0; i < nVariable; i++) {
-    if (strcmp(variables[i]->name,str) == 0)
-      return(i+1);
-  }
-  printf("variable \"out\" must exist\n");
-  exit(1);
+    int i;
+    char str[4];
+    strcpy(str,"out");
+    for (i = 0; i < nVariable; i++) {
+        if (strcmp(variables[i]->name,str) == 0)
+            return(i+1);
+    }
+    printf("variable \"out\" must exist\n");
+    exit(1);
 }
 
 /***************************
- * add name in the for_name array
- * field of variable ivar
- ***************************/
+* add name in the for_name array
+* field of variable ivar
+***************************/
 
 void AddForName(ivar,name)
-     IVAR ivar;
-     char* name;
+IVAR ivar;
+char* name;
 {
-  VARPTR var;
-  int l;
-  var = variables[ivar-1];
-  l = var->nfor_name;
-  if (l == MAXARG) {
-    printf("too many \"for_name\" for variable \"%s\"\n",var->name);
-    printf("  augment constant \"MAXARG\" and recompile intersci\n");
-    exit(1);
-  }
-  var->for_name[l] = (char *)malloc((unsigned)(strlen(name) + 1));
-  strcpy(var->for_name[l],name);
-  var->nfor_name = l + 1;
+    VARPTR var;
+    int l;
+    var = variables[ivar-1];
+    l = var->nfor_name;
+    if (l == MAXARG) {
+        printf("too many \"for_name\" for variable \"%s\"\n",var->name);
+        printf("  augment constant \"MAXARG\" and recompile intersci\n");
+        exit(1);
+    }
+    var->for_name[l] = (char *)malloc((unsigned)(strlen(name) + 1));
+    strcpy(var->for_name[l],name);
+    var->nfor_name = l + 1;
 }
 
 void AddForName1(ivar,name)
-     IVAR ivar;
-     char* name;
+IVAR ivar;
+char* name;
 {
-  VARPTR var;
-  int l;
-  var = variables[ivar-1];
-  l = var->nfor_name;
-  if ( pass == 0 && var->kp_state == -1 )
+    VARPTR var;
+    int l;
+    var = variables[ivar-1];
+    l = var->nfor_name;
+    if ( pass == 0 && var->kp_state == -1 )
     {
-      var->kp_state = var->nfor_name ;
+        var->kp_state = var->nfor_name ;
     }
-  if (l == MAXARG) {
-    printf("too many \"for_name\" for variable \"%s\"\n",var->name);
-    printf("  augment constant \"MAXARG\" and recompile intersci\n");
-    exit(1);
-  }
-  var->for_name[l] = (char *)malloc((unsigned)(strlen(name) + 1));
-  strcpy(var->for_name[l],name);
-  var->nfor_name = l + 1;
+    if (l == MAXARG) {
+        printf("too many \"for_name\" for variable \"%s\"\n",var->name);
+        printf("  augment constant \"MAXARG\" and recompile intersci\n");
+        exit(1);
+    }
+    var->for_name[l] = (char *)malloc((unsigned)(strlen(name) + 1));
+    strcpy(var->for_name[l],name);
+    var->nfor_name = l + 1;
 }
 
 void ForNameClean()
 {
-  VARPTR var;
-  int i;
-  for (i = 0; i < nVariable; i++) {
-    var = variables[i];
-    if ( var->kp_state != -1 )
-      {
-       var->nfor_name = var->kp_state ;
-      }
-  }
+    VARPTR var;
+    int i;
+    for (i = 0; i < nVariable; i++) {
+        var = variables[i];
+        if ( var->kp_state != -1 )
+        {
+            var->nfor_name = var->kp_state ;
+        }
+    }
 }
 
 void ChangeForName(ivar,name)
-     IVAR ivar;
-     char* name;
+IVAR ivar;
+char* name;
 {
-  VARPTR var;
-  int l;
-  var = variables[ivar-1];
-  l = var->nfor_name;
-  var->for_name[0] = (char *)malloc((unsigned)(strlen(name) + 1));
-  strcpy(var->for_name[0],name);
-  /* useful ??? */
-  if (l == 0) var->nfor_name = 1;
+    VARPTR var;
+    int l;
+    var = variables[ivar-1];
+    l = var->nfor_name;
+    var->for_name[0] = (char *)malloc((unsigned)(strlen(name) + 1));
+    strcpy(var->for_name[0],name);
+    /* useful ??? */
+    if (l == 0) var->nfor_name = 1;
 }
 
 /***********************************************************
-  Convertions de type entre codage entier
-  et description par chaine de caracteres
-  pour les types Scilab et les types Fortran
+Convertions de type entre codage entier
+et description par chaine de caracteres
+pour les types Scilab et les types Fortran
 ************************************************************/
 
 /* Attention tableau en ordre alphabetique */
 
 static struct btype { char *sname ;
-                     int  code ;}
+int  code ;}
 SType[] = {
-  {"any",      ANY},
-  {"bmatrix",    BMATRIX},
-  {"bpointer",   SCIBPOINTER},
-  {"column",   COLUMN},
-  {"empty",    EMPTY},
-  {"imatrix",    IMATRIX},
-  {"list",     LIST},
-  {"lpointer", SCILPOINTER},
-  {"matrix",   MATRIX},
-  {"mpointer", SCIMPOINTER},
-  {"opointer", SCIOPOINTER},
-  {"polynom",  POLYNOM},
-  {"row",      ROW},
-  {"scalar",   SCALAR},
-  {"sequence", SEQUENCE},
-  {"smpointer",  SCISMPOINTER},
-  {"sparse",    SPARSE},
-  {"string",   STRING},
-  {"stringmat",        STRINGMAT},
-  {"tlist",    TLIST},
-  {"vector",   VECTOR},
-  {"work",     WORK},
-  {(char *) 0 ,  -1}
-  };
+    {"any",    ANY},
+    {"bmatrix",    BMATRIX},
+    {"bpointer",   SCIBPOINTER},
+    {"column", COLUMN},
+    {"empty",  EMPTY},
+    {"imatrix",    IMATRIX},
+    {"list",   LIST},
+    {"lpointer",       SCILPOINTER},
+    {"matrix", MATRIX},
+    {"mpointer",       SCIMPOINTER},
+    {"opointer",       SCIOPOINTER},
+    {"polynom",        POLYNOM},
+    {"row",    ROW},
+    {"scalar", SCALAR},
+    {"sequence",       SEQUENCE},
+    {"smpointer",  SCISMPOINTER},
+    {"sparse",    SPARSE},
+    {"string", STRING},
+    {"stringmat",      STRINGMAT},
+    {"tlist",  TLIST},
+    {"vector", VECTOR},
+    {"work",   WORK},
+    {(char *) 0 ,  -1}
+};
 
 /* Type Scilab:  renvoit un codage du type en nombre entier etant donne une chaine */
 
 int GetBasType(sname)
-     char *sname;
+char *sname;
 {
-  int i=0;
-  while ( SType[i].sname != (char *) NULL)
-     {
-       int j ;
-       j = strcmp(sname,SType[i].sname);
-       if ( j == 0 )
-        {
-          return(SType[i].code);
-        }
-       else
-        {
-          if ( j <= 0)
-            break;
-          else i++;
-        }
-     }
-  printf("the type of variable \"%s\" is unknown\n",sname);
-  exit(1);
+    int i=0;
+    while ( SType[i].sname != (char *) NULL)
+    {
+        int j ;
+        j = strcmp(sname,SType[i].sname);
+        if ( j == 0 )
+        {
+            return(SType[i].code);
+        }
+        else
+        {
+            if ( j <= 0)
+                break;
+            else i++;
+        }
+    }
+    printf("the type of variable \"%s\" is unknown\n",sname);
+    exit(1);
 }
 
 /* Type Scilab :  Renvoit la description (string) d'un type a partir de son code */
 
 char *SGetSciType(type)
-     int type;
+int type;
 {
-  int i=0;
-  while ( SType[i].code  != -1 )
-     {
-       if ( SType[i].code == type )
-        return(SType[i].sname);
-       else
-        i++;
-     }
-  return("unknown");
+    int i=0;
+    while ( SType[i].code  != -1 )
+    {
+        if ( SType[i].code == type )
+            return(SType[i].sname);
+        else
+            i++;
+    }
+    return("unknown");
 }
 
 /* Attention tableau en ordre alphabetique */
 
 static struct ftype { char *fname ;
-                     int  code ;}
+int  code ;}
 FType[] = {
-  {"Cstringv",CSTRINGV},
-  {"bpointer",BPOINTER},
-  {"char",CHAR},
-  {"double", DOUBLE},
-  {"int",INT},
-  {"integer",INT},
-  {"lpointer",LPOINTER},
-  {"mpointer",MPOINTER},
-  {"opointer",OPOINTER},
-  {"predef",PREDEF},
-  {"real",REAL},
-  {"smpointer",SMPOINTER},
-  {(char *) 0 ,  -1}
-  };
+    {"Cstringv",CSTRINGV},
+    {"bpointer",BPOINTER},
+    {"char",CHAR},
+    {"double", DOUBLE},
+    {"int",INT},
+    {"integer",INT},
+    {"lpointer",LPOINTER},
+    {"mpointer",MPOINTER},
+    {"opointer",OPOINTER},
+    {"predef",PREDEF},
+    {"real",REAL},
+    {"smpointer",SMPOINTER},
+    {(char *) 0 ,  -1}
+};
 
 /* Type Fortran:  renvoit un codage du type en nombre entier etant donne une chaine */
 /* convert string to int FORTRAN type */
 
 int GetForType(char *type)
 {
-  int i=0;
-  while ( FType[i].fname != (char *) NULL)
-     {
-       int j;
-       j = strcmp(type,FType[i].fname);
-       if ( j == 0 )
-        {
-          return(FType[i].code);
-        }
-       else
-        {
-          if ( j <= 0)
-            break;
-          else i++;
-        }
-     }
-  return(EXTERNAL);
+    int i=0;
+    while ( FType[i].fname != (char *) NULL)
+    {
+        int j;
+        j = strcmp(type,FType[i].fname);
+        if ( j == 0 )
+        {
+            return(FType[i].code);
+        }
+        else
+        {
+            if ( j <= 0)
+                break;
+            else i++;
+        }
+    }
+    return(EXTERNAL);
 }
 
 /* Type Scilab :  Renvoit la description (string) d'un type a partir de son code */
 
 char *SGetForType(int type)
 {
-  int i=0;
-  while ( FType[i].code  != -1 )
-     {
-       if ( FType[i].code == type )
-        return(FType[i].fname);
-       else
-        i++;
-     }
-  return("External");
+    int i=0;
+    while ( FType[i].code  != -1 )
+    {
+        if ( FType[i].code == type )
+            return(FType[i].fname);
+        else
+            i++;
+    }
+    return("External");
 }
 
 /***************************************************************
-  Code generation
+Code generation
 ***************************************************************/
 
 
 void WriteMainHeader(FILE *f,char *fname)
 {
-  char *scidir;
-  Fprintf(f,indent,"subroutine %s\n",fname);
-  scidir = getenv("SCI");
-  if ( scidir != NULL)
-    Fprintf(f,indent,"include '%s/modules/core/includes/stack.h'\n",scidir);
-  else
-    Fprintf(f,indent,"include 'SCIDIR/modules/core/includes/stack.h'\n");
-  Fprintf(f,indent,"rhs = max(0,rhs)\n");
-  FCprintf(f,"c\n");
+    char *scidir;
+    Fprintf(f,indent,"subroutine %s\n",fname);
+    scidir = getenv("SCI");
+    if ( scidir != NULL)
+        Fprintf(f,indent,"include '%s/modules/core/includes/stack.h'\n",scidir);
+    else
+        Fprintf(f,indent,"include 'SCIDIR/modules/core/includes/stack.h'\n");
+    Fprintf(f,indent,"rhs = max(0,rhs)\n");
+    FCprintf(f,"c\n");
 }
 
 
 void WriteHeader(FILE *f,char *fname0,char *fname)
 {
-  Fprintf(f,indent,"subroutine %s%s(fname)\n",fname0,fname);
-  FCprintf(f,"c\n");
-  Fprintf(f,indent,"character*(*) fname\n");
-  Fprintf(f,indent,"include 'stack.h'\n");
-  FCprintf(f,"c\n");
-  Fprintf(f,indent,"int iadr, sadr\n");
-  WriteDeclaration(f);
-  Fprintf(f,indent,"iadr(l)=l+l-1\n");
-  Fprintf(f,indent,"sadr(l)=(l/2)+1\n");
-  Fprintf(f,indent,"rhs = max(0,rhs)\n");
-  FCprintf(f,"c\n");
+    Fprintf(f,indent,"subroutine %s%s(fname)\n",fname0,fname);
+    FCprintf(f,"c\n");
+    Fprintf(f,indent,"character*(*) fname\n");
+    Fprintf(f,indent,"include 'stack.h'\n");
+    FCprintf(f,"c\n");
+    Fprintf(f,indent,"int iadr, sadr\n");
+    WriteDeclaration(f);
+    Fprintf(f,indent,"iadr(l)=l+l-1\n");
+    Fprintf(f,indent,"sadr(l)=(l/2)+1\n");
+    Fprintf(f,indent,"rhs = max(0,rhs)\n");
+    FCprintf(f,"c\n");
 }
 
 void WriteFunctionCode(FILE *f)
 {
-  int i;
-  IVAR ivar;
-  icre=1;
-  if ( pass == 1)
+    int i;
+    IVAR ivar;
+    icre=1;
+    if ( pass == 1)
     {
-      printf("  generating  code for SCILAB function\"%s\"\n",
-            basfun->name);
-      printf("    and FORTRAN subroutine\"%s\"\n",forsub->name);
+        printf("  generating  code for SCILAB function\"%s\"\n",
+            basfun->name);
+        printf("    and FORTRAN subroutine\"%s\"\n",forsub->name);
     }
-  FCprintf(f,"c SCILAB function : %s, fin = %d\n",basfun->name,nFun);
-  WriteHeader(f,"ints",basfun->name);
+    FCprintf(f,"c SCILAB function : %s, fin = %d\n",basfun->name,nFun);
+    WriteHeader(f,"ints",basfun->name);
 
-  /* possibly init for string flag */
-  for (i = 0; i < forsub->narg; i++)
+    /* possibly init for string flag */
+    for (i = 0; i < forsub->narg; i++)
     {
-      if (variables[forsub->arg[i]-1]->for_type == CHAR)
-       {
-         Fprintf(f,indent,"lbuf = 1\n");
-         break;
-       }
+        if (variables[forsub->arg[i]-1]->for_type == CHAR)
+        {
+            Fprintf(f,indent,"lbuf = 1\n");
+            break;
+        }
     }
 
-  /* init for work space */
+    /* init for work space */
 
-  AddDeclare(DEC_INT,"topk");
-  AddDeclare(DEC_INT,"rhsk");
-  Fprintf(f,indent,"topk = top\n");
-  Fprintf(f,indent,"rhsk = rhs\n");
+    AddDeclare(DEC_INT,"topk");
+    AddDeclare(DEC_INT,"rhsk");
+    Fprintf(f,indent,"topk = top\n");
+    Fprintf(f,indent,"rhsk = rhs\n");
 
-  /* rhs argument number checking */
-  AddDeclare(DEC_LOGICAL,"checkrhs");
-  Fprintf(f,indent,"if(.not.checkrhs(fname,%d,%d)) return\n",basfun->nin - maxOpt,basfun->nin);
+    /* rhs argument number checking */
+    AddDeclare(DEC_LOGICAL,"checkrhs");
+    Fprintf(f,indent,"if(.not.checkrhs(fname,%d,%d)) return\n",basfun->nin - maxOpt,basfun->nin);
 
-  /* lhs argument number checking */
-  ivar = basfun->out;
-  if ((variables[ivar-1]->length == 0) || (variables[ivar-1]->type == LIST)
-      || (variables[ivar-1]->type == TLIST))
+    /* lhs argument number checking */
+    ivar = basfun->out;
+    if ((variables[ivar-1]->length == 0) || (variables[ivar-1]->type == LIST)
+        || (variables[ivar-1]->type == TLIST))
     {
-      AddDeclare(DEC_LOGICAL,"checklhs");
-      Fprintf(f,indent,"if(.not.checklhs(fname,1,1)) return\n");
+        AddDeclare(DEC_LOGICAL,"checklhs");
+        Fprintf(f,indent,"if(.not.checklhs(fname,1,1)) return\n");
     }
-  else
+    else
     {
-      AddDeclare(DEC_LOGICAL,"checklhs");
-      Fprintf(f,indent,"if(.not.checklhs(fname,1,%d)) return\n",variables[ivar-1]->length);
+        AddDeclare(DEC_LOGICAL,"checklhs");
+        Fprintf(f,indent,"if(.not.checklhs(fname,1,%d)) return\n",variables[ivar-1]->length);
     }
 
-  /* SCILAB argument checking */
-  for (i = 0; i < basfun->nin; i++)
+    /* SCILAB argument checking */
+    for (i = 0; i < basfun->nin; i++)
     {
-      switch ( variables[i]->type )
-       {
-       case LIST :
-       case TLIST:
-         WriteListAnalysis(f,i);
-         break;
+        switch ( variables[i]->type )
+        {
+        case LIST :
+        case TLIST:
+            WriteListAnalysis(f,i);
+            break;
         default:
-         WriteArgCheck(f,i);
-         break;
-       }
+            WriteArgCheck(f,i);
+            break;
+        }
     }
 
-  /* SCILAB cross checking */
+    /* SCILAB cross checking */
 
-  WriteCrossCheck(f);
+    WriteCrossCheck(f);
 
-  /* SCILAB equal output variable checking */
-  WriteEqualCheck(f);
+    /* SCILAB equal output variable checking */
+    WriteEqualCheck(f);
 
-  /* FORTRAN call */
-  WriteFortranCall(f);
+    /* FORTRAN call */
+    WriteFortranCall(f);
 
-  /* FORTRAN output to SCILAB */
-  WriteOutput(f);
+    /* FORTRAN output to SCILAB */
+    WriteOutput(f);
 }
 
 
 void WriteInfoCode(f)
-     FILE* f;
+FILE* f;
 {
-  int i,iout;
-  IVAR ivar;
-  VARPTR var,vout;
+    int i,iout;
+    IVAR ivar;
+    VARPTR var,vout;
 
-  iout = GetExistOutVar();
-  vout = variables[iout -1];
+    iout = GetExistOutVar();
+    vout = variables[iout -1];
 
-  switch (vout->type) {
+    switch (vout->type) {
   case LIST:
   case TLIST:
-    /* loop on output variables */
-    printf("list(");
-    for (i = 0; i < vout->length; i++)
+      /* loop on output variables */
+      printf("list(");
+      for (i = 0; i < vout->length; i++)
       {
-       ivar = vout->el[i];
-       var = variables[ivar-1];
-       printf("%s",var->name);
-       if ( i != vout->length -1 )
-         printf(",");
-       else
-         printf(")");
+          ivar = vout->el[i];
+          var = variables[ivar-1];
+          printf("%s",var->name);
+          if ( i != vout->length -1 )
+              printf(",");
+          else
+              printf(")");
       }
-    break ;
+      break ;
   case SEQUENCE:
-    /* loop on output variables */
-    printf("[");
-    for (i = 0; i < vout->length; i++)
+      /* loop on output variables */
+      printf("[");
+      for (i = 0; i < vout->length; i++)
       {
-       ivar = vout->el[i];
-       var = variables[ivar-1];
-       printf("%s",var->name);
-       if ( i != vout->length -1 )
-         printf(",");
-       else
-         printf("]");
+          ivar = vout->el[i];
+          var = variables[ivar-1];
+          printf("%s",var->name);
+          if ( i != vout->length -1 )
+              printf(",");
+          else
+              printf("]");
       }
-    break;
+      break;
   case EMPTY:
-    printf("[]\n");
-    break;
-  }
+      printf("[]\n");
+      break;
+    }
 
-  printf("=%s(",basfun->name);
-  for (i = 0; i < basfun->nin; i++)
+    printf("=%s(",basfun->name);
+    for (i = 0; i < basfun->nin; i++)
     {
-      printf("%s(%s)",variables[i]->name,SGetSciType(variables[i]->type));
-      if ( i != basfun->nin -1 )
-       printf(",");
+        printf("%s(%s)",variables[i]->name,SGetSciType(variables[i]->type));
+        if ( i != basfun->nin -1 )
+            printf(",");
     }
-  printf(")\n");
+    printf(")\n");
 
 }
 
 /* Ckecking and getting infos for datas coming from scilab calling
-   sequence ( datas on the stack )
+sequence ( datas on the stack )
 */
 
 void WriteArgCheck(f,i)
-     FILE *f;
-     int i;
+FILE *f;
+int i;
 {
-  int i1;
-  char str[MAXNAM];
-  char str1[MAXNAM];
-  char size[MAXNAM];
-  char data[MAXNAM];
+    int i1;
+    char str[MAXNAM];
+    char str1[MAXNAM];
+    char size[MAXNAM];
+    char data[MAXNAM];
 
-  VARPTR var = variables[basfun->in[i]-1];
-  i1 = i + 1;
+    VARPTR var = variables[basfun->in[i]-1];
+    i1 = i + 1;
 
-  FCprintf(f,"c       checking variable %s (number %d)\n",var->name,i1);
-  FCprintf(f,"c      \n");
+    FCprintf(f,"c       checking variable %s (number %d)\n",var->name,i1);
+    FCprintf(f,"c      \n");
 
-  /* Optional Argument consideration */
-  if (var->opt_type != 0)
+    /* Optional Argument consideration */
+    if (var->opt_type != 0)
     {
-      /** if (i1 < basfun->nin) {
-       printf("Optional arguments must be at the end of the calling sequence\n");
-       exit(1);
-       }
-       **/
-      Fprintf(f,indent++,"if(rhs .le. %d) then\n", i1-1 );
-      switch (var->opt_type) {
+        /** if (i1 < basfun->nin) {
+        printf("Optional arguments must be at the end of the calling sequence\n");
+        exit(1);
+        }
+        **/
+        Fprintf(f,indent++,"if(rhs .le. %d) then\n", i1-1 );
+        switch (var->opt_type) {
       case NAME:
-       AddDeclare(DEC_LOGICAL,"optvarget");
-       Fprintf(f,indent,"if (.not.optvarget(fname,topk,%d,'%s       ')) return\n",i1,var->opt_name);
-       break;
+          AddDeclare(DEC_LOGICAL,"optvarget");
+          Fprintf(f,indent,"if (.not.optvarget(fname,topk,%d,'%s       ')) return\n",i1,var->opt_name);
+          break;
       case VALUE:
-       switch (var->type) {
-       case SCALAR:
-         AddDeclare(DEC_LOGICAL,"cremat");
-         Fprintf(f,indent,"top = top+1\n");
-         Fprintf(f,indent,"rhs = rhs+1\n");
-         Fprintf(f,indent,"if(.not.cremat(fname,top,0,1,1,lr%d,lc%d)) return\n",i1,i1);
-         Fprintf(f,indent,"stk(lr%d)= %s\n",i1,var->opt_name);
-         break;
-       case SCISMPOINTER:
-       case SCILPOINTER:
-       case SCIBPOINTER:
-       case SCIOPOINTER:
-       case SCIMPOINTER:
-         sprintf(buf,"cre%s", SGetSciType(var->type));
-         AddDeclare(DEC_LOGICAL,buf);
-         Fprintf(f,indent,"top = top+1\n");
-         Fprintf(f,indent,"rhs = rhs+1\n");
-         Fprintf(f,indent,"if(.not.cre%s(fname,top,lwv)) return\n", SGetSciType(var->type));
-         break;
-       case MATRIX:
-         OptvarGetSize(var->opt_name,size,data);
-         AddDeclare(DEC_LOGICAL,"cremat");
-         Fprintf(f,indent,"top = top+1\n");
-         Fprintf(f,indent,"rhs = rhs+1\n");
-         sprintf(str,"dat%d %s",i1,data);
-         AddDeclare(DEC_DATA,str);
-         sprintf(str,"dat%d(%s)",i1,size);
-         AddDeclare(DEC_DOUBLE,str);
-         Fprintf(f,indent,"m%d = 1\n",i1);
-         Fprintf(f,indent,"n%d = %s\n",i1,size);
-         Fprintf(f,indent,"if(.not.cremat(fname,top,0,m%d,n%d,lr%d,lc%d)) return\n",i1,i1,i1,i1);
-         Fprintf(f,indent,"call dcopy(%s,dat%d,1,stk(lr%d),1)\n",size,i1,i1);
-         break;
-       case STRING:
-         AddDeclare(DEC_LOGICAL,"cresmat2");
-         Fprintf(f,indent,"top = top+1\n");
-         Fprintf(f,indent,"rhs = rhs+1\n");
-         Fprintf(f,indent,"nlr%d = %d\n",i1,strlen(var->opt_name));
-         Fprintf(f,indent,"if(.not.cresmat2(fname,top,nlr%d,lr%d)) return\n",i1,i1,i1);
-         Fprintf(f,indent,"call cvstr(nlr%d,istk(lr%d),'%s',0)\n",i1,i1,var->opt_name);
-         break;
-       default:
-         printf("Optional variable with value must be \"SCALAR\" or \"STRING\"\n");
-         exit(1);
-         break;
-       }
-       break;
-      }
-      Fprintf(f,--indent,"endif\n");
+          switch (var->type) {
+      case SCALAR:
+          AddDeclare(DEC_LOGICAL,"cremat");
+          Fprintf(f,indent,"top = top+1\n");
+          Fprintf(f,indent,"rhs = rhs+1\n");
+          Fprintf(f,indent,"if(.not.cremat(fname,top,0,1,1,lr%d,lc%d)) return\n",i1,i1);
+          Fprintf(f,indent,"stk(lr%d)= %s\n",i1,var->opt_name);
+          break;
+      case SCISMPOINTER:
+      case SCILPOINTER:
+      case SCIBPOINTER:
+      case SCIOPOINTER:
+      case SCIMPOINTER:
+          sprintf(buf,"cre%s", SGetSciType(var->type));
+          AddDeclare(DEC_LOGICAL,buf);
+          Fprintf(f,indent,"top = top+1\n");
+          Fprintf(f,indent,"rhs = rhs+1\n");
+          Fprintf(f,indent,"if(.not.cre%s(fname,top,lwv)) return\n", SGetSciType(var->type));
+          break;
+      case MATRIX:
+          OptvarGetSize(var->opt_name,size,data);
+          AddDeclare(DEC_LOGICAL,"cremat");
+          Fprintf(f,indent,"top = top+1\n");
+          Fprintf(f,indent,"rhs = rhs+1\n");
+          sprintf(str,"dat%d %s",i1,data);
+          AddDeclare(DEC_DATA,str);
+          sprintf(str,"dat%d(%s)",i1,size);
+          AddDeclare(DEC_DOUBLE,str);
+          Fprintf(f,indent,"m%d = 1\n",i1);
+          Fprintf(f,indent,"n%d = %s\n",i1,size);
+          Fprintf(f,indent,"if(.not.cremat(fname,top,0,m%d,n%d,lr%d,lc%d)) return\n",i1,i1,i1,i1);
+          Fprintf(f,indent,"call dcopy(%s,dat%d,1,stk(lr%d),1)\n",size,i1,i1);
+          break;
+      case STRING:
+          AddDeclare(DEC_LOGICAL,"cresmat2");
+          Fprintf(f,indent,"top = top+1\n");
+          Fprintf(f,indent,"rhs = rhs+1\n");
+          Fprintf(f,indent,"nlr%d = %d\n",i1,strlen(var->opt_name));
+          Fprintf(f,indent,"if(.not.cresmat2(fname,top,nlr%d,lr%d)) return\n",i1,i1,i1);
+          Fprintf(f,indent,"call cvstr(nlr%d,istk(lr%d),'%s',0)\n",i1,i1,var->opt_name);
+          break;
+      default:
+          printf("Optional variable with value must be \"SCALAR\" or \"STRING\"\n");
+          exit(1);
+          break;
+          }
+          break;
+        }
+        Fprintf(f,--indent,"endif\n");
     }
 
-  /* size checking */
-  switch(var->type)
+    /* size checking */
+    switch(var->type)
     {
     case BMATRIX:
-      AddDeclare(DEC_LOGICAL,"getbmat");
-      Fprintf(f,indent,"if(.not.getbmat(fname,top,top-rhs+%d,m%d,n%d,lr%d)) return\n",i1,i1,i1,i1);
-      /* square matrix */
-      if (var->el[0] == var->el[1]) {
-       /* square matrix */
-       AddDeclare(DEC_LOGICAL,"checkval");
-       Fprintf(f,indent,"if(.not.checkval(fname,m%d,n%d)) return\n",i1,i1);
-      }
-      sprintf(str,"m%d",i1);
-      Check(f,str,var,i1,0);
-      sprintf(str,"n%d",i1);
-      Check(f,str,var,i1,1);
-      break;
+        AddDeclare(DEC_LOGICAL,"getbmat");
+        Fprintf(f,indent,"if(.not.getbmat(fname,top,top-rhs+%d,m%d,n%d,lr%d)) return\n",i1,i1,i1,i1);
+        /* square matrix */
+        if (var->el[0] == var->el[1]) {
+            /* square matrix */
+            AddDeclare(DEC_LOGICAL,"checkval");
+            Fprintf(f,indent,"if(.not.checkval(fname,m%d,n%d)) return\n",i1,i1);
+        }
+        sprintf(str,"m%d",i1);
+        Check(f,str,var,i1,0);
+        sprintf(str,"n%d",i1);
+        Check(f,str,var,i1,1);
+        break;
     case MATRIX:
     case IMATRIX:
-      AddDeclare(DEC_LOGICAL,"getmat");
-      Fprintf(f,indent,"if(.not.getmat(fname,top,top-rhs+%d,it%d,m%d,n%d,lr%d,lc%d)) return\n",i1,i1,i1,i1,i1,i1);
-      /* square matrix */
-      if (var->el[0] == var->el[1]) {
-       /* square matrix */
-       AddDeclare(DEC_LOGICAL,"checkval");
-       Fprintf(f,indent,"if(.not.checkval(fname,m%d,n%d)) return\n",i1,i1);
-      }
-      sprintf(str,"m%d",i1);
-      Check(f,str,var,i1,0);
-      sprintf(str,"n%d",i1);
-      Check(f,str,var,i1,1);
-      sprintf(str,"it%d",i1);
-      if (var->type == IMATRIX ) AddForName1(var->el[2],str);
-      break;
+        AddDeclare(DEC_LOGICAL,"getmat");
+        Fprintf(f,indent,"if(.not.getmat(fname,top,top-rhs+%d,it%d,m%d,n%d,lr%d,lc%d)) return\n",i1,i1,i1,i1,i1,i1);
+        /* square matrix */
+        if (var->el[0] == var->el[1]) {
+            /* square matrix */
+            AddDeclare(DEC_LOGICAL,"checkval");
+            Fprintf(f,indent,"if(.not.checkval(fname,m%d,n%d)) return\n",i1,i1);
+        }
+        sprintf(str,"m%d",i1);
+        Check(f,str,var,i1,0);
+        sprintf(str,"n%d",i1);
+        Check(f,str,var,i1,1);
+        sprintf(str,"it%d",i1);
+        if (var->type == IMATRIX ) AddForName1(var->el[2],str);
+        break;
     case SPARSE:
-      AddDeclare(DEC_LOGICAL,"getsparse");
-      Fprintf(f,indent,"if(.not.getsparse(fname,top,top-rhs+%d,it%d,m%d,n%d,nel%d,mnel%d,icol%d,lr%d,lc%d)) return\n",i1,i1,i1,i1,i1,i1,i1,i1,i1);
-      /* square matrix */
-      if (var->el[0] == var->el[1]) {
-       /* square matrix */
-       AddDeclare(DEC_LOGICAL,"checkval");
-       Fprintf(f,indent,"if(.not.checkval(fname,m%d,n%d)) return\n",i1,i1);
-      }
-      sprintf(str,"m%d",i1);
-      Check(f,str,var,i1,0);
-      sprintf(str,"n%d",i1);
-      Check(f,str,var,i1,1);
-      sprintf(str,"nel%d",i1);
-      AddForName1(var->el[2],str);
-      sprintf(str,"it%d",i1);
-      AddForName1(var->el[3],str);
-      break;
+        AddDeclare(DEC_LOGICAL,"getsparse");
+        Fprintf(f,indent,"if(.not.getsparse(fname,top,top-rhs+%d,it%d,m%d,n%d,nel%d,mnel%d,icol%d,lr%d,lc%d)) return\n",i1,i1,i1,i1,i1,i1,i1,i1,i1);
+        /* square matrix */
+        if (var->el[0] == var->el[1]) {
+            /* square matrix */
+            AddDeclare(DEC_LOGICAL,"checkval");
+            Fprintf(f,indent,"if(.not.checkval(fname,m%d,n%d)) return\n",i1,i1);
+        }
+        sprintf(str,"m%d",i1);
+        Check(f,str,var,i1,0);
+        sprintf(str,"n%d",i1);
+        Check(f,str,var,i1,1);
+        sprintf(str,"nel%d",i1);
+        AddForName1(var->el[2],str);
+        sprintf(str,"it%d",i1);
+        AddForName1(var->el[3],str);
+        break;
     case STRINGMAT:
-      AddDeclare(DEC_LOGICAL,"getsmat");
-      Fprintf(f,indent,"if(.not.getsmat(fname,top,top-rhs+%d,m%d,n%d,1,1,lr%d,nlr%d)) return\n",
-             i1,i1,i1,i1,i1);
-      /* square matrix */
-      if (var->el[0] == var->el[1]) {
-       /* square matrix */
-       AddDeclare(DEC_LOGICAL,"checkval");
-       Fprintf(f,indent,"if(.not.checkval(fname,m%d,n%d)) return\n",i1,i1);
-      }
-      sprintf(str,"m%d",i1);
-      Check(f,str,var,i1,0);
-      strcpy(str1,variables[var->el[0]-1]->name);
-      sprintf(str,"n%d",i1);
-      Check(f,str,var,i1,1);
-      break;
+        AddDeclare(DEC_LOGICAL,"getsmat");
+        Fprintf(f,indent,"if(.not.getsmat(fname,top,top-rhs+%d,m%d,n%d,1,1,lr%d,nlr%d)) return\n",
+            i1,i1,i1,i1,i1);
+        /* square matrix */
+        if (var->el[0] == var->el[1]) {
+            /* square matrix */
+            AddDeclare(DEC_LOGICAL,"checkval");
+            Fprintf(f,indent,"if(.not.checkval(fname,m%d,n%d)) return\n",i1,i1);
+        }
+        sprintf(str,"m%d",i1);
+        Check(f,str,var,i1,0);
+        strcpy(str1,variables[var->el[0]-1]->name);
+        sprintf(str,"n%d",i1);
+        Check(f,str,var,i1,1);
+        break;
     case ROW:
-      AddDeclare(DEC_LOGICAL,"getvectrow");
-      Fprintf(f,indent,"if(.not.getvectrow(fname,top,top-rhs+%d,it%d,m%d,n%d,lr%d,lc%d)) return\n",i1,i1,i1,i1,i1,i1);
-      sprintf(str,"n%d",i1);
-      Check(f,str,var,i1,0);
-      break;
+        AddDeclare(DEC_LOGICAL,"getvectrow");
+        Fprintf(f,indent,"if(.not.getvectrow(fname,top,top-rhs+%d,it%d,m%d,n%d,lr%d,lc%d)) return\n",i1,i1,i1,i1,i1,i1);
+        sprintf(str,"n%d",i1);
+        Check(f,str,var,i1,0);
+        break;
     case COLUMN:
-      AddDeclare(DEC_LOGICAL,"getvectcol");
-      Fprintf(f,indent,"if(.not.getvectcol(fname,top,top-rhs+%d,it%d,m%d,n%d,lr%d,lc%d)) return\n",i1,i1,i1,i1,i1,i1);
-      sprintf(str,"m%d",i1);
-      Check(f,str,var,i1,0);
-      break;
+        AddDeclare(DEC_LOGICAL,"getvectcol");
+        Fprintf(f,indent,"if(.not.getvectcol(fname,top,top-rhs+%d,it%d,m%d,n%d,lr%d,lc%d)) return\n",i1,i1,i1,i1,i1,i1);
+        sprintf(str,"m%d",i1);
+        Check(f,str,var,i1,0);
+        break;
     case VECTOR:
-      AddDeclare(DEC_LOGICAL,"getvect");
-      Fprintf(f,indent,"if(.not.getvect(fname,top,top-rhs+%d,it%d,m%d,n%d,lr%d,lc%d)) return\n",i1,i1,i1,i1,i1,i1);
-      sprintf(str,"n%d*m%d",i1,i1);
-      Check(f,str,var,i1,0);
-      AddForName1(var->el[0],str);
-      break;
+        AddDeclare(DEC_LOGICAL,"getvect");
+        Fprintf(f,indent,"if(.not.getvect(fname,top,top-rhs+%d,it%d,m%d,n%d,lr%d,lc%d)) return\n",i1,i1,i1,i1,i1,i1);
+        sprintf(str,"n%d*m%d",i1,i1);
+        Check(f,str,var,i1,0);
+        AddForName1(var->el[0],str);
+        break;
     case POLYNOM:
-      AddDeclare(DEC_LOGICAL,"getonepoly");
-      sprintf(str,"namelr%d*4",i1);
-      AddDeclare(DEC_CHAR,str);
-      Fprintf(f,indent,"if(.not.getonepoly(fname,top,top-rhs+%d,it%d,m%d,namelr%d,namellr%d,lr%d,lc%d)\n",i1,i1,i1,i1,i1,i1,i1);
-      AddDeclare(DEC_LOGICAL,"checkval");
-      sprintf(str,"m%d",i1);
-      Check(f,str,var,i1,0);
-      AddForName(var->el[0],str);
-      break;
+        AddDeclare(DEC_LOGICAL,"getonepoly");
+        sprintf(str,"namelr%d*4",i1);
+        AddDeclare(DEC_CHAR,str);
+        Fprintf(f,indent,"if(.not.getonepoly(fname,top,top-rhs+%d,it%d,m%d,namelr%d,namellr%d,lr%d,lc%d)\n",i1,i1,i1,i1,i1,i1,i1);
+        AddDeclare(DEC_LOGICAL,"checkval");
+        sprintf(str,"m%d",i1);
+        Check(f,str,var,i1,0);
+        AddForName(var->el[0],str);
+        break;
     case SCALAR:
-      AddDeclare(DEC_LOGICAL,"getscalar");
-      Fprintf(f,indent,"if(.not.getscalar(fname,top,top-rhs+%d,lr%d)) return\n",i1,i1);
-      break;
+        AddDeclare(DEC_LOGICAL,"getscalar");
+        Fprintf(f,indent,"if(.not.getscalar(fname,top,top-rhs+%d,lr%d)) return\n",i1,i1);
+        break;
     case SCIMPOINTER:
     case SCISMPOINTER:
     case SCILPOINTER:
     case SCIBPOINTER:
     case SCIOPOINTER:
-      sprintf(buf,"get%s", SGetSciType(var->type));
-      AddDeclare(DEC_LOGICAL,buf);
-      Fprintf(f,indent,"if(.not.get%s(fname,top,top-rhs+%d,lr%d)) return\n", SGetSciType(var->type),i1,i1);
-      break;
+        sprintf(buf,"get%s", SGetSciType(var->type));
+        AddDeclare(DEC_LOGICAL,buf);
+        Fprintf(f,indent,"if(.not.get%s(fname,top,top-rhs+%d,lr%d)) return\n", SGetSciType(var->type),i1,i1);
+        break;
     case STRING:
-      AddDeclare(DEC_LOGICAL,"getsmat");
-      Fprintf(f,indent,"if(.not.getsmat(fname,top,top-rhs+%d,m%d,n%d,1,1,lr%d,nlr%d)) return\n",i1,i1,i1,i1,i1,i1,11);
-      AddDeclare(DEC_LOGICAL,"checkval");
-      Fprintf(f,indent,"if(.not.checkval(fname,m%d*n%d,1)) return\n",i1,i1);
-      sprintf(str,"nlr%d",i1);
-      Check(f,str,var,i1,0);
-      break;
+        AddDeclare(DEC_LOGICAL,"getsmat");
+        Fprintf(f,indent,"if(.not.getsmat(fname,top,top-rhs+%d,m%d,n%d,1,1,lr%d,nlr%d)) return\n",i1,i1,i1,i1,i1,i1,11);
+        AddDeclare(DEC_LOGICAL,"checkval");
+        Fprintf(f,indent,"if(.not.checkval(fname,m%d*n%d,1)) return\n",i1,i1);
+        sprintf(str,"nlr%d",i1);
+        Check(f,str,var,i1,0);
+        break;
     case ANY:
     case LIST:
     case TLIST:
-      break;
+        break;
     default:
-      printf("unknown variable type %d\n",var->type);
+        printf("unknown variable type %d\n",var->type);
     }
 }
 
 void OptvarGetSize(optvar,size,data)
-     char *optvar,*size,*data;
+char *optvar,*size,*data;
 {
-  int i,j=0,ok=0;
-  for ( i = 0 ; i < (int) strlen(optvar) ; i++ )
-       {
-        if ( optvar[i] == ')' )
-          {
-            size[j++] = '\0'; break;
-          }
-        if ( ok ==1 ) size[j++]= optvar[i];
-        if ( optvar[i] == '(' ) ok =1 ;
-       }
-  if ( i < (int) strlen(optvar)) strcpy(data,optvar+i+1);
+    int i,j=0,ok=0;
+    for ( i = 0 ; i < (int) strlen(optvar) ; i++ )
+    {
+        if ( optvar[i] == ')' )
+        {
+            size[j++] = '\0'; break;
+        }
+        if ( ok ==1 ) size[j++]= optvar[i];
+        if ( optvar[i] == '(' ) ok =1 ;
+    }
+    if ( i < (int) strlen(optvar)) strcpy(data,optvar+i+1);
 }
 
 /*
-  Utility function for WriteArgCheck
-  Check for fixed sized dimensions
+Utility function for WriteArgCheck
+Check for fixed sized dimensions
 */
 
 void Check(f,str,var,i1,nel)
-     FILE *f;
-     char *str;
-     int i1, nel;
-     VARPTR var;
+FILE *f;
+char *str;
+int i1, nel;
+VARPTR var;
 {
-  char str1[MAXNAM];
-  strcpy(str1,variables[var->el[nel]-1]->name);
-  if (isdigit(str1[0]) != 0)
+    char str1[MAXNAM];
+    strcpy(str1,variables[var->el[nel]-1]->name);
+    if (isdigit(str1[0]) != 0)
     {
-      /* the dimension of the variable is a constant int */
-      if ( strcmp(str,str1) != 0)
-       {
-         AddDeclare(DEC_LOGICAL,"checkval");
-         Fprintf(f,indent,"if(.not.checkval(fname,%s,%s)) return\n",str,str1);
-       }
-    }
-  AddForName1(var->el[nel],str);
+        /* the dimension of the variable is a constant int */
+        if ( strcmp(str,str1) != 0)
+        {
+            AddDeclare(DEC_LOGICAL,"checkval");
+            Fprintf(f,indent,"if(.not.checkval(fname,%s,%s)) return\n",str,str1);
+        }
+    }
+    AddForName1(var->el[nel],str);
 }
 
 
 void WriteCrossCheck(f)
-     FILE *f;
+FILE *f;
 {
-  int i, j;
-  char *n1, *n2;
-  VARPTR var;
-  FCprintf(f,"c    \n");
-  FCprintf(f,"c       cross variable size checking\n");
-  FCprintf(f,"c    \n");
-  for (i = 0; i < nVariable; i++) {
-    var = variables[i];
-    /* does not check list elements */
-    if (var->nfor_name != 0 && var->list_el == 0) {
-      if (strncmp(var->for_name[0],"ne",2) != 0 &&
-         strncmp(var->for_name[0],"me",2) != 0) {
-       n1 = Forname2Int(var->for_name[0]);
-       for (j = 1; j < var->nfor_name; j++) {
-         n2 = Forname2Int(var->for_name[j]);
-         if ( strcmp(n1,n2) != 0)
-           {
-             AddDeclare(DEC_LOGICAL,"checkval");
-             Fprintf(f,indent,"if(.not.checkval(fname,%s,%s)) return\n",n1,n2);
-           }
-       }
-      }
+    int i, j;
+    char *n1, *n2;
+    VARPTR var;
+    FCprintf(f,"c    \n");
+    FCprintf(f,"c       cross variable size checking\n");
+    FCprintf(f,"c    \n");
+    for (i = 0; i < nVariable; i++) {
+        var = variables[i];
+        /* does not check list elements */
+        if (var->nfor_name != 0 && var->list_el == 0) {
+            if (strncmp(var->for_name[0],"ne",2) != 0 &&
+                strncmp(var->for_name[0],"me",2) != 0) {
+                    n1 = Forname2Int(var->for_name[0]);
+                    for (j = 1; j < var->nfor_name; j++) {
+                        n2 = Forname2Int(var->for_name[j]);
+                        if ( strcmp(n1,n2) != 0)
+                        {
+                            AddDeclare(DEC_LOGICAL,"checkval");
+                            Fprintf(f,indent,"if(.not.checkval(fname,%s,%s)) return\n",n1,n2);
+                        }
+                    }
+            }
+        }
     }
-  }
-  /*  FCprintf(f,"c    \n");
-  FCprintf(f,"c       cross formal parameter checking\n");
-  FCprintf(f,"c       not implemented yet\n");  */
+    /*  FCprintf(f,"c    \n");
+    FCprintf(f,"c       cross formal parameter checking\n");
+    FCprintf(f,"c       not implemented yet\n");  */
 }
 
 void WriteEqualCheck(f)
-     FILE *f;
+FILE *f;
 {
-  /* FCprintf(f,"c    \n");
-  FCprintf(f,"c       cross equal output variable checking\n");
-  FCprintf(f,"c       not implemented yet\n"); */
+    /* FCprintf(f,"c    \n");
+    FCprintf(f,"c       cross equal output variable checking\n");
+    FCprintf(f,"c       not implemented yet\n"); */
 }
 
 void WriteFortranCall(f)
-     FILE *f;
+FILE *f;
 {
-  int i, j, ind;
-  IVAR ivar, iivar;
-  char call[MAXCALL];
-  char str1[8],str2[8];
-  sprintf(call,"call %s(",forsub->name);
-  /* loop on FORTRAN arguments */
-  for (i = 0; i < forsub->narg; i++)
+    int i, j, ind;
+    IVAR ivar, iivar;
+    char call[MAXCALL];
+    char str1[8],str2[8];
+    sprintf(call,"call %s(",forsub->name);
+    /* loop on FORTRAN arguments */
+    for (i = 0; i < forsub->narg; i++)
     {
-      ivar = forsub->arg[i];
-      ind = 0;
-      if (variables[ivar-1]->list_el != 0)
-       {
-         /* FORTRAN argument is a list element */
-         iivar = GetExistVar(variables[ivar-1]->list_name);
-         for (j = 0; j < basfun->nin; j++)
-           {
-             if (iivar == basfun->in[j])
-               {
-                 /* it must be a SCILAB argument */
-                 sprintf(str1,"%de%d",iivar,variables[ivar-1]->list_el);
-                 sprintf(str2,"%de%d",iivar,variables[ivar-1]->list_el);
-                 WriteCallConvertion(f,ivar,str2,str1,call);
-                 ind = 1;
-                 break;
-               }
-           }
-         if (ind == 0)
-           {
-             printf("list or tlist \"%s\" must be an argument of SCILAB function\n",
-                    variables[ivar-1]->list_name);
-             exit(1);
-           }
-       }
-      else
-       {
-         for (j = 0; j < basfun->nin; j++)
-           {
-             if (ivar == basfun->in[j])
-               {
-                 /* FORTRAN argument is a SCILAB argument */
-                 sprintf(str1,"%d",j+1);
-                 sprintf(str2,"%d",i+1);
-                 WriteCallConvertion(f,ivar,str2,str1,call);
-                 ind = 1;
-                 break;
-               }
-           }
-       }
-      if (ind == 0)
-       {
-         /* FORTRAN argument is not a SCILAB argument */
-         WriteCallRest(f,ivar,i+1,call);
-       }
-    }
-  if  (forsub->narg == 0)
-    strcat(call,")");
-  else
-    call[strlen(call)-1] = ')';
-  Fprintf(f,indent,call);
-  Fprintf(f,indent,"\n");
-  /*
-      Fprintf(f,indent++,"if(err .gt. 0) then\n");
-      Fprintf(f,indent,"buf = fname // ' Internal Error'\n");
-      Fprintf(f,indent,"call error(999)\n");
-      Fprintf(f,indent,"return\n");
-      Fprintf(f,--indent,"endif\n");
-  */
-  Fprintf(f,indent,"if(err .gt. 0 .or. err1 .gt. 0) return\n");
+        ivar = forsub->arg[i];
+        ind = 0;
+        if (variables[ivar-1]->list_el != 0)
+        {
+            /* FORTRAN argument is a list element */
+            iivar = GetExistVar(variables[ivar-1]->list_name);
+            for (j = 0; j < basfun->nin; j++)
+            {
+                if (iivar == basfun->in[j])
+                {
+                    /* it must be a SCILAB argument */
+                    sprintf(str1,"%de%d",iivar,variables[ivar-1]->list_el);
+                    sprintf(str2,"%de%d",iivar,variables[ivar-1]->list_el);
+                    WriteCallConvertion(f,ivar,str2,str1,call);
+                    ind = 1;
+                    break;
+                }
+            }
+            if (ind == 0)
+            {
+                printf("list or tlist \"%s\" must be an argument of SCILAB function\n",
+                    variables[ivar-1]->list_name);
+                exit(1);
+            }
+        }
+        else
+        {
+            for (j = 0; j < basfun->nin; j++)
+            {
+                if (ivar == basfun->in[j])
+                {
+                    /* FORTRAN argument is a SCILAB argument */
+                    sprintf(str1,"%d",j+1);
+                    sprintf(str2,"%d",i+1);
+                    WriteCallConvertion(f,ivar,str2,str1,call);
+                    ind = 1;
+                    break;
+                }
+            }
+        }
+        if (ind == 0)
+        {
+            /* FORTRAN argument is not a SCILAB argument */
+            WriteCallRest(f,ivar,i+1,call);
+        }
+    }
+    if  (forsub->narg == 0)
+        strcat(call,")");
+    else
+        call[strlen(call)-1] = ')';
+    Fprintf(f,indent,call);
+    Fprintf(f,indent,"\n");
+    /*
+    Fprintf(f,indent++,"if(err .gt. 0) then\n");
+    Fprintf(f,indent,"buf = fname // ' Internal Error'\n");
+    Fprintf(f,indent,"call error(999)\n");
+    Fprintf(f,indent,"return\n");
+    Fprintf(f,--indent,"endif\n");
+    */
+    Fprintf(f,indent,"if(err .gt. 0 .or. err1 .gt. 0) return\n");
 
-  FCprintf(f,"c\n");
+    FCprintf(f,"c\n");
 }
 
 /*
-  Convertion to a Fortran type before caling sequence
-  for arguments coming from the scilab stack
-  the part of the caing sequence is adde to the buffer call
+Convertion to a Fortran type before caling sequence
+for arguments coming from the scilab stack
+the part of the caing sequence is adde to the buffer call
 */
 
 void WriteCallConvertion(f,ivar,farg,barg,call)
-     FILE *f;
-     IVAR ivar;
-     char *farg;
-     char *barg;
-     char *call;
+FILE *f;
+IVAR ivar;
+char *farg;
+char *barg;
+char *call;
 {
-  VARPTR var = variables[ivar-1];
-  char str[MAXNAM];
-  char str1[MAXNAM];
-  switch (var->type)
+    VARPTR var = variables[ivar-1];
+    char str[MAXNAM];
+    char str1[MAXNAM];
+    switch (var->type)
     {
     case POLYNOM:
     case ROW:
@@ -1759,1534 +1774,1534 @@ void WriteCallConvertion(f,ivar,farg,barg,call)
     case IMATRIX:
     case MATRIX:
     case SPARSE:
-      switch ( var->type )
-       {
-       case POLYNOM: sprintf(str1,"n%s",barg); break;
-       case COLUMN: sprintf(str1,"m%s",barg); break ;
-       case VECTOR:  sprintf(str1,"m%s*n%s",barg,barg); break ;
-       case SCALAR:  sprintf(str1,"1"); break ;
-       case ROW:  sprintf(str1,"n%s",barg); break;
-       case SPARSE: sprintf(str1,"nel%s",barg);break;
-       case IMATRIX:
-       case MATRIX:  sprintf(str1,"n%s*m%s",barg,barg); break;
-       }
-      switch (var->for_type)
-       {
-       case CHAR:
-       case CSTRINGV:
-         printf("incompatibility between the variable type and the FORTRAN type for variable \"%s\"\n",var->name);
-         exit(1);
-       case INT:
-         Fprintf(f,indent,"call entier(%s,stk(lr%s),istk(iadr(lr%s)))\n",str1,barg,barg);
-         if (var->type == IMATRIX || var->type == SPARSE)
-           {
-             Fprintf(f,indent++,"if (it%s.eq.1) then\n",barg);
-             Fprintf(f,indent,"call entier(%s,stk(lc%s),istk(iadr(lc%s)))\n",str1,barg,barg);
-             Fprintf(f,--indent,"endif\n");
-             if ( var->type == SPARSE)
-               sprintf(str,"it%s,m%s,n%s,nel%s,istk(mnel%s),istk(icol%s),istk(iadr(lr%s)),istk(iadr(lc%s))"
-                       ,barg,barg,barg,barg,barg,barg,barg,barg);
-             else
-               sprintf(str,"istk(iadr(lr%s)),istk(iadr(lc%s)),it%s",barg,barg,barg);
-             ChangeForName(ivar,str);
-             strcat(call,str);
-             strcat(call,",");
-           }
-         else
-           {
-             sprintf(str,"istk(iadr(lr%s))",barg);
-             ChangeForName(ivar,str);
-             strcat(call,str);
-             strcat(call,",");
-           }
-         break;
-       case REAL:
-         Fprintf(f,indent,"call simple(%s,stk(lr%s),stk(lr%s))\n",str1,barg,barg,barg);
-         if (var->type == IMATRIX || var->type == SPARSE)
-           {
-             Fprintf(f,indent++,"if (it%s.eq.1) then\n",barg);
-             Fprintf(f,indent,"call simple(%s,stk(lc%s),stk(lc%s))\n",str1,barg,barg);
-             Fprintf(f,--indent,"endif\n");
-             if ( var->type == SPARSE)
-               sprintf(str,"it%s,m%s,n%s,nel%s,istk(mnel%s),istk(icol%s),stk(lr%s),stk(lc%s),"
-                       ,barg,barg,barg,barg,barg,barg,barg,barg);
-             else
-               sprintf(str,"stk(lr%s),stk(lc%s),it%s,",barg,barg,barg);
-             strcat(call,str);
-           }
-         else
-           {
-             sprintf(str,"stk(lr%s),",barg);
-             strcat(call,str);
-           }
-         break;
-       case DOUBLE:
-         if (var->type == IMATRIX)
-           {
-             sprintf(str,"stk(lr%s),stk(lc%s),it%s,",barg,barg,barg);
-             strcat(call,str);
-           }
-         else if (var->type == SPARSE)
-           {
-             sprintf(str,"it%s,m%s,n%s,nel%s,istk(mnel%s),istk(icol%s),stk(lr%s),stk(lc%s),"
-                     ,barg,barg,barg,barg,barg,barg,barg,barg);
-             strcat(call,str);
-           }
-         else
-           {
-             sprintf(str,"stk(lr%s),",barg);
-             strcat(call,str);
-           }
-         break;
-       }
-      break;
+        switch ( var->type )
+        {
+        case POLYNOM: sprintf(str1,"n%s",barg); break;
+        case COLUMN: sprintf(str1,"m%s",barg); break ;
+        case VECTOR:  sprintf(str1,"m%s*n%s",barg,barg); break ;
+        case SCALAR:  sprintf(str1,"1"); break ;
+        case ROW:  sprintf(str1,"n%s",barg); break;
+        case SPARSE: sprintf(str1,"nel%s",barg);break;
+        case IMATRIX:
+        case MATRIX:  sprintf(str1,"n%s*m%s",barg,barg); break;
+        }
+        switch (var->for_type)
+        {
+        case CHAR:
+        case CSTRINGV:
+            printf("incompatibility between the variable type and the FORTRAN type for variable \"%s\"\n",var->name);
+            exit(1);
+        case INT:
+            Fprintf(f,indent,"call entier(%s,stk(lr%s),istk(iadr(lr%s)))\n",str1,barg,barg);
+            if (var->type == IMATRIX || var->type == SPARSE)
+            {
+                Fprintf(f,indent++,"if (it%s.eq.1) then\n",barg);
+                Fprintf(f,indent,"call entier(%s,stk(lc%s),istk(iadr(lc%s)))\n",str1,barg,barg);
+                Fprintf(f,--indent,"endif\n");
+                if ( var->type == SPARSE)
+                    sprintf(str,"it%s,m%s,n%s,nel%s,istk(mnel%s),istk(icol%s),istk(iadr(lr%s)),istk(iadr(lc%s))"
+                    ,barg,barg,barg,barg,barg,barg,barg,barg);
+                else
+                    sprintf(str,"istk(iadr(lr%s)),istk(iadr(lc%s)),it%s",barg,barg,barg);
+                ChangeForName(ivar,str);
+                strcat(call,str);
+                strcat(call,",");
+            }
+            else
+            {
+                sprintf(str,"istk(iadr(lr%s))",barg);
+                ChangeForName(ivar,str);
+                strcat(call,str);
+                strcat(call,",");
+            }
+            break;
+        case REAL:
+            Fprintf(f,indent,"call simple(%s,stk(lr%s),stk(lr%s))\n",str1,barg,barg,barg);
+            if (var->type == IMATRIX || var->type == SPARSE)
+            {
+                Fprintf(f,indent++,"if (it%s.eq.1) then\n",barg);
+                Fprintf(f,indent,"call simple(%s,stk(lc%s),stk(lc%s))\n",str1,barg,barg);
+                Fprintf(f,--indent,"endif\n");
+                if ( var->type == SPARSE)
+                    sprintf(str,"it%s,m%s,n%s,nel%s,istk(mnel%s),istk(icol%s),stk(lr%s),stk(lc%s),"
+                    ,barg,barg,barg,barg,barg,barg,barg,barg);
+                else
+                    sprintf(str,"stk(lr%s),stk(lc%s),it%s,",barg,barg,barg);
+                strcat(call,str);
+            }
+            else
+            {
+                sprintf(str,"stk(lr%s),",barg);
+                strcat(call,str);
+            }
+            break;
+        case DOUBLE:
+            if (var->type == IMATRIX)
+            {
+                sprintf(str,"stk(lr%s),stk(lc%s),it%s,",barg,barg,barg);
+                strcat(call,str);
+            }
+            else if (var->type == SPARSE)
+            {
+                sprintf(str,"it%s,m%s,n%s,nel%s,istk(mnel%s),istk(icol%s),stk(lr%s),stk(lc%s),"
+                    ,barg,barg,barg,barg,barg,barg,barg,barg);
+                strcat(call,str);
+            }
+            else
+            {
+                sprintf(str,"stk(lr%s),",barg);
+                strcat(call,str);
+            }
+            break;
+        }
+        break;
     case BMATRIX:
-      sprintf(str1,"n%s*m%s",barg,barg);
-      if (var->for_type != INT)
-       {
-         printf("incompatibility between the type %s and FORTRAN type %s for variable \"%s\"\n",
-                SGetSciType(var->type),SGetForType(var->for_type),var->name);
-         exit(1);
-       }
-      sprintf(str,"istk(lr%s)",barg);
-      ChangeForName(ivar,str);
-      strcat(call,str);
-      strcat(call,",");
-      break;
+        sprintf(str1,"n%s*m%s",barg,barg);
+        if (var->for_type != INT)
+        {
+            printf("incompatibility between the type %s and FORTRAN type %s for variable \"%s\"\n",
+                SGetSciType(var->type),SGetForType(var->for_type),var->name);
+            exit(1);
+        }
+        sprintf(str,"istk(lr%s)",barg);
+        ChangeForName(ivar,str);
+        strcat(call,str);
+        strcat(call,",");
+        break;
     case SCIMPOINTER:
-      if (var->for_type != MPOINTER)
-       {
-         printf("incompatibility between the type %s and FORTRAN type %s for variable \"%s\"\n",
-                SGetSciType(var->type),SGetForType(var->for_type),var->name);
-         exit(1);
-       }
-      sprintf(str,"stk(lr%s),",barg);
-      strcat(call,str);
-      break;
+        if (var->for_type != MPOINTER)
+        {
+            printf("incompatibility between the type %s and FORTRAN type %s for variable \"%s\"\n",
+                SGetSciType(var->type),SGetForType(var->for_type),var->name);
+            exit(1);
+        }
+        sprintf(str,"stk(lr%s),",barg);
+        strcat(call,str);
+        break;
     case SCISMPOINTER:
-      if (var->for_type != SMPOINTER)
-       {
-         printf("incompatibility between the type %s and FORTRAN type %s for variable \"%s\"\n",
-                SGetSciType(var->type),SGetForType(var->for_type),var->name);
-         exit(1);
-       }
-      sprintf(str,"stk(lr%s),",barg);
-      strcat(call,str);
-      break;
+        if (var->for_type != SMPOINTER)
+        {
+            printf("incompatibility between the type %s and FORTRAN type %s for variable \"%s\"\n",
+                SGetSciType(var->type),SGetForType(var->for_type),var->name);
+            exit(1);
+        }
+        sprintf(str,"stk(lr%s),",barg);
+        strcat(call,str);
+        break;
     case SCILPOINTER:
-      if (var->for_type != LPOINTER)
-       {
-         printf("incompatibility between the type %s and FORTRAN type %s for variable \"%s\"\n",
-                SGetSciType(var->type),SGetForType(var->for_type),var->name);
-         exit(1);
-       }
-      sprintf(str,"stk(lr%s),",barg);
-      strcat(call,str);
-      break;
+        if (var->for_type != LPOINTER)
+        {
+            printf("incompatibility between the type %s and FORTRAN type %s for variable \"%s\"\n",
+                SGetSciType(var->type),SGetForType(var->for_type),var->name);
+            exit(1);
+        }
+        sprintf(str,"stk(lr%s),",barg);
+        strcat(call,str);
+        break;
     case SCIBPOINTER:
-      if (var->for_type != BPOINTER)
-       {
-         printf("incompatibility between the type %s and FORTRAN type %s for variable \"%s\"\n",
-                SGetSciType(var->type),SGetForType(var->for_type),var->name);
-         exit(1);
-       }
-      sprintf(str,"stk(lr%s),",barg);
-      strcat(call,str);
-      break;
+        if (var->for_type != BPOINTER)
+        {
+            printf("incompatibility between the type %s and FORTRAN type %s for variable \"%s\"\n",
+                SGetSciType(var->type),SGetForType(var->for_type),var->name);
+            exit(1);
+        }
+        sprintf(str,"stk(lr%s),",barg);
+        strcat(call,str);
+        break;
     case SCIOPOINTER:
-      if (var->for_type != OPOINTER)
-       {
-         printf("incompatibility between the type %s and FORTRAN type %s for variable \"%s\"\n",
-                SGetSciType(var->type),SGetForType(var->for_type),var->name);
-         exit(1);
-       }
-      sprintf(str,"stk(lr%s),",barg);
-      strcat(call,str);
-      break;
+        if (var->for_type != OPOINTER)
+        {
+            printf("incompatibility between the type %s and FORTRAN type %s for variable \"%s\"\n",
+                SGetSciType(var->type),SGetForType(var->for_type),var->name);
+            exit(1);
+        }
+        sprintf(str,"stk(lr%s),",barg);
+        strcat(call,str);
+        break;
     case STRINGMAT:
-      if (var->for_type != CSTRINGV)
-       {
-         printf("incompatibility between the type %s and FORTRAN type %s for variable \"%s\"\n",
-                SGetSciType(STRINGMAT),SGetForType(var->for_type),var->name);
-         exit(1);
-       }
-      AddDeclare(DEC_LOGICAL,"crestringv");
-      Fprintf(f,indent,"if(.not.crestringv(fname,top+%d,lr%s-5-m%s*n%s,lw%s)) return\n",icre++,barg,barg,barg,farg);
-      sprintf(str,"stk(lw%s),",farg);
-      strcat(call,str);
-      break;
+        if (var->for_type != CSTRINGV)
+        {
+            printf("incompatibility between the type %s and FORTRAN type %s for variable \"%s\"\n",
+                SGetSciType(STRINGMAT),SGetForType(var->for_type),var->name);
+            exit(1);
+        }
+        AddDeclare(DEC_LOGICAL,"crestringv");
+        Fprintf(f,indent,"if(.not.crestringv(fname,top+%d,lr%s-5-m%s*n%s,lw%s)) return\n",icre++,barg,barg,barg,farg);
+        sprintf(str,"stk(lw%s),",farg);
+        strcat(call,str);
+        break;
     case LIST:
     case TLIST:
     case SEQUENCE:
-      printf("a FORTRAN argument cannot have a variable type of \"LIST\"\n");
-      printf("  \"TLIST\" or \"SEQUENCE\"\n");
-      exit(1);
-      break;
+        printf("a FORTRAN argument cannot have a variable type of \"LIST\"\n");
+        printf("  \"TLIST\" or \"SEQUENCE\"\n");
+        exit(1);
+        break;
     case STRING:
-      if (var->for_type != CHAR)
-       {
-         printf("incompatibility between the type %s and FORTRAN type %s for variable \"%s\"\n",
-                SGetSciType(STRING),SGetForType(var->for_type),var->name);
-         exit(1);
-       }
-      AddDeclare(DEC_LOGICAL,"bufstore");
-      Fprintf(f,indent,"if(.not.bufstore(fname,lbuf,lbufi%s,lbuff%s,lr%s,nlr%s)) return\n",farg,farg,barg,barg);
-      sprintf(str,"buf(lbufi%s:lbuff%s),",farg,farg);
-      strcat(call,str);
-      break;
+        if (var->for_type != CHAR)
+        {
+            printf("incompatibility between the type %s and FORTRAN type %s for variable \"%s\"\n",
+                SGetSciType(STRING),SGetForType(var->for_type),var->name);
+            exit(1);
+        }
+        AddDeclare(DEC_LOGICAL,"bufstore");
+        Fprintf(f,indent,"if(.not.bufstore(fname,lbuf,lbufi%s,lbuff%s,lr%s,nlr%s)) return\n",farg,farg,barg,barg);
+        sprintf(str,"buf(lbufi%s:lbuff%s),",farg,farg);
+        strcat(call,str);
+        break;
     case ANY:
-      sprintf(str,"istk(il%s),",barg);
-      strcat(call,str);
-      break;
+        sprintf(str,"istk(il%s),",barg);
+        strcat(call,str);
+        break;
     }
 }
 
 /*
-  Calling sequence for variables not coming from the
-  scilab calling sequence
-  working or output variables
+Calling sequence for variables not coming from the
+scilab calling sequence
+working or output variables
 */
 
 void WriteCallRest(f,ivar,farg,call)
-     FILE *f;
-     IVAR ivar;
-     int farg;
-     char *call;
+FILE *f;
+IVAR ivar;
+int farg;
+char *call;
 {
-  VARPTR var = variables[ivar-1];
-  char str[MAXNAM];
-  char str1[MAXNAM];
-  char str2[MAXNAM];
-  char str3[MAXNAM];
-  char str4[MAXNAM];
-  switch (var->type)
+    VARPTR var = variables[ivar-1];
+    char str[MAXNAM];
+    char str1[MAXNAM];
+    char str2[MAXNAM];
+    char str3[MAXNAM];
+    char str4[MAXNAM];
+    switch (var->type)
     {
     case 0:
-      /* FORTRAN argument is the dimension of an output variable with EXTERNAL type */
-      if (var->nfor_name == 0 && var->for_type != PREDEF)
-       {
-         printf("dimension variable \"%s\" is not defined\n",var->name);
-         exit(1);
-       }
-      switch (var->for_type)
-       {
-       case PREDEF:
-         if ( strcmp(var->name,"rhs") == 0)
-           sprintf(str,"rhsk");
-         else
-           sprintf(str,"%s",var->name);
-         strcat(call,str);
-         strcat(call,",");
-         break;
-       case 0:
-       case INT:
-         sprintf(str,"%s",var->for_name[0]);
-         if ( ~isdigit(str[0]))
-           {
-             strcat(call,str);
-             strcat(call,",");
-           }
-         else
-           {
-             Fprintf(f,indent,"locd%d= int(%s)\n",farg,var->for_name[0]);
-             sprintf(str,"locd%d,",farg);
-             strcat(call,str);
-             sprintf(str,"locd%d",farg);
-             AddDeclare(DEC_INT,str);
-           }
-         break;
-       case DOUBLE:
-         Fprintf(f,indent,"locd%d= dble(%s)\n",farg,var->for_name[0]);
-         sprintf(str,"locd%d,",farg);
-         strcat(call,str);
-         sprintf(str,"locd%d",farg);
-         AddDeclare(DEC_DOUBLE,str);
-         break;
-       case REAL:
-         Fprintf(f,indent,"locr%d=real(%s)\n",farg,var->for_name[0]);
-         sprintf(str,"locr%d,",farg);
-         strcat(call,str);
-         sprintf(str,"locr%d",farg);
-         AddDeclare(DEC_REAL,str);
-         break;
-       case CHAR:
-       case CSTRINGV:
-         printf("a dimension variable cannot have FORTRAN type \"%s\"\n",SGetForType(var->for_type));
-         exit(1);
-         break;
-       }
-      break;
-    /* working or output argument (always double reservation!) */
+        /* FORTRAN argument is the dimension of an output variable with EXTERNAL type */
+        if (var->nfor_name == 0 && var->for_type != PREDEF)
+        {
+            printf("dimension variable \"%s\" is not defined\n",var->name);
+            exit(1);
+        }
+        switch (var->for_type)
+        {
+        case PREDEF:
+            if ( strcmp(var->name,"rhs") == 0)
+                sprintf(str,"rhsk");
+            else
+                sprintf(str,"%s",var->name);
+            strcat(call,str);
+            strcat(call,",");
+            break;
+        case 0:
+        case INT:
+            sprintf(str,"%s",var->for_name[0]);
+            if ( ~isdigit(str[0]))
+            {
+                strcat(call,str);
+                strcat(call,",");
+            }
+            else
+            {
+                Fprintf(f,indent,"locd%d= int(%s)\n",farg,var->for_name[0]);
+                sprintf(str,"locd%d,",farg);
+                strcat(call,str);
+                sprintf(str,"locd%d",farg);
+                AddDeclare(DEC_INT,str);
+            }
+            break;
+        case DOUBLE:
+            Fprintf(f,indent,"locd%d= dble(%s)\n",farg,var->for_name[0]);
+            sprintf(str,"locd%d,",farg);
+            strcat(call,str);
+            sprintf(str,"locd%d",farg);
+            AddDeclare(DEC_DOUBLE,str);
+            break;
+        case REAL:
+            Fprintf(f,indent,"locr%d=real(%s)\n",farg,var->for_name[0]);
+            sprintf(str,"locr%d,",farg);
+            strcat(call,str);
+            sprintf(str,"locr%d",farg);
+            AddDeclare(DEC_REAL,str);
+            break;
+        case CHAR:
+        case CSTRINGV:
+            printf("a dimension variable cannot have FORTRAN type \"%s\"\n",SGetForType(var->for_type));
+            exit(1);
+            break;
+        }
+        break;
+        /* working or output argument (always double reservation!) */
     case COLUMN:
     case ROW:
     case WORK:
     case POLYNOM:
     case VECTOR:
-      WriteCallRestCheck(f,var,farg,"nn",0,0) ;
-      if (var->for_type == EXTERNAL)
-       strcpy(str1,"1");
-      else
-       strcpy(str1,Forname2Int(variables[var->el[0]-1]->for_name[0]));
-      AddDeclare(DEC_LOGICAL,"cremat");
-      Fprintf(f,indent,"if(.not.cremat(fname,top+%d,0,%s,1,lw%d,loc%d)) return\n",icre++,str1,farg,farg);
-      sprintf(str,"stk(lw%d),",farg);
-      strcat(call,str);
-      break;
+        WriteCallRestCheck(f,var,farg,"nn",0,0) ;
+        if (var->for_type == EXTERNAL)
+            strcpy(str1,"1");
+        else
+            strcpy(str1,Forname2Int(variables[var->el[0]-1]->for_name[0]));
+        AddDeclare(DEC_LOGICAL,"cremat");
+        Fprintf(f,indent,"if(.not.cremat(fname,top+%d,0,%s,1,lw%d,loc%d)) return\n",icre++,str1,farg,farg);
+        sprintf(str,"stk(lw%d),",farg);
+        strcat(call,str);
+        break;
     case SPARSE :
-      WriteCallRestCheck(f,var,farg,"nn",0,0) ;
-      WriteCallRestCheck(f,var,farg,"mm",1,0) ;
-      if (var->for_type == EXTERNAL)
-       {
-         strcpy(str1,"1");
-         strcpy(str2,"1");
-         Fprintf(f,indent,"if(.not.cremat(fname,top+%d,0,%s,%s,lw%d,lwc%d)) return\n",icre++,str1,str2,farg,farg);
-         AddDeclare(DEC_LOGICAL,"cremat");
-         sprintf(str,"stk(lw%d),",farg);
-         strcat(call,str);
-       }
-      else
-       {
-         sprintf(str1,"%s",Forname2Int(variables[var->el[0]-1]->for_name[0]));
-         sprintf(str2,"%s",Forname2Int(variables[var->el[1]-1]->for_name[0]));
-         sprintf(str3,"%s",Forname2Int(variables[var->el[2]-1]->for_name[0]));
-         sprintf(str4,"%s",Forname2Int(variables[var->el[3]-1]->for_name[0]));
-         AddDeclare(DEC_LOGICAL,"cresparse");
-         Fprintf(f,indent,"if(.not.cresparse(fname,top+%d,%s,%s,%s,%s,mnel%d,icol%d,lw%d,lwc%d)) return\n",icre++,str4,str1,str2,str3,farg,farg,farg,farg);
-         sprintf(str,"%s,%s,%s,%s,istk(mnel%d),istk(icol%d),stk(lw%d),stk(lwc%d),",
-                 str4,str1,str2,str3,farg,farg,farg,farg);
-         strcat(call,str);
-       }
-      break;
+        WriteCallRestCheck(f,var,farg,"nn",0,0) ;
+        WriteCallRestCheck(f,var,farg,"mm",1,0) ;
+        if (var->for_type == EXTERNAL)
+        {
+            strcpy(str1,"1");
+            strcpy(str2,"1");
+            Fprintf(f,indent,"if(.not.cremat(fname,top+%d,0,%s,%s,lw%d,lwc%d)) return\n",icre++,str1,str2,farg,farg);
+            AddDeclare(DEC_LOGICAL,"cremat");
+            sprintf(str,"stk(lw%d),",farg);
+            strcat(call,str);
+        }
+        else
+        {
+            sprintf(str1,"%s",Forname2Int(variables[var->el[0]-1]->for_name[0]));
+            sprintf(str2,"%s",Forname2Int(variables[var->el[1]-1]->for_name[0]));
+            sprintf(str3,"%s",Forname2Int(variables[var->el[2]-1]->for_name[0]));
+            sprintf(str4,"%s",Forname2Int(variables[var->el[3]-1]->for_name[0]));
+            AddDeclare(DEC_LOGICAL,"cresparse");
+            Fprintf(f,indent,"if(.not.cresparse(fname,top+%d,%s,%s,%s,%s,mnel%d,icol%d,lw%d,lwc%d)) return\n",icre++,str4,str1,str2,str3,farg,farg,farg,farg);
+            sprintf(str,"%s,%s,%s,%s,istk(mnel%d),istk(icol%d),stk(lw%d),stk(lwc%d),",
+                str4,str1,str2,str3,farg,farg,farg,farg);
+            strcat(call,str);
+        }
+        break;
     case IMATRIX:
-      WriteCallRestCheck(f,var,farg,"nn",0,0) ;
-      WriteCallRestCheck(f,var,farg,"mm",1,0) ;
-      if (var->for_type == EXTERNAL)
-       {
-         strcpy(str1,"1");
-         strcpy(str2,"1");
-         strcpy(str3,"1");
-       }
-      else
-       {
-         sprintf(str1,"%s",Forname2Int(variables[var->el[0]-1]->for_name[0]));
-         sprintf(str2,"%s",Forname2Int(variables[var->el[1]-1]->for_name[0]));
-         sprintf(str3,"%s",Forname2Int(variables[var->el[2]-1]->for_name[0]));
-       };
-      AddDeclare(DEC_LOGICAL,"cremat");
-      Fprintf(f,indent,"if(.not.cremat(fname,top+%d,%s,%s,%s,lw%d,lwc%d)) return\n",icre++,str3,str1,str2,farg,farg);
-      sprintf(str3,"%s",Forname2Int(variables[var->el[2]-1]->for_name[0]));
-      sprintf(str,"stk(lw%d),stk(lwc%d),%s,",farg,farg,str3);
-      strcat(call,str);
-      break;
+        WriteCallRestCheck(f,var,farg,"nn",0,0) ;
+        WriteCallRestCheck(f,var,farg,"mm",1,0) ;
+        if (var->for_type == EXTERNAL)
+        {
+            strcpy(str1,"1");
+            strcpy(str2,"1");
+            strcpy(str3,"1");
+        }
+        else
+        {
+            sprintf(str1,"%s",Forname2Int(variables[var->el[0]-1]->for_name[0]));
+            sprintf(str2,"%s",Forname2Int(variables[var->el[1]-1]->for_name[0]));
+            sprintf(str3,"%s",Forname2Int(variables[var->el[2]-1]->for_name[0]));
+        };
+        AddDeclare(DEC_LOGICAL,"cremat");
+        Fprintf(f,indent,"if(.not.cremat(fname,top+%d,%s,%s,%s,lw%d,lwc%d)) return\n",icre++,str3,str1,str2,farg,farg);
+        sprintf(str3,"%s",Forname2Int(variables[var->el[2]-1]->for_name[0]));
+        sprintf(str,"stk(lw%d),stk(lwc%d),%s,",farg,farg,str3);
+        strcat(call,str);
+        break;
     case MATRIX:
-      WriteCallRestCheck(f,var,farg,"nn",0,0) ;
-      WriteCallRestCheck(f,var,farg,"mm",1,0) ;
-      if (var->for_type == EXTERNAL)
-       {
-         strcpy(str1,"1");
-         strcpy(str2,"1");
-       }
-      else
-       {
-         sprintf(str1,"%s",Forname2Int(variables[var->el[0]-1]->for_name[0]));
-         sprintf(str2,"%s",Forname2Int(variables[var->el[1]-1]->for_name[0]));
-       };
-      AddDeclare(DEC_LOGICAL,"cremat");
-      Fprintf(f,indent,"if(.not.cremat(fname,top+%d,0,%s,%s,lw%d,lwc%d)) return\n",icre++,str1,str2,farg,farg);
-      sprintf(str,"stk(lw%d),",farg);
-      strcat(call,str);
-      break;
+        WriteCallRestCheck(f,var,farg,"nn",0,0) ;
+        WriteCallRestCheck(f,var,farg,"mm",1,0) ;
+        if (var->for_type == EXTERNAL)
+        {
+            strcpy(str1,"1");
+            strcpy(str2,"1");
+        }
+        else
+        {
+            sprintf(str1,"%s",Forname2Int(variables[var->el[0]-1]->for_name[0]));
+            sprintf(str2,"%s",Forname2Int(variables[var->el[1]-1]->for_name[0]));
+        };
+        AddDeclare(DEC_LOGICAL,"cremat");
+        Fprintf(f,indent,"if(.not.cremat(fname,top+%d,0,%s,%s,lw%d,lwc%d)) return\n",icre++,str1,str2,farg,farg);
+        sprintf(str,"stk(lw%d),",farg);
+        strcat(call,str);
+        break;
     case BMATRIX:
-      WriteCallRestCheck(f,var,farg,"nn",0,0) ;
-      WriteCallRestCheck(f,var,farg,"mm",1,0) ;
-      if (var->for_type == EXTERNAL)
-       {
-         strcpy(str1,"1");
-         strcpy(str2,"1");
-       }
-      else
-       {
-         sprintf(str1,"%s",Forname2Int(variables[var->el[0]-1]->for_name[0]));
-         sprintf(str2,"%s",Forname2Int(variables[var->el[1]-1]->for_name[0]));
-       };
-      AddDeclare(DEC_LOGICAL,"crebmat");
-      Fprintf(f,indent,"if(.not.crebmat(fname,top+%d,%s,%s,lw%d)) return\n",icre++,str1,str2,farg);
-      sprintf(str,"istk(lw%d),",farg);
-      strcat(call,str);
-      break;
+        WriteCallRestCheck(f,var,farg,"nn",0,0) ;
+        WriteCallRestCheck(f,var,farg,"mm",1,0) ;
+        if (var->for_type == EXTERNAL)
+        {
+            strcpy(str1,"1");
+            strcpy(str2,"1");
+        }
+        else
+        {
+            sprintf(str1,"%s",Forname2Int(variables[var->el[0]-1]->for_name[0]));
+            sprintf(str2,"%s",Forname2Int(variables[var->el[1]-1]->for_name[0]));
+        };
+        AddDeclare(DEC_LOGICAL,"crebmat");
+        Fprintf(f,indent,"if(.not.crebmat(fname,top+%d,%s,%s,lw%d)) return\n",icre++,str1,str2,farg);
+        sprintf(str,"istk(lw%d),",farg);
+        strcat(call,str);
+        break;
     case SCIMPOINTER:
     case SCISMPOINTER:
     case SCILPOINTER:
     case SCIBPOINTER:
     case SCIOPOINTER:
-      sprintf(buf,"cre%s", SGetSciType(var->type));
-      AddDeclare(DEC_LOGICAL,buf);
-      Fprintf(f,indent,"if(.not.cre%s(fname,top+%d,lw%d)) return\n", SGetSciType(var->type),icre++,farg);
-      sprintf(str,"stk(lw%d),",farg);
-      strcat(call,str);
-      break;
+        sprintf(buf,"cre%s", SGetSciType(var->type));
+        AddDeclare(DEC_LOGICAL,buf);
+        Fprintf(f,indent,"if(.not.cre%s(fname,top+%d,lw%d)) return\n", SGetSciType(var->type),icre++,farg);
+        sprintf(str,"stk(lw%d),",farg);
+        strcat(call,str);
+        break;
     case STRINGMAT:
-      if (var->for_type == EXTERNAL || var->for_type == CSTRINGV )
-       {
-         /* for external or cstringv parameters, unknown formal dimensions
-            can be used */
-         WriteCallRestCheck(f,var,farg,"mm",0,1) ;
-         WriteCallRestCheck(f,var,farg,"nn",1,1) ;
-         sprintf(str,"mm%d",farg);
-         AddForName1(var->el[0],str);
-         sprintf(str,"nn%d",farg);
-         AddForName1(var->el[1],str);
-         AddDeclare(DEC_LOGICAL,"crepointer");
-         Fprintf(f,indent,"if(.not.crepointer(fname,top+%d,lw%d)) return\n",icre++,farg);
-         sprintf(str,"stk(lw%d),",farg);
-         strcat(call,str);
-       }
-      else
-       {
-         /** XXXX dimensions should be specifief **/
-         fprintf(stderr,"WARNING : your code contains a specification\n");
-         fprintf(stderr," not fully implemented in intersci\n");
-         WriteCallRestCheck(f,var,farg,"mm",0,0) ;
-         WriteCallRestCheck(f,var,farg,"nn",1,0) ;
-         AddDeclare(DEC_LOGICAL,"cresmatafaire");
-         Fprintf(f,indent,"if(.not.cresmatafaire(fname,top+%d,lw%d)) return\n",icre++,farg);
-         sprintf(str,"stk(lw%d),",farg);
-         strcat(call,str);
-       }
-      break;
+        if (var->for_type == EXTERNAL || var->for_type == CSTRINGV )
+        {
+            /* for external or cstringv parameters, unknown formal dimensions
+            can be used */
+            WriteCallRestCheck(f,var,farg,"mm",0,1) ;
+            WriteCallRestCheck(f,var,farg,"nn",1,1) ;
+            sprintf(str,"mm%d",farg);
+            AddForName1(var->el[0],str);
+            sprintf(str,"nn%d",farg);
+            AddForName1(var->el[1],str);
+            AddDeclare(DEC_LOGICAL,"crepointer");
+            Fprintf(f,indent,"if(.not.crepointer(fname,top+%d,lw%d)) return\n",icre++,farg);
+            sprintf(str,"stk(lw%d),",farg);
+            strcat(call,str);
+        }
+        else
+        {
+            /** XXXX dimensions should be specifief **/
+            fprintf(stderr,"WARNING : your code contains a specification\n");
+            fprintf(stderr," not fully implemented in intersci\n");
+            WriteCallRestCheck(f,var,farg,"mm",0,0) ;
+            WriteCallRestCheck(f,var,farg,"nn",1,0) ;
+            AddDeclare(DEC_LOGICAL,"cresmatafaire");
+            Fprintf(f,indent,"if(.not.cresmatafaire(fname,top+%d,lw%d)) return\n",icre++,farg);
+            sprintf(str,"stk(lw%d),",farg);
+            strcat(call,str);
+        }
+        break;
     case SCALAR:
-      AddDeclare(DEC_LOGICAL,"cremat");
-      Fprintf(f,indent,"if(.not.cremat(fname,top+%d,0,1,1,lw%d,loc%d)) return\n",icre++,farg,farg);
-      sprintf(str,"stk(lw%d),",farg);
-      strcat(call,str);
-      break;
+        AddDeclare(DEC_LOGICAL,"cremat");
+        Fprintf(f,indent,"if(.not.cremat(fname,top+%d,0,1,1,lw%d,loc%d)) return\n",icre++,farg,farg);
+        sprintf(str,"stk(lw%d),",farg);
+        strcat(call,str);
+        break;
     case STRING:
-      WriteCallRestCheck(f,var,farg,"nn",0,0) ;
-      if (var->for_type == EXTERNAL)
-       {
-         AddDeclare(DEC_LOGICAL,"crepointer");
-         Fprintf(f,indent,"if(.not.crepointer(fname,top+%d,lw%d)) return\n",icre++,farg);
-         sprintf(str,"stk(lw%d),",farg);
-         strcat(call,str);
-       }
-      else
-       {
-         strcpy(str1,Forname2Int(variables[var->el[0]-1]->for_name[0]));
-         AddDeclare(DEC_LOGICAL,"cresmat2");
-         Fprintf(f,indent,"if(.not.cresmat2(fname,top+%d,%s,lr%d)) return\n",icre++,str1,farg);
-         AddDeclare(DEC_LOGICAL,"bufstore");
-         Fprintf(f,indent,"if(.not.bufstore(fname,lbuf,lbufi%d,lbuff%d,lr%d,%s)) return\n",farg,farg,farg,str1);
-         sprintf(str,"buf(lbufi%d:lbuff%d),",farg,farg);
-         strcat(call,str);
-       }
-      break;
+        WriteCallRestCheck(f,var,farg,"nn",0,0) ;
+        if (var->for_type == EXTERNAL)
+        {
+            AddDeclare(DEC_LOGICAL,"crepointer");
+            Fprintf(f,indent,"if(.not.crepointer(fname,top+%d,lw%d)) return\n",icre++,farg);
+            sprintf(str,"stk(lw%d),",farg);
+            strcat(call,str);
+        }
+        else
+        {
+            strcpy(str1,Forname2Int(variables[var->el[0]-1]->for_name[0]));
+            AddDeclare(DEC_LOGICAL,"cresmat2");
+            Fprintf(f,indent,"if(.not.cresmat2(fname,top+%d,%s,lr%d)) return\n",icre++,str1,farg);
+            AddDeclare(DEC_LOGICAL,"bufstore");
+            Fprintf(f,indent,"if(.not.bufstore(fname,lbuf,lbufi%d,lbuff%d,lr%d,%s)) return\n",farg,farg,farg,str1);
+            sprintf(str,"buf(lbufi%d:lbuff%d),",farg,farg);
+            strcat(call,str);
+        }
+        break;
     case LIST:
     case TLIST:
     case SEQUENCE:
     case ANY:
-      printf("work or output FORTRAN argument cannot have\n");
-      printf("  type \"ANY\", \"LIST\", \"TLIST\" or \"SEQUENCE\"\n");
-      exit(1);
-      break;
+        printf("work or output FORTRAN argument cannot have\n");
+        printf("  type \"ANY\", \"LIST\", \"TLIST\" or \"SEQUENCE\"\n");
+        exit(1);
+        break;
     }
 }
 
 /* Utility function for WriteCallRest
-   when flag==1 we acccept undefined dimensions
-   this is used with stringmat/Cstringv
-   where dimensions and space are allocated inside
-   the interfaced function and returned
-   to the interface */
+when flag==1 we acccept undefined dimensions
+this is used with stringmat/Cstringv
+where dimensions and space are allocated inside
+the interfaced function and returned
+to the interface */
 
 void WriteCallRestCheck(f,var,farg,name,iel,flag)
-     VARPTR var ;
-     FILE *f;
-     char *name;
-     int iel,farg,flag;
+VARPTR var ;
+FILE *f;
+char *name;
+int iel,farg,flag;
 {
-  char sdim[MAXNAM];
-  char str[MAXNAM];
-  int ind,j;
-  if (variables[var->el[iel]-1]->nfor_name == 0)
+    char sdim[MAXNAM];
+    char str[MAXNAM];
+    int ind,j;
+    if (variables[var->el[iel]-1]->nfor_name == 0)
     {
-      strcpy(str,variables[var->el[iel]-1]->name);
-      if (isdigit(str[0]) == 0)
-       {
-         ind = 0;
-         for (j = 0; j < basfun->nin; j++)
-           {
-             if (strcmp(variables[var->el[iel]-1]->name,
-                        variables[basfun->in[j]-1]->name) == 0)
-               {
-                 /* dimension of FORTRAN argument is a SCILAB argument */
-                 sprintf(sdim,"%s%d",name,farg);
-                 Fprintf(f,indent,"%s= int(stk(lr%d))\n",sdim,j+1);
-                 AddForName1(var->el[iel],sdim);
-                 ind = 1;
-                 break;
-               }
-           }
-         if (ind == 0 && flag != 1 )
-           {
-             /**
-             printf("dimension variable \"%s\" is not defined\n",
-                    variables[var->el[iel]-1]->name);
-             exit(1);
-             **/
-           }
-       }
-      else
-       {
-         sprintf(sdim,"%s%d",name,farg);
-         Fprintf(f,indent,"%s=%s\n",sdim,str);
-         AddForName1(var->el[iel],sdim);
-       }
+        strcpy(str,variables[var->el[iel]-1]->name);
+        if (isdigit(str[0]) == 0)
+        {
+            ind = 0;
+            for (j = 0; j < basfun->nin; j++)
+            {
+                if (strcmp(variables[var->el[iel]-1]->name,
+                    variables[basfun->in[j]-1]->name) == 0)
+                {
+                    /* dimension of FORTRAN argument is a SCILAB argument */
+                    sprintf(sdim,"%s%d",name,farg);
+                    Fprintf(f,indent,"%s= int(stk(lr%d))\n",sdim,j+1);
+                    AddForName1(var->el[iel],sdim);
+                    ind = 1;
+                    break;
+                }
+            }
+            if (ind == 0 && flag != 1 )
+            {
+                /**
+                printf("dimension variable \"%s\" is not defined\n",
+                variables[var->el[iel]-1]->name);
+                exit(1);
+                **/
+            }
+        }
+        else
+        {
+            sprintf(sdim,"%s%d",name,farg);
+            Fprintf(f,indent,"%s=%s\n",sdim,str);
+            AddForName1(var->el[iel],sdim);
+        }
     }
 }
 
 void WriteOutput(f)
-     FILE *f;
+FILE *f;
 {
-  IVAR iout,ivar;
-  VARPTR var,vout;
-  int i;
+    IVAR iout,ivar;
+    VARPTR var,vout;
+    int i;
 
-  Fprintf(f,indent,"topk=top-rhs\n");
-  AddDeclare(DEC_INT,"topl");
-  Fprintf(f,indent,"topl=top+%d\n",icre-1);
+    Fprintf(f,indent,"topk=top-rhs\n");
+    AddDeclare(DEC_INT,"topl");
+    Fprintf(f,indent,"topl=top+%d\n",icre-1);
 
-  iout = GetExistOutVar();
-  vout = variables[iout -1];
+    iout = GetExistOutVar();
+    vout = variables[iout -1];
 
-  switch (vout->type) {
+    switch (vout->type) {
   case LIST:
   case TLIST:
-    FCprintf(f,"c       Creation of output %s\n",SGetSciType(vout->type));
-    Fprintf(f,indent,"top=topl+1\n");
-    Fprintf(f,indent,"call cre%s(top,%d,lw)\n",SGetSciType(vout->type),vout->length);
-    /* loop on output variables */
-    for (i = 0; i < vout->length; i++)
+      FCprintf(f,"c       Creation of output %s\n",SGetSciType(vout->type));
+      Fprintf(f,indent,"top=topl+1\n");
+      Fprintf(f,indent,"call cre%s(top,%d,lw)\n",SGetSciType(vout->type),vout->length);
+      /* loop on output variables */
+      for (i = 0; i < vout->length; i++)
       {
-       ivar = vout->el[i];
-       var = variables[ivar-1];
-       FCprintf(f,"c    \n");
-       FCprintf(f,"c       Element %d: %s\n",i+1,var->name);
-       WriteVariable(f,var,ivar,1,i+1);
+          ivar = vout->el[i];
+          var = variables[ivar-1];
+          FCprintf(f,"c    \n");
+          FCprintf(f,"c       Element %d: %s\n",i+1,var->name);
+          WriteVariable(f,var,ivar,1,i+1);
       }
-    FCprintf(f,"c    \n");
-    FCprintf(f,"c     Putting in order the stack\n");
-    Fprintf(f,indent,"call copyobj(fname,topl+1,topk+1)\n");
-    Fprintf(f,indent,"top=topk+1\n");
-    Fprintf(f,indent,"return\n");
-    break;
+      FCprintf(f,"c    \n");
+      FCprintf(f,"c     Putting in order the stack\n");
+      Fprintf(f,indent,"call copyobj(fname,topl+1,topk+1)\n");
+      Fprintf(f,indent,"top=topk+1\n");
+      Fprintf(f,indent,"return\n");
+      break;
   case SEQUENCE:
-    /* loop on output variables */
-    for (i = 0; i < vout->length; i++)
+      /* loop on output variables */
+      for (i = 0; i < vout->length; i++)
       {
-       ivar = vout->el[i];
-       var = variables[ivar-1];
-       FCprintf(f,"c    \n");
-       Fprintf(f,indent++,"if(lhs .ge. %d) then\n",i+1);
-       FCprintf(f,"c       --------------output variable: %s\n",var->name);
-       Fprintf(f,indent,"top=topl+%d\n",i+1);
-       WriteVariable(f,var,ivar,0,0);
-       Fprintf(f,--indent,"endif\n");
+          ivar = vout->el[i];
+          var = variables[ivar-1];
+          FCprintf(f,"c    \n");
+          Fprintf(f,indent++,"if(lhs .ge. %d) then\n",i+1);
+          FCprintf(f,"c       --------------output variable: %s\n",var->name);
+          Fprintf(f,indent,"top=topl+%d\n",i+1);
+          WriteVariable(f,var,ivar,0,0);
+          Fprintf(f,--indent,"endif\n");
       }
-    FCprintf(f,"c     Putting in order the stack\n");
-    for (i = 0; i < vout->length; i++)
+      FCprintf(f,"c     Putting in order the stack\n");
+      for (i = 0; i < vout->length; i++)
       {
-       Fprintf(f,indent++,"if(lhs .ge. %d) then\n",i+1);
-       Fprintf(f,indent,"call copyobj(fname,topl+%d,topk+%d)\n",i+1,i+1);
-       Fprintf(f,--indent,"endif\n");
+          Fprintf(f,indent++,"if(lhs .ge. %d) then\n",i+1);
+          Fprintf(f,indent,"call copyobj(fname,topl+%d,topk+%d)\n",i+1,i+1);
+          Fprintf(f,--indent,"endif\n");
       }
-    Fprintf(f,indent,"top=topk+lhs\n");
-    Fprintf(f,indent,"return\n");
-    break;
+      Fprintf(f,indent,"top=topk+lhs\n");
+      Fprintf(f,indent,"return\n");
+      break;
   case EMPTY:
-    FCprintf(f,"c       no output variable\n");
-    Fprintf(f,indent,"top=topk+1\n");
-    Fprintf(f,indent,"call objvide(fname,top)\n");
-    Fprintf(f,indent,"return\n");
-    break;
-  }
-  Fprintf(f,indent,"end\n");
-  FCprintf(f,"c\n");
+      FCprintf(f,"c       no output variable\n");
+      Fprintf(f,indent,"top=topk+1\n");
+      Fprintf(f,indent,"call objvide(fname,top)\n");
+      Fprintf(f,indent,"return\n");
+      break;
+    }
+    Fprintf(f,indent,"end\n");
+    FCprintf(f,"c\n");
 }
 
 void WriteVariableOutput(f,var,barg,farg,convert,insidelist,nel)
-     FILE *f;
-     VARPTR var;
-     int barg, farg, insidelist,convert,nel;
+FILE *f;
+VARPTR var;
+int barg, farg, insidelist,convert,nel;
 {
-  char strR[MAXNAM];
-  char str[MAXNAM];
-  char strc[MAXNAM];
-  char strit[MAXNAM];
-  char str1[MAXNAM];
-  char str2[MAXNAM];
-  char str3[MAXNAM];
-  char str4[MAXNAM];
-  if (convert == 1) {
-    /* seams to give a bug with ex13fi.desc
-    barg = 0;
-    */
-  }
-  /* farg and barg depends on the list or not list case */
+    char strR[MAXNAM];
+    char str[MAXNAM];
+    char strc[MAXNAM];
+    char strit[MAXNAM];
+    char str1[MAXNAM];
+    char str2[MAXNAM];
+    char str3[MAXNAM];
+    char str4[MAXNAM];
+    if (convert == 1) {
+        /* seams to give a bug with ex13fi.desc
+        barg = 0;
+        */
+    }
+    /* farg and barg depends on the list or not list case */
 
-  /* if ( insidelist != 0 && var->list_name != (char *) 0 ) */
-  /* jpc sept 1997 : was the var inside a list or not */
+    /* if ( insidelist != 0 && var->list_name != (char *) 0 ) */
+    /* jpc sept 1997 : was the var inside a list or not */
 
-  /* bug here on Windows (intersci example ext11c) */
-  /* var->list_name!= (char *) 0 OK but not with a valid pointer */
+    /* bug here on Windows (intersci example ext11c) */
+    /* var->list_name!= (char *) 0 OK but not with a valid pointer */
 
-  if ( var->list_name != (char *) 0 )
+    if ( var->list_name != (char *) 0 )
     {
-      int ivart,fargt,bargt,nel1;
-      ivart=GetExistVar(var->list_name);
-      bargt=GetNumberInScilabCall(ivart);
-      fargt=GetNumberInFortranCall(ivart);
-      nel1= var->list_el;
-      if (convert == 1)
-       {
-         /* tricky, isn'it ? */
-         bargt = 0;
-       }
-      if (bargt == 0)
-       {
-         sprintf(strR,"%de%d",fargt,nel1);
-         sprintf(str,"lw%de%d",fargt,nel1);
-         sprintf(strc,"lwc%de%d",fargt,nel1);
-         sprintf(strit,"itr%de%d",fargt,nel1);
-       }
-      else
-       {
-         sprintf(strR,"%de%d",bargt,nel1);
-         sprintf(str,"lr%de%d",bargt,nel1);
-         sprintf(strc,"lc%de%d",bargt,nel1);
-         sprintf(strit,"it%de%d",bargt,nel1); /** sept97 itr->it **/
-       }
-    }
-  else
+        int ivart,fargt,bargt,nel1;
+        ivart=GetExistVar(var->list_name);
+        bargt=GetNumberInScilabCall(ivart);
+        fargt=GetNumberInFortranCall(ivart);
+        nel1= var->list_el;
+        if (convert == 1)
+        {
+            /* tricky, isn'it ? */
+            bargt = 0;
+        }
+        if (bargt == 0)
+        {
+            sprintf(strR,"%de%d",fargt,nel1);
+            sprintf(str,"lw%de%d",fargt,nel1);
+            sprintf(strc,"lwc%de%d",fargt,nel1);
+            sprintf(strit,"itr%de%d",fargt,nel1);
+        }
+        else
+        {
+            sprintf(strR,"%de%d",bargt,nel1);
+            sprintf(str,"lr%de%d",bargt,nel1);
+            sprintf(strc,"lc%de%d",bargt,nel1);
+            sprintf(strit,"it%de%d",bargt,nel1); /** sept97 itr->it **/
+        }
+    }
+    else
     {
-      if (barg == 0)
-       {
-         sprintf(strR,"%d",farg);
-         sprintf(str,"lw%d",farg);
-         sprintf(strc,"lwc%d",farg);
-         sprintf(strit,"itr%d",farg);
-       }
-      else
-       {
-         sprintf(strR,"%d",barg);
-         sprintf(str,"lr%d",barg);
-         sprintf(strc,"lc%d",barg);
-         sprintf(strit,"it%d",farg); /** Mars 1997 itr -> it **/
-       }
-    }
-  switch (var->type)
+        if (barg == 0)
+        {
+            sprintf(strR,"%d",farg);
+            sprintf(str,"lw%d",farg);
+            sprintf(strc,"lwc%d",farg);
+            sprintf(strit,"itr%d",farg);
+        }
+        else
+        {
+            sprintf(strR,"%d",barg);
+            sprintf(str,"lr%d",barg);
+            sprintf(strc,"lc%d",barg);
+            sprintf(strit,"it%d",farg); /** Mars 1997 itr -> it **/
+        }
+    }
+    switch (var->type)
     {
     case COLUMN:
     case ROW:
     case VECTOR:
     case MATRIX:
     case SCALAR:
-      switch ( var->type  )
-       {
-       case COLUMN:
-         strcpy(str2,"1");
-         strcpy(str1,Forname2Int(variables[var->el[0]-1]->for_name[0]));
-         break;
-       case ROW:
-       case VECTOR:
-         strcpy(str1,"1");
-         strcpy(str2,Forname2Int(variables[var->el[0]-1]->for_name[0]));
-         break;
-       case MATRIX:
-         strcpy(str1,Forname2Int(variables[var->el[0]-1]->for_name[0]));
-         strcpy(str2,Forname2Int(variables[var->el[1]-1]->for_name[0]));
-         break;
-       case SCALAR:
-         strcpy(str1,"1");
-         strcpy(str2,"1");
-         break;
-       }
-      if ( insidelist != 0)
-       {
-         AddDeclare(DEC_LOGICAL,"listcremat");
-         Fprintf(f,indent,"if(.not.listcremat(fname,top,%d,lw,0,%s,%s,lrs,lcs)) return\n",nel,str1,str2);
-       }
-      else
-       {
-         AddDeclare(DEC_LOGICAL,"cremat");
-         Fprintf(f,indent,"if(.not.cremat(fname,top,0,%s,%s,lrs,lcs)) return\n",str1,str2);
-       }
-      if (barg != 0 &&  var->type != SCALAR)
-       {
-         sprintf(str1,"n%d",barg);
-         sprintf(str2,"m%d",barg);
-       }
-      switch (var->for_type)
-       {
-       case INT:
-          Fprintf(f,indent,"call int2db(%s*%s,istk(iadr(%s)),-1,stk(lrs),-1)\n", str1,str2,str);
-         break;
-       case DOUBLE:
-         Fprintf(f,indent,"call dcopy(%s*%s,stk(%s),1,stk(lrs),1)\n", str1,str2,str);
-         break;
-       case REAL:
-         Fprintf(f,indent,"call rea2db(%s*%s,stk(%s),-1,stk(lrs),-1)\n", str1,str2,str);
-         break;
-       }
-      break;
+        switch ( var->type  )
+        {
+        case COLUMN:
+            strcpy(str2,"1");
+            strcpy(str1,Forname2Int(variables[var->el[0]-1]->for_name[0]));
+            break;
+        case ROW:
+        case VECTOR:
+            strcpy(str1,"1");
+            strcpy(str2,Forname2Int(variables[var->el[0]-1]->for_name[0]));
+            break;
+        case MATRIX:
+            strcpy(str1,Forname2Int(variables[var->el[0]-1]->for_name[0]));
+            strcpy(str2,Forname2Int(variables[var->el[1]-1]->for_name[0]));
+            break;
+        case SCALAR:
+            strcpy(str1,"1");
+            strcpy(str2,"1");
+            break;
+        }
+        if ( insidelist != 0)
+        {
+            AddDeclare(DEC_LOGICAL,"listcremat");
+            Fprintf(f,indent,"if(.not.listcremat(fname,top,%d,lw,0,%s,%s,lrs,lcs)) return\n",nel,str1,str2);
+        }
+        else
+        {
+            AddDeclare(DEC_LOGICAL,"cremat");
+            Fprintf(f,indent,"if(.not.cremat(fname,top,0,%s,%s,lrs,lcs)) return\n",str1,str2);
+        }
+        if (barg != 0 &&  var->type != SCALAR)
+        {
+            sprintf(str1,"n%d",barg);
+            sprintf(str2,"m%d",barg);
+        }
+        switch (var->for_type)
+        {
+        case INT:
+            Fprintf(f,indent,"call int2db(%s*%s,istk(iadr(%s)),-1,stk(lrs),-1)\n", str1,str2,str);
+            break;
+        case DOUBLE:
+            Fprintf(f,indent,"call dcopy(%s*%s,stk(%s),1,stk(lrs),1)\n", str1,str2,str);
+            break;
+        case REAL:
+            Fprintf(f,indent,"call rea2db(%s*%s,stk(%s),-1,stk(lrs),-1)\n", str1,str2,str);
+            break;
+        }
+        break;
     case BMATRIX:
-      strcpy(str1,Forname2Int(variables[var->el[0]-1]->for_name[0]));
-      strcpy(str2,Forname2Int(variables[var->el[1]-1]->for_name[0]));
-      if ( insidelist != 0)
-       {
-         AddDeclare(DEC_LOGICAL,"listcrebmat");
-         Fprintf(f,indent,"if(.not.listcrebmat(fname,top,%d,lw,%s,%s,lrs)) return\n",nel,str1,str2);
-       }
-      else
-       {
-         AddDeclare(DEC_LOGICAL,"crebmat");
-         Fprintf(f,indent,"if(.not.crebmat(fname,top,%s,%s,lrs)) return\n",str1,str2);
-       }
-      if (barg != 0 &&  var->type != SCALAR)
-       {
-         sprintf(str1,"n%d",barg);
-         sprintf(str2,"m%d",barg);
-       }
-      Fprintf(f,indent,"call icopy(%s*%s,istk(%s),1,istk(lrs),1)\n", str1,str2,str);
-      break;
+        strcpy(str1,Forname2Int(variables[var->el[0]-1]->for_name[0]));
+        strcpy(str2,Forname2Int(variables[var->el[1]-1]->for_name[0]));
+        if ( insidelist != 0)
+        {
+            AddDeclare(DEC_LOGICAL,"listcrebmat");
+            Fprintf(f,indent,"if(.not.listcrebmat(fname,top,%d,lw,%s,%s,lrs)) return\n",nel,str1,str2);
+        }
+        else
+        {
+            AddDeclare(DEC_LOGICAL,"crebmat");
+            Fprintf(f,indent,"if(.not.crebmat(fname,top,%s,%s,lrs)) return\n",str1,str2);
+        }
+        if (barg != 0 &&  var->type != SCALAR)
+        {
+            sprintf(str1,"n%d",barg);
+            sprintf(str2,"m%d",barg);
+        }
+        Fprintf(f,indent,"call icopy(%s*%s,istk(%s),1,istk(lrs),1)\n", str1,str2,str);
+        break;
     case SPARSE:
-      /* Sparse matrix */
-      strcpy(str1,Forname2Int(variables[var->el[0]-1]->for_name[0]));
-      strcpy(str2,Forname2Int(variables[var->el[1]-1]->for_name[0]));
-      strcpy(str3,Forname2Int(variables[var->el[2]-1]->for_name[0]));
-      strcpy(str4,Forname2Int(variables[var->el[3]-1]->for_name[0]));
-      if ( insidelist != 0)
-       {
-         AddDeclare(DEC_LOGICAL,"listcresparse");
-         Fprintf(f,indent,"if(.not.listcresparse(fname,top,%d,lw,%s,%s,%s,%s,mnels,icols,lrs,lcs)) return\n"
-                 ,nel,str4,str1,str2,str3);
-       }
-      else
-       {
-         AddDeclare(DEC_LOGICAL,"cresparse");
-         Fprintf(f,indent,"if(.not.cresparse(fname,top,%s,%s,%s,%s,mnels,icols,lrs,lcs)) return\n"
-                 ,str4,str1,str2,str3);
-       }
-      if (barg != 0 &&  var->type != SCALAR)
-       {
-         sprintf(str1,"m%d",barg);
-         sprintf(str2,"n%d",barg);
-         sprintf(str3,"nel%d",barg);
-         sprintf(str4,"it%d",barg);
-       }
-
-      Fprintf(f,indent,"call icopy(%s,istk(mnel%s),1,istk(mnels),1)\n",
-             str1,strR);
-      Fprintf(f,indent,"call icopy(%s,istk(icol%s),1,istk(icols),1)\n",
-             str3,strR);
-      switch (var->for_type)
-       {
-       case INT:
-         Fprintf(f,indent,"call int2db(%s,istk(iadr(%s)),-1,stk(lrs),-1)\n", str3,str);
-         Fprintf(f,indent++,"if (%s.eq.1) then\n",str4);
-         Fprintf(f,indent,"call int2db(%s,istk(iadr(%s)),-1,stk(lcs),-1)\n", str3,strc);
-         Fprintf(f,indent--,"endif\n");
-         break;
-       case DOUBLE:
-         Fprintf(f,indent,"call dcopy(%s,stk(%s),1,stk(lrs),1)\n", str3,str);
-         Fprintf(f,indent++,"if (%s.eq.1) then\n",str4);
-         Fprintf(f,indent,"call dcopy(%s,stk(%s),1,stk(lcs),1)\n", str3,strc);
-         Fprintf(f,indent--,"endif\n");
-         break;
-       case REAL:
-         Fprintf(f,indent,"call rea2db(%s,stk(%s),-1,stk(lrs),-1)\n", str3,str);
-         Fprintf(f,indent++,"if (%s.eq.1) then\n",str4);
-         Fprintf(f,indent,"call rea2db(%s,stk(%s),-1,stk(lcs),-1)\n", str3,strc);
-         Fprintf(f,indent--,"endif\n");
-         break;
-       }
-      break ;
+        /* Sparse matrix */
+        strcpy(str1,Forname2Int(variables[var->el[0]-1]->for_name[0]));
+        strcpy(str2,Forname2Int(variables[var->el[1]-1]->for_name[0]));
+        strcpy(str3,Forname2Int(variables[var->el[2]-1]->for_name[0]));
+        strcpy(str4,Forname2Int(variables[var->el[3]-1]->for_name[0]));
+        if ( insidelist != 0)
+        {
+            AddDeclare(DEC_LOGICAL,"listcresparse");
+            Fprintf(f,indent,"if(.not.listcresparse(fname,top,%d,lw,%s,%s,%s,%s,mnels,icols,lrs,lcs)) return\n"
+                ,nel,str4,str1,str2,str3);
+        }
+        else
+        {
+            AddDeclare(DEC_LOGICAL,"cresparse");
+            Fprintf(f,indent,"if(.not.cresparse(fname,top,%s,%s,%s,%s,mnels,icols,lrs,lcs)) return\n"
+                ,str4,str1,str2,str3);
+        }
+        if (barg != 0 &&  var->type != SCALAR)
+        {
+            sprintf(str1,"m%d",barg);
+            sprintf(str2,"n%d",barg);
+            sprintf(str3,"nel%d",barg);
+            sprintf(str4,"it%d",barg);
+        }
+
+        Fprintf(f,indent,"call icopy(%s,istk(mnel%s),1,istk(mnels),1)\n",
+            str1,strR);
+        Fprintf(f,indent,"call icopy(%s,istk(icol%s),1,istk(icols),1)\n",
+            str3,strR);
+        switch (var->for_type)
+        {
+        case INT:
+            Fprintf(f,indent,"call int2db(%s,istk(iadr(%s)),-1,stk(lrs),-1)\n", str3,str);
+            Fprintf(f,indent++,"if (%s.eq.1) then\n",str4);
+            Fprintf(f,indent,"call int2db(%s,istk(iadr(%s)),-1,stk(lcs),-1)\n", str3,strc);
+            Fprintf(f,indent--,"endif\n");
+            break;
+        case DOUBLE:
+            Fprintf(f,indent,"call dcopy(%s,stk(%s),1,stk(lrs),1)\n", str3,str);
+            Fprintf(f,indent++,"if (%s.eq.1) then\n",str4);
+            Fprintf(f,indent,"call dcopy(%s,stk(%s),1,stk(lcs),1)\n", str3,strc);
+            Fprintf(f,indent--,"endif\n");
+            break;
+        case REAL:
+            Fprintf(f,indent,"call rea2db(%s,stk(%s),-1,stk(lrs),-1)\n", str3,str);
+            Fprintf(f,indent++,"if (%s.eq.1) then\n",str4);
+            Fprintf(f,indent,"call rea2db(%s,stk(%s),-1,stk(lcs),-1)\n", str3,strc);
+            Fprintf(f,indent--,"endif\n");
+            break;
+        }
+        break ;
     case IMATRIX:
-      /* Imaginary matrix */
-      strcpy(str1,Forname2Int(variables[var->el[0]-1]->for_name[0]));
-      strcpy(str2,Forname2Int(variables[var->el[1]-1]->for_name[0]));
-      strcpy(str3,Forname2Int(variables[var->el[2]-1]->for_name[0]));
-      if ( insidelist != 0)
-       {
-         AddDeclare(DEC_LOGICAL,"listcremat");
-         Fprintf(f,indent,"if(.not.listcremat(fname,top,%d,lw,%s,%s,%s,lrs,lcs)) return\n"
-                 ,nel,str3,str1,str2);
-       }
-      else
-       {
-         AddDeclare(DEC_LOGICAL,"cremat");
-         Fprintf(f,indent,"if(.not.cremat(fname,top,%s,%s,%s,lrs,lcs)) return\n",
-                 str3,str1,str2);
-       }
-      if (barg != 0 &&  var->type != SCALAR)
-       {
-         sprintf(str1,"m%d",barg);
-         sprintf(str2,"n%d",barg);
-         sprintf(str3,"it%d",barg);
-       }
-      switch (var->for_type)
-       {
-       case INT:
-         Fprintf(f,indent,"call int2db(%s*%s,istk(iadr(%s)),-1,stk(lrs),-1)\n", str1,str2,str);
-         Fprintf(f,indent++,"if (%s.eq.1) then\n",str3);
-         Fprintf(f,indent,"call int2db(%s*%s,istk(iadr(%s)),-1,stk(lcs),-1)\n", str1,str2,strc);
-         Fprintf(f,indent--,"endif\n");
-         break;
-       case DOUBLE:
-         Fprintf(f,indent,"call dcopy(%s*%s,stk(%s),1,stk(lrs),1)\n", str1,str2,str);
-         Fprintf(f,indent++,"if (%s.eq.1) then\n",str3);
-         Fprintf(f,indent,"call dcopy(%s*%s,stk(%s),1,stk(lcs),1)\n", str1,str2,strc);
-         Fprintf(f,indent--,"endif\n");
-         break;
-       case REAL:
-         Fprintf(f,indent,"call rea2db(%s*%s,stk(%s),-1,stk(lrs),-1)\n", str1,str2,str);
-         Fprintf(f,indent++,"if (%s.eq.1) then\n",str3);
-         Fprintf(f,indent,"call rea2db(%s*%s,stk(%s),-1,stk(lcs),-1)\n", str1,str2,strc);
-         Fprintf(f,indent--,"endif\n");
-         break;
-       }
-      break ;
-   case POLYNOM:
-      strcpy(str1,Forname2Int(variables[var->el[0]-1]->for_name[0]));
-      if ( insidelist != 0)
-       {
-         AddDeclare(DEC_LOGICAL,"listcreopoly");
-         Fprintf(f,indent,"if(.not.listcreopoly(fname,top,%d,lw,0,%s,name%s,namel%s,lrs,lcs)) return\n",nel,str1,str,str);
-       }
-      else
-       {
-         AddDeclare(DEC_LOGICAL,"creonepoly");
-         Fprintf(f,indent,"if(.not.creonepoly(fname,top,0,%s,name%s,namel%s,lrs,lcs)) return\n",str1,str,str);
-       }
-      switch (var->for_type) {
-      case INT:
-       Fprintf(f,indent,"call int2db(%s,stk(%s),-1,stk(lrs),-1)\n",
-               str1,str);
-       break;
-      case DOUBLE:
-       Fprintf(f,indent,"call dcopy(%s,stk(%s),1,stk(lrs),1)\n",
-               str1,str);
-       break;
-      case REAL:
-       Fprintf(f,indent,"call rea2db(%s,stk(%s),-1,stk(lrs),-1)\n",
-               str1,str);
-       break;
-      }
-      break;
+        /* Imaginary matrix */
+        strcpy(str1,Forname2Int(variables[var->el[0]-1]->for_name[0]));
+        strcpy(str2,Forname2Int(variables[var->el[1]-1]->for_name[0]));
+        strcpy(str3,Forname2Int(variables[var->el[2]-1]->for_name[0]));
+        if ( insidelist != 0)
+        {
+            AddDeclare(DEC_LOGICAL,"listcremat");
+            Fprintf(f,indent,"if(.not.listcremat(fname,top,%d,lw,%s,%s,%s,lrs,lcs)) return\n"
+                ,nel,str3,str1,str2);
+        }
+        else
+        {
+            AddDeclare(DEC_LOGICAL,"cremat");
+            Fprintf(f,indent,"if(.not.cremat(fname,top,%s,%s,%s,lrs,lcs)) return\n",
+                str3,str1,str2);
+        }
+        if (barg != 0 &&  var->type != SCALAR)
+        {
+            sprintf(str1,"m%d",barg);
+            sprintf(str2,"n%d",barg);
+            sprintf(str3,"it%d",barg);
+        }
+        switch (var->for_type)
+        {
+        case INT:
+            Fprintf(f,indent,"call int2db(%s*%s,istk(iadr(%s)),-1,stk(lrs),-1)\n", str1,str2,str);
+            Fprintf(f,indent++,"if (%s.eq.1) then\n",str3);
+            Fprintf(f,indent,"call int2db(%s*%s,istk(iadr(%s)),-1,stk(lcs),-1)\n", str1,str2,strc);
+            Fprintf(f,indent--,"endif\n");
+            break;
+        case DOUBLE:
+            Fprintf(f,indent,"call dcopy(%s*%s,stk(%s),1,stk(lrs),1)\n", str1,str2,str);
+            Fprintf(f,indent++,"if (%s.eq.1) then\n",str3);
+            Fprintf(f,indent,"call dcopy(%s*%s,stk(%s),1,stk(lcs),1)\n", str1,str2,strc);
+            Fprintf(f,indent--,"endif\n");
+            break;
+        case REAL:
+            Fprintf(f,indent,"call rea2db(%s*%s,stk(%s),-1,stk(lrs),-1)\n", str1,str2,str);
+            Fprintf(f,indent++,"if (%s.eq.1) then\n",str3);
+            Fprintf(f,indent,"call rea2db(%s*%s,stk(%s),-1,stk(lcs),-1)\n", str1,str2,strc);
+            Fprintf(f,indent--,"endif\n");
+            break;
+        }
+        break ;
+    case POLYNOM:
+        strcpy(str1,Forname2Int(variables[var->el[0]-1]->for_name[0]));
+        if ( insidelist != 0)
+        {
+            AddDeclare(DEC_LOGICAL,"listcreopoly");
+            Fprintf(f,indent,"if(.not.listcreopoly(fname,top,%d,lw,0,%s,name%s,namel%s,lrs,lcs)) return\n",nel,str1,str,str);
+        }
+        else
+        {
+            AddDeclare(DEC_LOGICAL,"creonepoly");
+            Fprintf(f,indent,"if(.not.creonepoly(fname,top,0,%s,name%s,namel%s,lrs,lcs)) return\n",str1,str,str);
+        }
+        switch (var->for_type) {
+    case INT:
+        Fprintf(f,indent,"call int2db(%s,stk(%s),-1,stk(lrs),-1)\n",
+            str1,str);
+        break;
+    case DOUBLE:
+        Fprintf(f,indent,"call dcopy(%s,stk(%s),1,stk(lrs),1)\n",
+            str1,str);
+        break;
+    case REAL:
+        Fprintf(f,indent,"call rea2db(%s,stk(%s),-1,stk(lrs),-1)\n",
+            str1,str);
+        break;
+        }
+        break;
     case STRING:
-      strcpy(str1,Forname2Int(variables[var->el[0]-1]->for_name[0]));
-      if (barg != 0)
-       {
-         sprintf(str1,"nlr%d",barg);
-       }
-
-      if ( insidelist != 0)
-       {
-         AddDeclare(DEC_LOGICAL,"listcrestring");
-         Fprintf(f,indent,"if(.not.listcrestring(fname,top,%d,lw,%s,ilrs)) return\n",
-                 nel,str1);
-       }
-      else
-       {
-         AddDeclare(DEC_LOGICAL,"cresmat2");
-         Fprintf(f,indent,"if(.not.cresmat2(fname,top,%s,ilrs)) return\n",str1);
-       }
-      Fprintf(f,indent,"call cvstr(%s,istk(ilrs),buf(lbufi%d:lbuff%d),0)\n",
-             str1,farg,farg);
-      break;
+        strcpy(str1,Forname2Int(variables[var->el[0]-1]->for_name[0]));
+        if (barg != 0)
+        {
+            sprintf(str1,"nlr%d",barg);
+        }
+
+        if ( insidelist != 0)
+        {
+            AddDeclare(DEC_LOGICAL,"listcrestring");
+            Fprintf(f,indent,"if(.not.listcrestring(fname,top,%d,lw,%s,ilrs)) return\n",
+                nel,str1);
+        }
+        else
+        {
+            AddDeclare(DEC_LOGICAL,"cresmat2");
+            Fprintf(f,indent,"if(.not.cresmat2(fname,top,%s,ilrs)) return\n",str1);
+        }
+        Fprintf(f,indent,"call cvstr(%s,istk(ilrs),buf(lbufi%d:lbuff%d),0)\n",
+            str1,farg,farg);
+        break;
     case SCISMPOINTER:
     case SCIMPOINTER:
     case SCILPOINTER:
     case SCIBPOINTER:
     case SCIOPOINTER:
-      if ( insidelist != 0)
-       {
-         printf(" %s in output list : not implemented ;",SGetSciType(var->type));
-       }
-      else
-       {
-         sprintf(buf,"cre%s", SGetSciType(var->type));
-         AddDeclare(DEC_LOGICAL,buf);
-         Fprintf(f,indent,"if(.not.cre%s(fname,top,lrs)) return\n", SGetSciType(var->type));
-         Fprintf(f,indent,"stk(lrs)=stk(%s)\n",str);
-       }
-      break;
+        if ( insidelist != 0)
+        {
+            printf(" %s in output list : not implemented ;",SGetSciType(var->type));
+        }
+        else
+        {
+            sprintf(buf,"cre%s", SGetSciType(var->type));
+            AddDeclare(DEC_LOGICAL,buf);
+            Fprintf(f,indent,"if(.not.cre%s(fname,top,lrs)) return\n", SGetSciType(var->type));
+            Fprintf(f,indent,"stk(lrs)=stk(%s)\n",str);
+        }
+        break;
     case STRINGMAT:
-      strcpy(str1,Forname2Int(variables[var->el[0]-1]->for_name[0]));
-      strcpy(str2,Forname2Int(variables[var->el[1]-1]->for_name[0]));
-      sprintf(str,"lw%d",farg);
-      if ( insidelist != 0)
-       {
-         AddDeclare(DEC_LOGICAL,"lcrestringmatfromC");
-         Fprintf(f,indent,"if(.not.lcrestringmatfromC(fname,top,%d,lw,%s,%s,%s)) return\n",
-                 nel,str,str1,str2);
-       }
-      else
-       {
-         AddDeclare(DEC_LOGICAL,"crestringmatfromC");
-         Fprintf(f,indent,"if(.not.crestringmatfromC(fname,top,%s,%s,%s)) return\n",
-                 str,str1,str2);
-       }
-      break;
+        strcpy(str1,Forname2Int(variables[var->el[0]-1]->for_name[0]));
+        strcpy(str2,Forname2Int(variables[var->el[1]-1]->for_name[0]));
+        sprintf(str,"lw%d",farg);
+        if ( insidelist != 0)
+        {
+            AddDeclare(DEC_LOGICAL,"lcrestringmatfromC");
+            Fprintf(f,indent,"if(.not.lcrestringmatfromC(fname,top,%d,lw,%s,%s,%s)) return\n",
+                nel,str,str1,str2);
+        }
+        else
+        {
+            AddDeclare(DEC_LOGICAL,"crestringmatfromC");
+            Fprintf(f,indent,"if(.not.crestringmatfromC(fname,top,%s,%s,%s)) return\n",
+                str,str1,str2);
+        }
+        break;
     case WORK:
     case LIST:
     case TLIST:
     case SEQUENCE:
     case ANY:
-      printf("output variable \"%s\" cannot have type\n",
-            var->name);
-      printf("  \"WORK\", \"LIST\", \"TLIST\", \"SEQUENCE\" or \"ANY\"\n");
-      exit(1);
-      break;
+        printf("output variable \"%s\" cannot have type\n",
+            var->name);
+        printf("  \"WORK\", \"LIST\", \"TLIST\", \"SEQUENCE\" or \"ANY\"\n");
+        exit(1);
+        break;
     }
 }
 
 void WriteExternalVariableOutput(f,var,farg,insidelist,nel)
-     FILE *f;
-     VARPTR var;
-     int farg;
-     int insidelist,nel;
+FILE *f;
+VARPTR var;
+int farg;
+int insidelist,nel;
 {
-  char str[MAXNAM];
-  char str1[MAXNAM];
-  char str2[MAXNAM];
-  char str3[MAXNAM];
-  char str4[MAXNAM];
-  switch (var->type) {
+    char str[MAXNAM];
+    char str1[MAXNAM];
+    char str2[MAXNAM];
+    char str3[MAXNAM];
+    char str4[MAXNAM];
+    switch (var->type) {
   case COLUMN:
   case ROW:
   case VECTOR:
   case MATRIX:
   case SCALAR:
-    switch ( var->type  )
+      switch ( var->type  )
       {
       case COLUMN:
-       strcpy(str2,"1");
-       strcpy(str1,Forname2Int(variables[var->el[0]-1]->for_name[0]));
-       break;
+          strcpy(str2,"1");
+          strcpy(str1,Forname2Int(variables[var->el[0]-1]->for_name[0]));
+          break;
       case ROW:
       case VECTOR:
-       strcpy(str1,"1");
-       strcpy(str2,Forname2Int(variables[var->el[0]-1]->for_name[0]));
-       break;
+          strcpy(str1,"1");
+          strcpy(str2,Forname2Int(variables[var->el[0]-1]->for_name[0]));
+          break;
       case MATRIX:
-       strcpy(str1,Forname2Int(variables[var->el[0]-1]->for_name[0]));
-       strcpy(str2,Forname2Int(variables[var->el[1]-1]->for_name[0]));
-       break;
+          strcpy(str1,Forname2Int(variables[var->el[0]-1]->for_name[0]));
+          strcpy(str2,Forname2Int(variables[var->el[1]-1]->for_name[0]));
+          break;
       case SCALAR:
-       strcpy(str1,"1");
-       strcpy(str2,"1");
-       break;
+          strcpy(str1,"1");
+          strcpy(str2,"1");
+          break;
       }
-    if ( insidelist != 0)
+      if ( insidelist != 0)
       {
-       AddDeclare(DEC_LOGICAL,"listcremat");
-       Fprintf(f,indent,"if(.not.listcremat(fname,top,%d,lw,0,%s,%s,lrs,lcs)) return\n",nel,
-               str1,str2);
+          AddDeclare(DEC_LOGICAL,"listcremat");
+          Fprintf(f,indent,"if(.not.listcremat(fname,top,%d,lw,0,%s,%s,lrs,lcs)) return\n",nel,
+              str1,str2);
       }
-    else
+      else
       {
-       AddDeclare(DEC_LOGICAL,"cremat");
-       Fprintf(f,indent,"if(.not.cremat(fname,top,0,%s,%s,lrs,lcs)) return\n",str1,str2);
+          AddDeclare(DEC_LOGICAL,"cremat");
+          Fprintf(f,indent,"if(.not.cremat(fname,top,0,%s,%s,lrs,lcs)) return\n",str1,str2);
       }
-    sprintf(str,"lw%d",farg);
-    Fprintf(f,indent,"call %s(%s*%s,stk(%s),stk(lrs))\n",  var->fexternal,str1,str2,str);
-    break;
+      sprintf(str,"lw%d",farg);
+      Fprintf(f,indent,"call %s(%s*%s,stk(%s),stk(lrs))\n",  var->fexternal,str1,str2,str);
+      break;
   case IMATRIX:
-    strcpy(str1,Forname2Int(variables[var->el[0]-1]->for_name[0]));
-    strcpy(str2,Forname2Int(variables[var->el[1]-1]->for_name[0]));
-    strcpy(str3,Forname2Int(variables[var->el[2]-1]->for_name[0]));
-    if ( insidelist != 0)
+      strcpy(str1,Forname2Int(variables[var->el[0]-1]->for_name[0]));
+      strcpy(str2,Forname2Int(variables[var->el[1]-1]->for_name[0]));
+      strcpy(str3,Forname2Int(variables[var->el[2]-1]->for_name[0]));
+      if ( insidelist != 0)
       {
-       AddDeclare(DEC_LOGICAL,"listcremat");
-       Fprintf(f,indent,"if(.not.listcremat(fname,top,%d,lw,%s,%s,%s,lrs,lcs)) return\n",
-               nel,str3,str1,str2);
+          AddDeclare(DEC_LOGICAL,"listcremat");
+          Fprintf(f,indent,"if(.not.listcremat(fname,top,%d,lw,%s,%s,%s,lrs,lcs)) return\n",
+              nel,str3,str1,str2);
       }
-    else
+      else
       {
-       AddDeclare(DEC_LOGICAL,"cremat");
-       Fprintf(f,indent,"if(.not.cremat(fname,top,%s,%s,%s,lrs,lcs)) return\n",str3,str1,str2);
+          AddDeclare(DEC_LOGICAL,"cremat");
+          Fprintf(f,indent,"if(.not.cremat(fname,top,%s,%s,%s,lrs,lcs)) return\n",str3,str1,str2);
       }
-    sprintf(str,"lw%d",farg);
-    Fprintf(f,indent,"call %s(%s*%s,stk(%s),stk(lrs))\n",  var->fexternal,str1,str2,str);
-    sprintf(str,"lwc%d",farg);
-    Fprintf(f,indent++,"if  (%s.eq.1) then\n",str3);
-    Fprintf(f,indent,"call %s(%s*%s,stk(%s),stk(lcs))\n",  var->fexternal,str1,str2,str);
-    Fprintf(f,--indent,"endif\n");
-    break;
+      sprintf(str,"lw%d",farg);
+      Fprintf(f,indent,"call %s(%s*%s,stk(%s),stk(lrs))\n",  var->fexternal,str1,str2,str);
+      sprintf(str,"lwc%d",farg);
+      Fprintf(f,indent++,"if  (%s.eq.1) then\n",str3);
+      Fprintf(f,indent,"call %s(%s*%s,stk(%s),stk(lcs))\n",  var->fexternal,str1,str2,str);
+      Fprintf(f,--indent,"endif\n");
+      break;
   case SPARSE:
-    strcpy(str1,Forname2Int(variables[var->el[0]-1]->for_name[0]));
-    strcpy(str2,Forname2Int(variables[var->el[1]-1]->for_name[0]));
-    strcpy(str3,Forname2Int(variables[var->el[2]-1]->for_name[0]));
-    strcpy(str4,Forname2Int(variables[var->el[3]-1]->for_name[0]));
-    if ( insidelist != 0)
+      strcpy(str1,Forname2Int(variables[var->el[0]-1]->for_name[0]));
+      strcpy(str2,Forname2Int(variables[var->el[1]-1]->for_name[0]));
+      strcpy(str3,Forname2Int(variables[var->el[2]-1]->for_name[0]));
+      strcpy(str4,Forname2Int(variables[var->el[3]-1]->for_name[0]));
+      if ( insidelist != 0)
       {
-       AddDeclare(DEC_LOGICAL,"listcresparse");
-       Fprintf(f,indent,"if(.not.listcresparse(fname,top,%d,lw,%s,%s,%s,%s,mnels,icols,lrs,lcs)) return\n"
-               ,nel,str4,str1,str2,str3);
+          AddDeclare(DEC_LOGICAL,"listcresparse");
+          Fprintf(f,indent,"if(.not.listcresparse(fname,top,%d,lw,%s,%s,%s,%s,mnels,icols,lrs,lcs)) return\n"
+              ,nel,str4,str1,str2,str3);
       }
-    else
+      else
       {
-       AddDeclare(DEC_LOGICAL,"cresparse");
-       Fprintf(f,indent,"if(.not.cresparse(fname,top,%s,%s,%s,%s,mnels,icols,lrs,lcs)) return\n"
-               ,str4,str1,str2,str3);
+          AddDeclare(DEC_LOGICAL,"cresparse");
+          Fprintf(f,indent,"if(.not.cresparse(fname,top,%s,%s,%s,%s,mnels,icols,lrs,lcs)) return\n"
+              ,str4,str1,str2,str3);
       }
-    sprintf(str,"lw%d",farg);
-    Fprintf(f,indent,"call %s(stk(%s),istk(mnels),istk(icols),stk(lrs),stk(lcs))\n",var->fexternal,str);
-    break;
+      sprintf(str,"lw%d",farg);
+      Fprintf(f,indent,"call %s(stk(%s),istk(mnels),istk(icols),stk(lrs),stk(lcs))\n",var->fexternal,str);
+      break;
   case BMATRIX:
-    strcpy(str1,Forname2Int(variables[var->el[0]-1]->for_name[0]));
-    strcpy(str2,Forname2Int(variables[var->el[1]-1]->for_name[0]));
-    if ( insidelist != 0)
+      strcpy(str1,Forname2Int(variables[var->el[0]-1]->for_name[0]));
+      strcpy(str2,Forname2Int(variables[var->el[1]-1]->for_name[0]));
+      if ( insidelist != 0)
       {
-       AddDeclare(DEC_LOGICAL,"listcrebmat");
-       Fprintf(f,indent,"if(.not.listcrebmat(fname,top,%d,lw,%s,%s,lrs)) return\n",
-               nel,str1,str2);
+          AddDeclare(DEC_LOGICAL,"listcrebmat");
+          Fprintf(f,indent,"if(.not.listcrebmat(fname,top,%d,lw,%s,%s,lrs)) return\n",
+              nel,str1,str2);
       }
-    else
+      else
       {
-       AddDeclare(DEC_LOGICAL,"crebmat");
-       Fprintf(f,indent,"if(.not.crebmat(fname,top,%s,%s,lrs)) return\n",str1,str2);
+          AddDeclare(DEC_LOGICAL,"crebmat");
+          Fprintf(f,indent,"if(.not.crebmat(fname,top,%s,%s,lrs)) return\n",str1,str2);
       }
-    sprintf(str,"lw%d",farg);
-    Fprintf(f,indent,"call %s(%s*%s,istk(%s),istk(lrs))\n",var->fexternal,str1,str2,str);
-    break;
+      sprintf(str,"lw%d",farg);
+      Fprintf(f,indent,"call %s(%s*%s,istk(%s),istk(lrs))\n",var->fexternal,str1,str2,str);
+      break;
   case POLYNOM:
-    strcpy(str1,Forname2Int(variables[var->el[0]-1]->for_name[0]));
-    strcpy(str2,variables[var->el[1]-1]->name);
-    Fprintf(f,indent,"err=sadr(ilw+10)+%s-lstk(bot)\n",str1);
-    Fprintf(f,indent,"if(err .gt. 0) then\n");
-    Fprintf(f,indent,"call error(17)\n");
-    Fprintf(f,indent,"return\n");
-    Fprintf(f,indent,"endif\n");
-    Fprintf(f,indent,"istk(ilw)=1\n");
-    Fprintf(f,indent,"istk(ilw+1)=1\n");
-    Fprintf(f,indent,"istk(ilw+2)=1\n");
-    Fprintf(f,indent,"istk(ilw+3)=0\n");
-    Fprintf(f,indent,"call cvstr(4,'%s    ',istk(ilw+4),0)\n",str2);
-    /* str2 comes from SCILAB input ??? */
-    Fprintf(f,indent,"istk(ilw+8)=1\n");
-    Fprintf(f,indent,"istk(ilw+9)=1+%s\n",str1);
-    sprintf(str,"lw%d",farg);
-    Fprintf(f,indent,"lw=sadr(ilw+10)\n");
-    Fprintf(f,indent,"call %s(%s,stk(%s),stk(lw))\n",
-           var->fexternal,str1,str);
-    Fprintf(f,indent,"lw=lw+%s\n",str1);
-    break;
+      strcpy(str1,Forname2Int(variables[var->el[0]-1]->for_name[0]));
+      strcpy(str2,variables[var->el[1]-1]->name);
+      Fprintf(f,indent,"err=sadr(ilw+10)+%s-lstk(bot)\n",str1);
+      Fprintf(f,indent,"if(err .gt. 0) then\n");
+      Fprintf(f,indent,"call error(17)\n");
+      Fprintf(f,indent,"return\n");
+      Fprintf(f,indent,"endif\n");
+      Fprintf(f,indent,"istk(ilw)=1\n");
+      Fprintf(f,indent,"istk(ilw+1)=1\n");
+      Fprintf(f,indent,"istk(ilw+2)=1\n");
+      Fprintf(f,indent,"istk(ilw+3)=0\n");
+      Fprintf(f,indent,"call cvstr(4,'%s    ',istk(ilw+4),0)\n",str2);
+      /* str2 comes from SCILAB input ??? */
+      Fprintf(f,indent,"istk(ilw+8)=1\n");
+      Fprintf(f,indent,"istk(ilw+9)=1+%s\n",str1);
+      sprintf(str,"lw%d",farg);
+      Fprintf(f,indent,"lw=sadr(ilw+10)\n");
+      Fprintf(f,indent,"call %s(%s,stk(%s),stk(lw))\n",
+          var->fexternal,str1,str);
+      Fprintf(f,indent,"lw=lw+%s\n",str1);
+      break;
   case STRING:
-    strcpy(str1,Forname2Int(variables[var->el[0]-1]->for_name[0]));
-    if ( insidelist != 0)
+      strcpy(str1,Forname2Int(variables[var->el[0]-1]->for_name[0]));
+      if ( insidelist != 0)
       {
-       AddDeclare(DEC_LOGICAL,"listcrestring");
-       Fprintf(f,indent,"if(.not.listcrestring(fname,top,%d,lw,%s,ilrs)) return\n",nel,str1,str2);
+          AddDeclare(DEC_LOGICAL,"listcrestring");
+          Fprintf(f,indent,"if(.not.listcrestring(fname,top,%d,lw,%s,ilrs)) return\n",nel,str1,str2);
       }
-    else
+      else
       {
-       AddDeclare(DEC_LOGICAL,"crestring");
-       Fprintf(f,indent,"if(.not.crestring(fname,top,%s,ilrs)) return\n",str1);
+          AddDeclare(DEC_LOGICAL,"crestring");
+          Fprintf(f,indent,"if(.not.crestring(fname,top,%s,ilrs)) return\n",str1);
       }
-    sprintf(str,"lw%d",farg);
-    Fprintf(f,indent,"call %s(%s,stk(%s),istk(ilrs))\n", var->fexternal,str1,str);
-    break;
+      sprintf(str,"lw%d",farg);
+      Fprintf(f,indent,"call %s(%s,stk(%s),istk(ilrs))\n", var->fexternal,str1,str);
+      break;
   case STRINGMAT:
-    strcpy(str1,Forname2Int(variables[var->el[0]-1]->for_name[0]));
-    strcpy(str2,Forname2Int(variables[var->el[1]-1]->for_name[0]));
-    sprintf(str,"lw%d",farg);
-    Fprintf(f,indent,"call %s(stk(%s),istk(ilw),%s,%s,lstk(bot)-sadr(ilw),ierr)\n",
-           var->fexternal,str,str1,str2);
-    Fprintf(f,indent,"if(ierr .gt. 0) then\n");
-    Fprintf(f,indent,"buf='not enough memory'\n");
-    Fprintf(f,indent,"call error(1000)\n");
-    Fprintf(f,indent,"return\n");
-    Fprintf(f,indent,"endif\n");
-    sprintf(str,"istk(ilw+4+%s*%s)-1",str1,str2);
-    Fprintf(f,indent,"lw=sadr(ilw+5+%s*%s+%s)\n",str1,str2,str);
-    break;
-  }
+      strcpy(str1,Forname2Int(variables[var->el[0]-1]->for_name[0]));
+      strcpy(str2,Forname2Int(variables[var->el[1]-1]->for_name[0]));
+      sprintf(str,"lw%d",farg);
+      Fprintf(f,indent,"call %s(stk(%s),istk(ilw),%s,%s,lstk(bot)-sadr(ilw),ierr)\n",
+          var->fexternal,str,str1,str2);
+      Fprintf(f,indent,"if(ierr .gt. 0) then\n");
+      Fprintf(f,indent,"buf='not enough memory'\n");
+      Fprintf(f,indent,"call error(1000)\n");
+      Fprintf(f,indent,"return\n");
+      Fprintf(f,indent,"endif\n");
+      sprintf(str,"istk(ilw+4+%s*%s)-1",str1,str2);
+      Fprintf(f,indent,"lw=sadr(ilw+5+%s*%s+%s)\n",str1,str2,str);
+      break;
+    }
 }
 
 void WriteListAnalysis(f,i)
-     /* is nearly a copy of WriteArgCheck */
-     FILE *f;
-     int i;
+/* is nearly a copy of WriteArgCheck */
+FILE *f;
+int i;
 {
-  int k,i1,iel;
-  char str1[MAXNAM],str[MAXNAM];
-  VARPTR var;
-  i1=i+1;
-  AddDeclare(DEC_LOGICAL,"getilist");
-  Fprintf(f,indent,"if(.not.getilist(fname,topk,top-rhs+%d,n%d,1,il%d)) return\n",i1,i1,i1);
-  for (k = 0; k < nVariable ; k++)
+    int k,i1,iel;
+    char str1[MAXNAM],str[MAXNAM];
+    VARPTR var;
+    i1=i+1;
+    AddDeclare(DEC_LOGICAL,"getilist");
+    Fprintf(f,indent,"if(.not.getilist(fname,topk,top-rhs+%d,n%d,1,il%d)) return\n",i1,i1,i1);
+    for (k = 0; k < nVariable ; k++)
     {
-      var = variables[k];
-      if ((var->list_el != 0) &&
-         (strcmp(var->list_name,variables[i]->name) == 0) &&
-         var->present)
-       {
-         iel=var->list_el;
-         FCprintf(f,"c     \n");
-         FCprintf(f,"c       --   list element number %d %s --\n",iel,var->name);
-         sprintf(str1,"%de%d",i1,iel);
-         AddDeclare(DEC_LOGICAL,"getilist");
-         switch (var->type)
-           {
-           case SPARSE:
-             AddDeclare(DEC_LOGICAL,"getlistsparse");
-             Fprintf(f,indent,"if(.not.getlistsparse(fname,topk,top-rhs+%d,%d,it%s,m%s,n%s,nel%s,mnel%s,icol%s,lr%s,lc%s)) return\n",
-                     i1,iel,str1,str1,str1,str1,str1,str1,str1,str1);
-             if (var->el[0] == var->el[1]) {
-               /* square matrix */
-               AddDeclare(DEC_LOGICAL,"checkval");
-               Fprintf(f,indent,"if(.not.checkval(fname,m%s,n%s)) return\n",str1,str1);
-             }
-             sprintf(str,"m%s",str1);
-             AddForName1(var->el[0],str);
-             sprintf(str,"n%s",str1);
-             AddForName1(var->el[1],str);
-             sprintf(str,"nel%s",str1);
-             AddForName1(var->el[2],str);
-             sprintf(str,"it%s",str1);
-             AddForName1(var->el[3],str);
-             break;
-           case IMATRIX:
-             AddDeclare(DEC_LOGICAL,"getlistmat");
-             Fprintf(f,indent,"if(.not.getlistmat(fname,topk,top-rhs+%d,%d,it%s,m%s,n%s,lr%s,lc%s)) return\n",
-                     i1,iel,str1,str1,str1,str1,str1);
-             if (var->el[0] == var->el[1]) {
-               /* square matrix */
-               AddDeclare(DEC_LOGICAL,"checkval");
-               Fprintf(f,indent,"if(.not.checkval(fname,m%s,n%s)) return\n",str1,str1);
-             }
-             sprintf(str,"m%s",str1);
-             AddForName1(var->el[0],str);
-             sprintf(str,"n%s",str1);
-             AddForName1(var->el[1],str);
-             sprintf(str,"it%s",str1);
-             AddForName1(var->el[2],str);
-             break;
-           case MATRIX:
-             AddDeclare(DEC_LOGICAL,"getlistmat");
-             Fprintf(f,indent,"if(.not.getlistmat(fname,topk,top-rhs+%d,%d,it%s,m%s,n%s,lr%s,lc%s)) return\n",
-                     i1,iel,str1,str1,str1,str1,str1);
-             if (var->el[0] == var->el[1]) {
-               /* square matrix */
-               AddDeclare(DEC_LOGICAL,"checkval");
-               Fprintf(f,indent,"if(.not.checkval(fname,m%s,n%s)) return\n",str1,str1);
-             }
-             sprintf(str,"m%s",str1);
-             AddForName1(var->el[0],str);
-             sprintf(str,"n%s",str1);
-             AddForName1(var->el[1],str);
-             break;
-           case BMATRIX:
-             AddDeclare(DEC_LOGICAL,"getlistbmat");
-             Fprintf(f,indent,"if(.not.getlistbmat(fname,topk,top-rhs+%d,%d,m%s,n%s,lr%s)) return\n",
-                     i1,iel,str1,str1,str1,str1,str1);
-             if (var->el[0] == var->el[1]) {
-               /* square matrix */
-               AddDeclare(DEC_LOGICAL,"checkval");
-               Fprintf(f,indent,"if(.not.checkval(fname,m%s,n%s)) return\n",str1,str1);
-             }
-             sprintf(str,"m%s",str1);
-             AddForName1(var->el[0],str);
-             sprintf(str,"n%s",str1);
-             AddForName1(var->el[1],str);
-             break;
-           case STRINGMAT:
-             AddDeclare(DEC_LOGICAL,"getlistsimat");
-             Fprintf(f,indent,"if(.not.getlistsimat(fname,topk,top-rhs+%d,%d,m%s,n%s,1,1,lr%s,nlr%s)) return\n",
-                     i1,iel,str1,str1,str1,str1);
-             /* square matrix */
-             if (var->el[0] == var->el[1]) {
-               /* square matrix */
-               AddDeclare(DEC_LOGICAL,"checkval");
-               Fprintf(f,indent,"if(.not.checkval(fname,m%s,n%s)) return\n",str1,str1);
-             }
-             sprintf(str,"m%s",str1);
-             AddForName1(var->el[0],str);
-             sprintf(str,"n%s",str1);
-             AddForName1(var->el[1],str);
-             break;
-           case ROW:
-             AddDeclare(DEC_LOGICAL,"getlistvectrow");
-             Fprintf(f,indent,"if(.not.getlistvectrow(fname,topk,top-rhs+%d,%d,it%s,m%s,n%s,lr%s,lc%s)) return\n",
-                     i1,iel,str1,str1,str1,str1,str1);
-             sprintf(str,"n%s",str1);
-             AddForName1(var->el[0],str);
-             break;
-           case COLUMN :
-             AddDeclare(DEC_LOGICAL,"getlistvectcol");
-             Fprintf(f,indent,"if(.not.getlistvectcol(fname,topk,top-rhs+%d,%d,it%s,m%s,n%s,lr%s,lc%s)) return\n",
-                     i1,iel,str1,str1,str1,str1,str1);
-             sprintf(str,"n%s",str1);
-             AddForName1(var->el[0],str);
-             break;
-           case VECTOR:
-             AddDeclare(DEC_LOGICAL,"getlistvect");
-             Fprintf(f,indent,"if(.not.getlistvect(fname,top,top-rhs+%d,%d,it%s,m%s,n%s,lr%s,lc%s)) return\n",
-                     i1,iel,str1,str1,str1,str1,str1);
-             sprintf(str,"n%s*m%s",str1,str1);
-             AddForName1(var->el[0],str);
-             break;
-           case POLYNOM:
-             AddDeclare(DEC_LOGICAL,"getlistpoly");
-             Fprintf(f,indent,"if(.not.getlistpoly(fname,topk,top-rhs+%d,%d,it%s,m%s,n%s,name%s,\n",
-                     i1,iel,str1,str1,str1,str1);
-             Fprintf(f,indent,"$     namel%s,ilp%s,lr%s,lc%s)\n",str1,str1,str1,str1);
-             AddDeclare(DEC_LOGICAL,"checkval");
-             Fprintf(f,indent,"if(.not.checkval(fname,m%s,n%s)) return\n",str1,str1);
-             break;
-           case SCALAR:
-             AddDeclare(DEC_LOGICAL,"getlistscalar");
-             Fprintf(f,indent,"if(.not.getlistscalar(fname,topk,top-rhs+%d,%d,lr%s)) return\n",i1,iel,str1);
-             break;
-           case STRING:
-             AddDeclare(DEC_LOGICAL,"getlistsmat");
-             Fprintf(f,indent,"if(.not.getlistsmat(fname,topk,top-rhs+%d,%d,m%s,n%s,1,1,lr%s,nlr%s)) return\n",
-                     i1,iel,str1,str1,str1,str1);
-             AddDeclare(DEC_LOGICAL,"checkval");
-             Fprintf(f,indent,"if(.not.checkval(fname,m%s*n%s,1)) return\n",str1,str1);
-             sprintf(str,"n%s",str1);
-             strcpy(str1,variables[var->el[0]-1]->name);
-             AddForName1(var->el[0],str);
-             break;
-           case ANY:
-             break;
-           }
-       }
+        var = variables[k];
+        if ((var->list_el != 0) &&
+            (strcmp(var->list_name,variables[i]->name) == 0) &&
+            var->present)
+        {
+            iel=var->list_el;
+            FCprintf(f,"c     \n");
+            FCprintf(f,"c       --   list element number %d %s --\n",iel,var->name);
+            sprintf(str1,"%de%d",i1,iel);
+            AddDeclare(DEC_LOGICAL,"getilist");
+            switch (var->type)
+            {
+            case SPARSE:
+                AddDeclare(DEC_LOGICAL,"getlistsparse");
+                Fprintf(f,indent,"if(.not.getlistsparse(fname,topk,top-rhs+%d,%d,it%s,m%s,n%s,nel%s,mnel%s,icol%s,lr%s,lc%s)) return\n",
+                    i1,iel,str1,str1,str1,str1,str1,str1,str1,str1);
+                if (var->el[0] == var->el[1]) {
+                    /* square matrix */
+                    AddDeclare(DEC_LOGICAL,"checkval");
+                    Fprintf(f,indent,"if(.not.checkval(fname,m%s,n%s)) return\n",str1,str1);
+                }
+                sprintf(str,"m%s",str1);
+                AddForName1(var->el[0],str);
+                sprintf(str,"n%s",str1);
+                AddForName1(var->el[1],str);
+                sprintf(str,"nel%s",str1);
+                AddForName1(var->el[2],str);
+                sprintf(str,"it%s",str1);
+                AddForName1(var->el[3],str);
+                break;
+            case IMATRIX:
+                AddDeclare(DEC_LOGICAL,"getlistmat");
+                Fprintf(f,indent,"if(.not.getlistmat(fname,topk,top-rhs+%d,%d,it%s,m%s,n%s,lr%s,lc%s)) return\n",
+                    i1,iel,str1,str1,str1,str1,str1);
+                if (var->el[0] == var->el[1]) {
+                    /* square matrix */
+                    AddDeclare(DEC_LOGICAL,"checkval");
+                    Fprintf(f,indent,"if(.not.checkval(fname,m%s,n%s)) return\n",str1,str1);
+                }
+                sprintf(str,"m%s",str1);
+                AddForName1(var->el[0],str);
+                sprintf(str,"n%s",str1);
+                AddForName1(var->el[1],str);
+                sprintf(str,"it%s",str1);
+                AddForName1(var->el[2],str);
+                break;
+            case MATRIX:
+                AddDeclare(DEC_LOGICAL,"getlistmat");
+                Fprintf(f,indent,"if(.not.getlistmat(fname,topk,top-rhs+%d,%d,it%s,m%s,n%s,lr%s,lc%s)) return\n",
+                    i1,iel,str1,str1,str1,str1,str1);
+                if (var->el[0] == var->el[1]) {
+                    /* square matrix */
+                    AddDeclare(DEC_LOGICAL,"checkval");
+                    Fprintf(f,indent,"if(.not.checkval(fname,m%s,n%s)) return\n",str1,str1);
+                }
+                sprintf(str,"m%s",str1);
+                AddForName1(var->el[0],str);
+                sprintf(str,"n%s",str1);
+                AddForName1(var->el[1],str);
+                break;
+            case BMATRIX:
+                AddDeclare(DEC_LOGICAL,"getlistbmat");
+                Fprintf(f,indent,"if(.not.getlistbmat(fname,topk,top-rhs+%d,%d,m%s,n%s,lr%s)) return\n",
+                    i1,iel,str1,str1,str1,str1,str1);
+                if (var->el[0] == var->el[1]) {
+                    /* square matrix */
+                    AddDeclare(DEC_LOGICAL,"checkval");
+                    Fprintf(f,indent,"if(.not.checkval(fname,m%s,n%s)) return\n",str1,str1);
+                }
+                sprintf(str,"m%s",str1);
+                AddForName1(var->el[0],str);
+                sprintf(str,"n%s",str1);
+                AddForName1(var->el[1],str);
+                break;
+            case STRINGMAT:
+                AddDeclare(DEC_LOGICAL,"getlistsimat");
+                Fprintf(f,indent,"if(.not.getlistsimat(fname,topk,top-rhs+%d,%d,m%s,n%s,1,1,lr%s,nlr%s)) return\n",
+                    i1,iel,str1,str1,str1,str1);
+                /* square matrix */
+                if (var->el[0] == var->el[1]) {
+                    /* square matrix */
+                    AddDeclare(DEC_LOGICAL,"checkval");
+                    Fprintf(f,indent,"if(.not.checkval(fname,m%s,n%s)) return\n",str1,str1);
+                }
+                sprintf(str,"m%s",str1);
+                AddForName1(var->el[0],str);
+                sprintf(str,"n%s",str1);
+                AddForName1(var->el[1],str);
+                break;
+            case ROW:
+                AddDeclare(DEC_LOGICAL,"getlistvectrow");
+                Fprintf(f,indent,"if(.not.getlistvectrow(fname,topk,top-rhs+%d,%d,it%s,m%s,n%s,lr%s,lc%s)) return\n",
+                    i1,iel,str1,str1,str1,str1,str1);
+                sprintf(str,"n%s",str1);
+                AddForName1(var->el[0],str);
+                break;
+            case COLUMN :
+                AddDeclare(DEC_LOGICAL,"getlistvectcol");
+                Fprintf(f,indent,"if(.not.getlistvectcol(fname,topk,top-rhs+%d,%d,it%s,m%s,n%s,lr%s,lc%s)) return\n",
+                    i1,iel,str1,str1,str1,str1,str1);
+                sprintf(str,"n%s",str1);
+                AddForName1(var->el[0],str);
+                break;
+            case VECTOR:
+                AddDeclare(DEC_LOGICAL,"getlistvect");
+                Fprintf(f,indent,"if(.not.getlistvect(fname,top,top-rhs+%d,%d,it%s,m%s,n%s,lr%s,lc%s)) return\n",
+                    i1,iel,str1,str1,str1,str1,str1);
+                sprintf(str,"n%s*m%s",str1,str1);
+                AddForName1(var->el[0],str);
+                break;
+            case POLYNOM:
+                AddDeclare(DEC_LOGICAL,"getlistpoly");
+                Fprintf(f,indent,"if(.not.getlistpoly(fname,topk,top-rhs+%d,%d,it%s,m%s,n%s,name%s,\n",
+                    i1,iel,str1,str1,str1,str1);
+                Fprintf(f,indent,"$     namel%s,ilp%s,lr%s,lc%s)\n",str1,str1,str1,str1);
+                AddDeclare(DEC_LOGICAL,"checkval");
+                Fprintf(f,indent,"if(.not.checkval(fname,m%s,n%s)) return\n",str1,str1);
+                break;
+            case SCALAR:
+                AddDeclare(DEC_LOGICAL,"getlistscalar");
+                Fprintf(f,indent,"if(.not.getlistscalar(fname,topk,top-rhs+%d,%d,lr%s)) return\n",i1,iel,str1);
+                break;
+            case STRING:
+                AddDeclare(DEC_LOGICAL,"getlistsmat");
+                Fprintf(f,indent,"if(.not.getlistsmat(fname,topk,top-rhs+%d,%d,m%s,n%s,1,1,lr%s,nlr%s)) return\n",
+                    i1,iel,str1,str1,str1,str1);
+                AddDeclare(DEC_LOGICAL,"checkval");
+                Fprintf(f,indent,"if(.not.checkval(fname,m%s*n%s,1)) return\n",str1,str1);
+                sprintf(str,"n%s",str1);
+                strcpy(str1,variables[var->el[0]-1]->name);
+                AddForName1(var->el[0],str);
+                break;
+            case ANY:
+                break;
+            }
+        }
     }
 }
 
 /***********************************************
- * Output of variable var
- *   if variable is outputed inside a list
- *   insidelist is set to true and nel is the number
- *   of the variable in the list
- ***********************************************/
+* Output of variable var
+*   if variable is outputed inside a list
+*   insidelist is set to true and nel is the number
+*   of the variable in the list
+***********************************************/
 
 void WriteVariable(f,var,ivar,insidelist,nel)
-     FILE *f;
-     VARPTR var;
-     IVAR ivar;
-     int insidelist;
+FILE *f;
+VARPTR var;
+IVAR ivar;
+int insidelist;
 {
-  IVAR ivar2, barg, farg;
-  VARPTR var2;
-  int j;
+    IVAR ivar2, barg, farg;
+    VARPTR var2;
+    int j;
 
-  /* get number of variable in SCILAB calling list */
+    /* get number of variable in SCILAB calling list */
 
-  barg = GetNumberInScilabCall(ivar);
+    barg = GetNumberInScilabCall(ivar);
 
-  /* get number of variable in FORTRAN calling list */
+    /* get number of variable in FORTRAN calling list */
 
-  farg = GetNumberInFortranCall(ivar);
+    farg = GetNumberInFortranCall(ivar);
 
-  if (var->for_type == EXTERNAL)
+    if (var->for_type == EXTERNAL)
     {
-      /* external type */
-      if (barg != 0)
-       {
-         printf("output variable with external type \"%s\"\n",var->name);
-         printf("  cannot be an input argument of SCILAB function\n");
-         exit(1);
-       }
-      if (var->equal != 0)
-       {
-         printf("output variable with external type \"%s\"\n", var->name);
-         printf("  cannot have a convertion\n");
-         exit(1);
-       }
-    if (farg == 0)
-      {
-       printf("output variable with external type \"%s\" must be\n", var->name);
-       printf("  an argument of FORTRAN subroutine");
-       exit(1);
-      }
-      WriteExternalVariableOutput(f,var,farg,insidelist,nel);
+        /* external type */
+        if (barg != 0)
+        {
+            printf("output variable with external type \"%s\"\n",var->name);
+            printf("  cannot be an input argument of SCILAB function\n");
+            exit(1);
+        }
+        if (var->equal != 0)
+        {
+            printf("output variable with external type \"%s\"\n", var->name);
+            printf("  cannot have a convertion\n");
+            exit(1);
+        }
+        if (farg == 0)
+        {
+            printf("output variable with external type \"%s\" must be\n", var->name);
+            printf("  an argument of FORTRAN subroutine");
+            exit(1);
+        }
+        WriteExternalVariableOutput(f,var,farg,insidelist,nel);
     }
-  else
+    else
     {
-      if (var->equal != 0)
-       {
-         /* SCILAB type convertion */
-         if (barg !=0 || farg!= 0)
-           {
-             printf("output variable with convertion \"%s\" must not be\n",var->name);
-             printf("  an input variable of SCILAB function or an argument\n");
-             printf("  of FORTRAN subroutine\n");
-             exit(1);
-           }
-         ivar2 = var->equal;
-         var2 = variables[ivar2-1];
-         /* get number of equal variable in SCILAB calling list */
-         barg = 0;
-         for (j = 0; j < basfun->nin; j++)
-           {
-             if (ivar2 == basfun->in[j])
-               {
-                 barg = j + 1;
-                 break;
-               }
-           }
-         if (barg == 0)
-           {
-             printf("output variable with convertion \"%s\" must be\n",
-                    var->name);
-             printf("  an input variable of SCILAB function\n");
-             exit(1);
-           }
-         /* get number of equal variable in FORTRAN calling list */
-         farg = 0;
-         for (j = 0; j < forsub->narg; j++) {
-           if (ivar2 == forsub->arg[j]) {
-             farg = j + 1;
-             break;
-           }
-         }
-         if (farg == 0)
-           {
-             printf("output variable with convertion \"%s\" must be\n",
-                    var->name);
-             printf("  an argument FORTRAN subroutine");
-             exit(1);
-           }
-         var->for_type = var2->for_type;
-         WriteVariableOutput(f,var,barg,farg,1,insidelist,nel);
-       }
-      else
-       {
-         /* no SCILAB type convertion */
-         if (farg == 0) {
-           printf("variable without convertion \"%s\" must be an argument\n",
-                  var->name);
-           printf("  of FORTRAN subroutine\n");
-           exit(1);
-         }
-         WriteVariableOutput(f,var,barg,farg,0,insidelist,nel);
-       }
+        if (var->equal != 0)
+        {
+            /* SCILAB type convertion */
+            if (barg !=0 || farg!= 0)
+            {
+                printf("output variable with convertion \"%s\" must not be\n",var->name);
+                printf("  an input variable of SCILAB function or an argument\n");
+                printf("  of FORTRAN subroutine\n");
+                exit(1);
+            }
+            ivar2 = var->equal;
+            var2 = variables[ivar2-1];
+            /* get number of equal variable in SCILAB calling list */
+            barg = 0;
+            for (j = 0; j < basfun->nin; j++)
+            {
+                if (ivar2 == basfun->in[j])
+                {
+                    barg = j + 1;
+                    break;
+                }
+            }
+            if (barg == 0)
+            {
+                printf("output variable with convertion \"%s\" must be\n",
+                    var->name);
+                printf("  an input variable of SCILAB function\n");
+                exit(1);
+            }
+            /* get number of equal variable in FORTRAN calling list */
+            farg = 0;
+            for (j = 0; j < forsub->narg; j++) {
+                if (ivar2 == forsub->arg[j]) {
+                    farg = j + 1;
+                    break;
+                }
+            }
+            if (farg == 0)
+            {
+                printf("output variable with convertion \"%s\" must be\n",
+                    var->name);
+                printf("  an argument FORTRAN subroutine");
+                exit(1);
+            }
+            var->for_type = var2->for_type;
+            WriteVariableOutput(f,var,barg,farg,1,insidelist,nel);
+        }
+        else
+        {
+            /* no SCILAB type convertion */
+            if (farg == 0) {
+                printf("variable without convertion \"%s\" must be an argument\n",
+                    var->name);
+                printf("  of FORTRAN subroutine\n");
+                exit(1);
+            }
+            WriteVariableOutput(f,var,barg,farg,0,insidelist,nel);
+        }
     }
 }
 
 
 int GetNumberInScilabCall(ivar)
-     int ivar;
+int ivar;
 {
-  int j;
-  for (j = 0; j < basfun->nin; j++)
+    int j;
+    for (j = 0; j < basfun->nin; j++)
     {
-      if (ivar == basfun->in[j]) {
-       return(j+1);
-       break;
-      }
+        if (ivar == basfun->in[j]) {
+            return(j+1);
+            break;
+        }
     }
-  return(0);
+    return(0);
 }
 
 int GetNumberInFortranCall(ivar)
-          int ivar;
+int ivar;
 {
-  int j;
-  for (j = 0; j < forsub->narg; j++)
+    int j;
+    for (j = 0; j < forsub->narg; j++)
     {
-      if (ivar == forsub->arg[j])
-       {
-         return( j + 1);
-         break;
-       }
+        if (ivar == forsub->arg[j])
+        {
+            return( j + 1);
+            break;
+        }
     }
-  return(0);
+    return(0);
 }
 
 char unknown[]="ukn";
 
 char *Forname2Int(str)
-     char *str;
+char *str;
 {
-  int l;
-  char *p;
-  if (str == (char *) 0)
+    int l;
+    char *p;
+    if (str == (char *) 0)
     {
-      printf("Error in Forname2Int \n");
-      printf("Maybe an internal variable has a dimension\n");
-      printf("which can't be evaluated\n");
-      abort();
-      return(unknown);
-    }
-  if (strncmp(str,"stk",3) == 0) {
-    l = (int)strlen(str);
-    p = (char *)malloc((unsigned)(l + 6));
-    sprintf(p,"int(%s)",str);
-    return p;
-  }
-  else return str;
+        printf("Error in Forname2Int \n");
+        printf("Maybe an internal variable has a dimension\n");
+        printf("which can't be evaluated\n");
+        abort();
+        return(unknown);
+    }
+    if (strncmp(str,"stk",3) == 0) {
+        l = (int)strlen(str);
+        p = (char *)malloc((unsigned)(l + 6));
+        sprintf(p,"int(%s)",str);
+        return p;
+    }
+    else return str;
 }
 
 
 
 void GenFundef(file,interf)
-     char *file;
-     int interf;
+char *file;
+int interf;
 {
-  FILE *fout;
-  char filout[MAXNAM];
-  int i,j;
-  if (interf != 0 )
+    FILE *fout;
+    char filout[MAXNAM];
+    int i,j;
+    if (interf != 0 )
     {
-      strcpy(filout,file);
-      strcat(filout,".fundef");
-      fout = fopen(filout,"w");
-      fprintf(fout,"#define IN_%s %.2d\n",file,interf);
-      for (i = 0; i < nFun; i++) {
-       fprintf(fout,"{\"%s\",",funNames[i]);
-       for (j = 0; j < 25 - (int)strlen(funNames[i]); j++) fprintf(fout," ");
-       fprintf(fout,"\t\tIN_%s,\t%d,\t3},\n",file,i+1);
-      }
-      printf("\nfile \"%s\" has been created\n",filout);
-      fclose(fout);
+        strcpy(filout,file);
+        strcat(filout,".fundef");
+        fout = fopen(filout,"w");
+        fprintf(fout,"#define IN_%s %.2d\n",file,interf);
+        for (i = 0; i < nFun; i++) {
+            fprintf(fout,"{\"%s\",",funNames[i]);
+            for (j = 0; j < 25 - (int)strlen(funNames[i]); j++) fprintf(fout," ");
+            fprintf(fout,"\t\tIN_%s,\t%d,\t3},\n",file,i+1);
+        }
+        printf("\nfile \"%s\" has been created\n",filout);
+        fclose(fout);
     }
 }
 
 /**********************************************************
-  Function to add decaration during the first pass
-  and to print them during code generation pass 2
+Function to add decaration during the first pass
+and to print them during code generation pass 2
 **********************************************************/
 
 
 static struct Declare {
-  int type;
-  char *name;
-  char **decls ; /* declaration de logical */
-  int  ndecls;
+    int type;
+    char *name;
+    char **decls ; /* declaration de logical */
+    int  ndecls;
 } Init[] = {
-  { DEC_CHAR,"char",(char **) 0,0},
-  { DEC_INT ,"integer",(char **) 0,0},
-  { DEC_DOUBLE,"double precision",(char **) 0,0},
-  { DEC_REAL,"real",(char **) 0,0},
-  { DEC_LOGICAL,"logical",(char **) 0,0},
-  { DEC_DATA,"data",(char **) 0,0},
-  { -1 ,"void",(char **) 0,0}
-  };
+    { DEC_CHAR,"char",(char **) 0,0},
+    { DEC_INT ,"integer",(char **) 0,0},
+    { DEC_DOUBLE,"double precision",(char **) 0,0},
+    { DEC_REAL,"real",(char **) 0,0},
+    { DEC_LOGICAL,"logical",(char **) 0,0},
+    { DEC_DATA,"data",(char **) 0,0},
+    { -1 ,"void",(char **) 0,0}
+};
 
 void InitDeclare()
 {
-  int i = 0;
-  while ( Init[i].type != -1)
+    int i = 0;
+    while ( Init[i].type != -1)
     {
-      Init[i].decls = (char **) 0;
-      Init[i].ndecls =0 ;
-      i++;
+        Init[i].decls = (char **) 0;
+        Init[i].ndecls =0 ;
+        i++;
     }
 }
 
 void ResetDeclare()
 {
-  int j = 0;
-  while ( Init[j].type != -1)
+    int j = 0;
+    while ( Init[j].type != -1)
     {
-      if ( Init[j].decls != (char **) 0)
-       {
-         int i;
-         for ( i = 0 ; i < Init[j].ndecls ; i++ )
-           free((char *) Init[j].decls[i]);
-         free (( char *) Init[j].decls );
-       }
-      Init[j].decls=(char **) 0;
-      Init[j].ndecls=0;
-      j++;
+        if ( Init[j].decls != (char **) 0)
+        {
+            int i;
+            for ( i = 0 ; i < Init[j].ndecls ; i++ )
+                free((char *) Init[j].decls[i]);
+            free (( char *) Init[j].decls );
+        }
+        Init[j].decls=(char **) 0;
+        Init[j].ndecls=0;
+        j++;
     }
 }
 
 int  CheckDeclare(type,declaration)
-     int type;
-     char *declaration;
+int type;
+char *declaration;
 {
-  int j = 0;
-  while ( Init[j].type != -1)
+    int j = 0;
+    while ( Init[j].type != -1)
     {
-      if ( Init[j].type == type )
-       {
-         int i;
-         for ( i = 0 ; i < Init[j].ndecls ; i++ )
-           {
-             if ( strcmp(declaration,Init[j].decls[i])==0)
-               return(1);
-           }
-         return(0);
-       }
-      j++;
-    }
-  return(0);
+        if ( Init[j].type == type )
+        {
+            int i;
+            for ( i = 0 ; i < Init[j].ndecls ; i++ )
+            {
+                if ( strcmp(declaration,Init[j].decls[i])==0)
+                    return(1);
+            }
+            return(0);
+        }
+        j++;
+    }
+    return(0);
 }
 
 void AddDeclare(type,declaration)
-     int type;
-     char *declaration;
+int type;
+char *declaration;
 {
-  int j = 0;
-  if ( CheckDeclare(type,declaration)== 1) return ;
-  while ( Init[j].type != -1)
+    int j = 0;
+    if ( CheckDeclare(type,declaration)== 1) return ;
+    while ( Init[j].type != -1)
     {
-      if ( Init[j].type == type )
-       {
-         if ( Init[j].decls != (char **) 0)
-           {
-             (Init[j].ndecls)++;
-             Init[j].decls =  (char **) realloc((char *) Init[j].decls, (unsigned) (Init[j].ndecls ) *sizeof(char *));
-           }
-         else
-           {
-             (Init[j].ndecls)++;
-             Init[j].decls = (char **) malloc ( (unsigned) (Init[j].ndecls ) *sizeof(char *));
-           }
-         if ( Init[j].decls == ( char **) 0)
-           {
-             fprintf(stderr,"No more space\n");
-             exit(1);
-           }
-         Init[j].decls[Init[j].ndecls-1]=(char*) malloc((unsigned) (strlen(declaration)+1)*sizeof(char));
-         if (    Init[j].decls[Init[j].ndecls-1] == ( char *) 0)
-           {
-             fprintf(stderr,"No more space\n");
-             exit(1);
-           }
-         strcpy(   Init[j].decls[Init[j].ndecls-1], declaration );
-       }
-      j++;
+        if ( Init[j].type == type )
+        {
+            if ( Init[j].decls != (char **) 0)
+            {
+                (Init[j].ndecls)++;
+                Init[j].decls =  (char **) realloc((char *) Init[j].decls, (unsigned) (Init[j].ndecls ) *sizeof(char *));
+            }
+            else
+            {
+                (Init[j].ndecls)++;
+                Init[j].decls = (char **) malloc ( (unsigned) (Init[j].ndecls ) *sizeof(char *));
+            }
+            if ( Init[j].decls == ( char **) 0)
+            {
+                fprintf(stderr,"No more space\n");
+                exit(1);
+            }
+            Init[j].decls[Init[j].ndecls-1]=(char*) malloc((unsigned) (strlen(declaration)+1)*sizeof(char));
+            if (         Init[j].decls[Init[j].ndecls-1] == ( char *) 0)
+            {
+                fprintf(stderr,"No more space\n");
+                exit(1);
+            }
+            strcpy(   Init[j].decls[Init[j].ndecls-1], declaration );
+        }
+        j++;
     }
 }
 
 void WriteDeclaration(f)
-     FILE *f;
+FILE *f;
 {
-  int j = 0;
-  int i;
-  while ( Init[j].type != -1)
+    int j = 0;
+    int i;
+    while ( Init[j].type != -1)
     {
-      if ( Init[j].ndecls != 0)
-       Fprintf(f,indent,"%s ",Init[j].name);
-      for (i= 0 ; i < Init[j].ndecls ; i++)
-       {
-         Fprintf(f,indent,"%s",Init[j].decls[i]);
-         if ( i != Init[j].ndecls -1 ) Fprintf(f,indent,",");
-         else Fprintf(f,indent,"\n");
-       }
-      j++;
+        if ( Init[j].ndecls != 0)
+            Fprintf(f,indent,"%s ",Init[j].name);
+        for (i= 0 ; i < Init[j].ndecls ; i++)
+        {
+            Fprintf(f,indent,"%s",Init[j].decls[i]);
+            if ( i != Init[j].ndecls -1 ) Fprintf(f,indent,",");
+            else Fprintf(f,indent,"\n");
+        }
+        j++;
     }
 }
 
 /**********************************************************
-  Dealing With Fortran OutPut
-  taking into account indentation and line breaks after column 72
+Dealing With Fortran OutPut
+taking into account indentation and line breaks after column 72
 ***********************************************************/
 #include <stdarg.h>
 
@@ -3295,80 +3310,80 @@ char sbuf[MAXBUF];
 
 void Fprintf(FILE *f,int indent,char *format,...)
 {
-  int i;
-  static int count=0;
-  va_list ap;
-  va_start(ap,format);
+    int i;
+    static int count=0;
+    va_list ap;
+    va_start(ap,format);
 
-  vsprintf(sbuf,format,ap);
-  for ( i = 0 ; i < (int) strlen(sbuf); i++)
+    vsprintf(sbuf,format,ap);
+    for ( i = 0 ; i < (int) strlen(sbuf); i++)
     {
-      if ( count == 0)
-       {
-         white(f,7+indent);
-         count = 7+indent;
-       }
-      if ( count == 72 && sbuf[i] != '\n' ) { fprintf(f,"\n     $ ");count=7;}
-      if ( sbuf[i] == '\n') count = -1 ;
-      fprintf(f,"%c",sbuf[i]);
-      count++;
-    }
-  va_end(ap);
+        if ( count == 0)
+        {
+            white(f,7+indent);
+            count = 7+indent;
+        }
+        if ( count == 72 && sbuf[i] != '\n' ) { fprintf(f,"\n     $ ");count=7;}
+        if ( sbuf[i] == '\n') count = -1 ;
+        fprintf(f,"%c",sbuf[i]);
+        count++;
+    }
+    va_end(ap);
 }
 
 void white(f,ind)
-     FILE *f;
-     int ind;
+FILE *f;
+int ind;
 {
-  int i ;
-  for (i =0 ; i < ind ; i++) fprintf(f," ");
+    int i ;
+    for (i =0 ; i < ind ; i++) fprintf(f," ");
 }
 
 
 
 void  FCprintf(FILE *f,char *format,...)
 {
-  va_list ap;
-  va_start(ap,format);
+    va_list ap;
+    va_start(ap,format);
 
-  vfprintf(f,format,ap);
-  va_end(ap);
+    vfprintf(f,format,ap);
+    va_end(ap);
 }
 
 
 
 /********************************
- * Set up environment variables if
- * necessary for SCIDIR
- ********************************/
+* Set up environment variables if
+* necessary for SCIDIR
+********************************/
 
 #ifdef _MSC_VER
 static void SciEnv ()
 {
-  char *p,*p1;
-  char modname[PATH_MAX+1];
-  char env[PATH_MAX+1+10];
-  if (!GetModuleFileName (NULL, modname+1, PATH_MAX))
-    return;
-  if ((p = strrchr (modname+1, '\\')) == NULL)
-    return;
-  *p = 0;
-
-  /* Set SCI variable */
-  if ((p = strrchr (modname+1, '\\')))
+    char *p,*p1;
+    char modname[PATH_MAX+1];
+    char env[PATH_MAX+1+10];
+    if (!GetModuleFileName (NULL, modname+1, PATH_MAX))
+        return;
+    if ((p = strrchr (modname+1, '\\')) == NULL)
+        return;
+    *p = 0;
+
+    /* Set SCI variable */
+    if ((p = strrchr (modname+1, '\\')))
     {
-      *p = 0;
-      for (p = modname+1; *p; p++)
-       {
-         if (*p == '\\') *p = '/';
-       }
-    p = modname + 1;
-
-      if ( ( p1 = getenv("SCI"))  == (char *) 0 )
-       {
-         sprintf(env,"SCI=%s",p);
-         putenv(env);
-       }
+        *p = 0;
+        for (p = modname+1; *p; p++)
+        {
+            if (*p == '\\') *p = '/';
+        }
+        p = modname + 1;
+
+        if ( ( p1 = getenv("SCI"))  == (char *) 0 )
+        {
+            sprintf(env,"SCI=%s",p);
+            putenv(env);
+        }
     }
 }
 #endif /** _MSC_VER **/
index 4ca0079..c63f278 100644 (file)
@@ -470,10 +470,13 @@ int ParseLine(char *s,char *words[])
     int inword = 1;
     int i = 0;
     if(*s == ' ' || *s == '\t') inword = 0;
-    while (*s) {
-        if (inword) {
+    while (*s) 
+    {
+        if (inword) 
+        {
             w[i++] = *s++;
-            if (*s == ' ' || *s == '\t' || *s == '\n') {
+            if (*s == ' ' || *s == '\t' || *s == '\n') 
+            {
                 w[i] = '\0';
                 words[nwords] = (char *)malloc((unsigned)(i+1));
                 strcpy(words[nwords],w);
@@ -481,14 +484,26 @@ int ParseLine(char *s,char *words[])
                 inword = 0;
             }
         }
-        else {
+        else 
+        {
             s++; /* *s++; */
-            if (*s != ' ' && *s != '\t') {
+            if (*s != ' ' && *s != '\t') 
+            {
                 i = 0;
                 inword = 1;
             }
         }
     }
+
+    /* bug 7599 fixed: if the last line end with eof, not eol then one word missed */
+    if (i > 1) 
+    {
+        w[i] = '\0';
+        words[nwords] = (char *)malloc((unsigned)(i+1));
+        strcpy(words[nwords], w);
+        nwords++;
+    }
+
     return(nwords);
 }
 
diff --git a/scilab/modules/intersci/tests/nonreg_tests/bug_7599.c b/scilab/modules/intersci/tests/nonreg_tests/bug_7599.c
new file mode 100644 (file)
index 0000000..d598761
--- /dev/null
@@ -0,0 +1,25 @@
+#include "stack-c.h"
+/******************************************
+ * SCILAB function : ext1c, fin = 1
+ ******************************************/
+
+int intsext1c(char *fname)
+{
+ int m1,n1,l1,mn1,m2,n2,l2,mn2,un=1,mn3,l3;
+ CheckRhs(2,2);
+ CheckLhs(1,1);
+ /*  checking variable a */
+ GetRhsVar(1,"d",&m1,&n1,&l1);
+ CheckVector(1,m1,n1);
+ mn1=m1*n1;
+ /*  checking variable b */
+ GetRhsVar(2,"d",&m2,&n2,&l2);
+ CheckVector(2,m2,n2);
+ mn2=m2*n2;
+ /* cross variable size checking */
+ CheckDimProp(1,2,m1*n1 != m2*n2);
+ CreateVar(3,"d",(un=1,&un),(mn3=mn1,&mn3),&l3);/* named: c */
+ C2F(ext1c)(&mn1,stk(l1),stk(l2),stk(l3));
+ LhsVar(1)= 3;
+ return 0;
+}
diff --git a/scilab/modules/intersci/tests/nonreg_tests/bug_7599.desc b/scilab/modules/intersci/tests/nonreg_tests/bug_7599.desc
new file mode 100644 (file)
index 0000000..9cf0ccf
--- /dev/null
@@ -0,0 +1,13 @@
+ext1c  a b 
+a      vector  m
+b      vector  m
+c      vector  m 
+
+ext1c   m a b c 
+m      integer 
+a      double 
+b      double 
+c      double 
+
+out    sequence        c
+***********************
\ No newline at end of file
diff --git a/scilab/modules/intersci/tests/nonreg_tests/bug_7599.dia.ref b/scilab/modules/intersci/tests/nonreg_tests/bug_7599.dia.ref
new file mode 100644 (file)
index 0000000..c020f00
--- /dev/null
@@ -0,0 +1,26 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2010 - DIGITEO - Allan CORNET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- JVM NOT MANDATORY -->
+//
+// <-- Non-regression test for bug 7599 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=7599
+//
+// <-- Short Description -->
+// Intersci-n and intersci did not create code from a .desc file if it was not ended by a empty line.
+//
+if getos() == 'Windows' then
+  copyfile(SCI+"/modules/intersci/tests/nonreg_tests/bug_7599.desc", TMPDIR+"/bug_7599.desc");
+  cd(TMPDIR);
+  s = dos(SCI+'/modules/intersci/bin/intersci-n.exe bug_7599');
+  if s <> %t then bugmes();quit;end
+  r = mgetl(TMPDIR + '/bug_7599.c');
+  ref = mgetl(SCI+"/modules/intersci/tests/nonreg_tests/bug_7599.c");
+  if ~and(r == ref) then bugmes();quit;end
+end
diff --git a/scilab/modules/intersci/tests/nonreg_tests/bug_7599.tst b/scilab/modules/intersci/tests/nonreg_tests/bug_7599.tst
new file mode 100644 (file)
index 0000000..4c105e1
--- /dev/null
@@ -0,0 +1,27 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2010 - DIGITEO - Allan CORNET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- JVM NOT MANDATORY -->
+//
+// <-- Non-regression test for bug 7599 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=7599
+//
+// <-- Short Description -->
+// Intersci-n and intersci did not create code from a .desc file if it was not ended by a empty line.
+//
+
+if getos() == 'Windows' then
+  copyfile(SCI+"/modules/intersci/tests/nonreg_tests/bug_7599.desc", TMPDIR+"/bug_7599.desc");
+  cd(TMPDIR);
+  s = dos(SCI+'/modules/intersci/bin/intersci-n.exe bug_7599');
+  if s <> %t then pause, end
+  r = mgetl(TMPDIR + '/bug_7599.c');
+  ref = mgetl(SCI+"/modules/intersci/tests/nonreg_tests/bug_7599.c");
+  if ~and(r == ref) then pause, end
+end