Example #1
0
void GetPOLYNOM(FILE *f, VARPTR var, int flag)
{
    int i1 = var->stack_position;
    if (var->list_el == 0 )
    {
        sprintf(str1, "%d", i1);
        AddDeclare(DEC_LOGICAL, "getonepoly");
        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);
    }
    else
    {
        sprintf(str1, "%de%d", i1, var->list_el);
        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, var->list_el, str1, str1, str1, str1);
        Fprintf(f, indent, "$     namel%s,ilp%s,lr%s,lc%s)\n", str1, str1, str1, str1);
    }
    Check(f, var, 0);
    /* Convertion */
    switch (var->for_type)
    {
        case INT:
            Fprintf(f, indent, "call entier(n%s,stk(lr%s),istk(iadr(lr%s)))\n",
                    str1, str1, str1);
            sprintf(str, "istk(iadr(lr%s))", str1);
            ChangeForName1(var, str);
            break;
        case REAL:
            Fprintf(f, indent, "call simple(n%s,stk(lr%s),stk(lr%s))\n",
                    str1, str1, str1);
            sprintf(str, "stk(lr%s)", str1);
            ChangeForName1(var, str);
            break;
        case DOUBLE:
            sprintf(str, "stk(lr%s)", str1);
            ChangeForName1(var, str);
            break;
        default:
            printf("incompatibility between Scilab and Fortran type for variable \"%s\"\n",
                   var->name);
            exit(1);
    }
}
Example #2
0
void WriteFortranCall(FILE * f)
{
    int i;
    IVAR ivar, iivar;
    char call[MAXCALL];

    sprintf(call, "C2F(%s)(", forsub->name);

    CheckCreateOrder();

    /* loop on FORTRAN arguments */

    for (i = 0; i < forsub->narg; i++)
    {
        ivar = forsub->arg[i];
        if (variables[ivar - 1]->list_el != 0)
        {
            /* FORTRAN argument is a list element */
            iivar = GetExistVar(variables[ivar - 1]->list_name);
            if (variables[iivar - 1]->is_sciarg == 0)
            {
                printf("list or tlist \"%s\" must be an argument of SCILAB function\n", variables[ivar - 1]->list_name);
                exit(1);
            }
            strcat(call, variables[ivar - 1]->for_name[0]);
            strcat(call, ",");
        }
        else
        {
            int bCheck = 0;

            if (variables[ivar - 1]->is_sciarg != 1)
            {
                /* FORTRAN argument is not a SCILAB argument */
                /* a new variable is created on the stack for each
                 * Fortran argument */
                (*(CRERHSTAB[variables[ivar - 1]->type].fonc)) (f, variables[ivar - 1]);
            }
#ifdef _MSC_VER
            _try
            {
                bCheck = (variables[ivar - 1]->C_name[0] != NULL);
                if (bCheck)
                {
                    char *buffertmp = _strdup(variables[ivar - 1]->C_name[0]);

                    if (buffertmp)
                    {
                        free(buffertmp);
                        buffertmp = NULL;
                    }
                }
            }
            _except(EXCEPTION_EXECUTE_HANDLER)
            {
                bCheck = 0;
            }
#else
            bCheck = (variables[ivar - 1]->C_name[0] != NULL);
#endif
            if (target == 'C' && bCheck)
            {
                strcat(call, "&");
                strcat(call, variables[ivar - 1]->C_name[0]);
            }
            else
                strcat(call, variables[ivar - 1]->for_name[0]);
            strcat(call, ",");
        }
    }
    if (forsub->narg == 0)
        strcat(call, ")");
    else
        call[strlen(call) - 1] = ')';

    if (target == 'C')
        strcat(call, ";\n");
    Fprintf(f, indent, call);

    for (i = 0; i < nVariable; i++)
    {
        if (strcmp(variables[i]->name, "err") == 0)
        {
            AddDeclare(DEC_INT, "err=0");
            Fprintf(f, indent++, "if (err >  0) {\n");
            Fprintf(f, indent, "Scierror(999,\"%%s: Internal Error \\n\",fname);\n");
            Fprintf(f, indent, "return 0;\n");
            Fprintf(f, --indent, "};\n");
            break;
        }
    }
}
Example #3
0
void WriteFunctionCode(FILE * f)
{
    int i;
    IVAR ivar;

    if (pass == 1)
    {
        printf("  generating C interface for function (%s) Scilab function\"%s\"\n", forsub->name, basfun->name);
    }
    FCprintf(f, "/******************************************\n");
    FCprintf(f, " * SCILAB function : %s, fin = %d\n", basfun->name, nFun);
    FCprintf(f, " ******************************************/\n");

    WriteHeader(f, "ints", basfun->name);

    /* optional arguments : new style */
    /** XXXXXX basfun->NewMaxOpt= basfun->maxOpt; */
    basfun->NewMaxOpt = basfun->maxOpt;
    if (basfun->NewMaxOpt > 0)
    {
        /** optional arguments **/
        AddDeclare(DEC_INT, "nopt");
        AddDeclare(DEC_INT, "iopos");
        Fprintf(f, indent, "nopt=NumOpt();\n");
    }

    /* rhs argument number checking */

    if (basfun->NewMaxOpt > 0)
        Fprintf(f, indent, "CheckRhs(%d,%d+nopt);\n", basfun->nin - basfun->maxOpt, basfun->nin - basfun->maxOpt);
    else
        Fprintf(f, indent, "CheckRhs(%d,%d);\n", basfun->nin - basfun->maxOpt, basfun->nin);

    /* lhs argument number checking */
    ivar = basfun->out;
    if (ivar == 0)
    {
        Fprintf(f, indent, "CheckLhs(0,1);\n");
    }
    else
    {
        if ((variables[ivar - 1]->length == 0) || (variables[ivar - 1]->type == LIST) || (variables[ivar - 1]->type == TLIST))
        {
            Fprintf(f, indent, "CheckLhs(1,1);\n");
        }
        else
        {
            Fprintf(f, indent, "CheckLhs(1,%d);\n", variables[ivar - 1]->length);
        }
    }
    /* SCILAB argument checking */
    for (i = 0; i < basfun->nin - basfun->NewMaxOpt; i++)
    {
        switch (variables[i]->type)
        {
        case LIST:
            WriteListAnalysis(f, i, "l");
            break;
        case TLIST:
            WriteListAnalysis(f, i, "t");
            break;
        case MLIST:
            WriteListAnalysis(f, i, "m");
            break;
        default:
            WriteArgCheck(f, i);
            break;
        }
    }

    if (basfun->NewMaxOpt != 0)
    {
        sprintf(str1, "rhs_opts opts[]={\n");
        for (i = basfun->nin - basfun->NewMaxOpt; i < basfun->nin; i++)
        {
            sprintf(str2, "\t{-1,\"%s\",\"%s\",0,0,0},\n", variables[i]->name, SGetForTypeAbrev(variables[i]));
            strcat(str1, str2);
        }
        strcat(str1, "\t{-1,NULL,NULL,NULL,0,0}}");
        AddDeclare(DEC_DATA, str1);
        Fprintf(f, indent, "iopos=Rhs;\n");
        Fprintf(f, indent, "if ( get_optionals(fname,opts) == 0) return 0;\n");
        for (i = basfun->nin - basfun->NewMaxOpt; i < basfun->nin; i++)
        {
            WriteOptArgPhase2(f, i);
        }
    }

    /* SCILAB cross checking */
    WriteCrossCheck(f);

    /* SCILAB equal output variable checking */
    WriteEqualCheck(f);

    /* FORTRAN call */
    WriteFortranCall(f);

    /* FORTRAN output to SCILAB */
    WriteOutput(f);
}
Example #4
0
void WriteOptArg(FILE *f,VARPTR var)
{
  char lsize[MAXNAM];
  char ldata[MAXNAM];

  Fprintf(f,indent++,"if( Rhs <= %d)\n",
	  var->stack_position-1 );
  Fprintf(f,indent,"{\n");

  switch (var->opt_type)
    {
    case NAME:
      AddDeclare(DEC_LOGICAL,"optvarget");
      Fprintf(f,indent,"if (.not.optvarget(fname,topk,%d,'%s       ')) return\n",
	      var->stack_position,var->opt_name);
      break;
    case VALUE:
      switch (var->type)
	{
	case SCALAR:
	  (*(CRERHSTAB[var->type].fonc))(f,var);
	  Fprintf(f,indent,"stk(lr%d)= %s\n",var->stack_position,
		  var->opt_name);
	  break;
	case MATRIX:
	  OptvarGetSize(var->opt_name,lsize,ldata);

	  AddDeclare1(DEC_DATA,"%s dat%d[]= %s",
		      SGetCDec(var->for_type),
		      var->stack_position,ldata);
	  Fprintf(f,indent,"m%d = 1;n%d = %s;\n",var->stack_position,
		  var->stack_position,lsize);
	  (*(CRERHSTAB[var->type].fonc))(f,var);
	  AddDeclare1(DEC_INT,"un=1");
	  Fprintf(f,indent,"C2F(%scopy)(&m%d,dat%d,&un,%s(l%d),&un);\n",
		  SGetForTypeAbrev(var),
		  var->stack_position,
		  var->stack_position,
		  SGetForTypeStack(var),var->stack_position);

	  break;
	case STRING:
	  Fprintf(f,indent,"m%d = %d\n",var->stack_position,
		  strlen(var->opt_name));
	  (*(CRERHSTAB[var->type].fonc))(f,var);
	  Fprintf(f,indent,"call stringcopy(m%d,'%s',cstk(lr%d))\n",
		  var->stack_position,var->opt_name,var->stack_position);
	  break;
	case SCIOPOINTER :
	  (*(CRERHSTAB[var->type].fonc))(f,var);
	  break;
	default:
	  printf("Optional variable with value must be \"SCALAR\" or \"STRING\"\n");
	  exit(1);
	  break;
	}
      break;
    }

  Fprintf(f,indent--,"}\n");
  Fprintf(f,indent++,"else\n");
  Fprintf(f,indent,"{\n");
  (*(RHSTAB[var->type].fonc))(f,var,0);
  Fprintf(f,indent--,"}\n");
}