File: ex15intf.c

package info (click to toggle)
scilab 2.6-4
  • links: PTS
  • area: non-free
  • in suites: woody
  • size: 54,632 kB
  • ctags: 40,267
  • sloc: ansic: 267,851; fortran: 166,549; sh: 10,005; makefile: 4,119; tcl: 1,070; cpp: 233; csh: 143; asm: 135; perl: 130; java: 39
file content (130 lines) | stat: -rw-r--r-- 3,686 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#include <string.h>

#include "stack-c.h"

typedef void (*voidf)();

typedef struct {
  char *name;
  voidf f;
} FTAB;

/***********************************
 * Table of predefined functions f1f and f2f
 ***********************************/

#if defined(__STDC__)
#define ARGS_ex15f double *,double*, double *
#else
#define ARGS_ex15f 
#endif 

typedef int (*funcex)(ARGS_ex15f);
extern int C2F(f1f)(ARGS_ex15f);
extern int C2F(f2f)(ARGS_ex15f);

extern int C2F(ex15f) __PARAMS((double *,integer *,double *,integer *,double *, funcex));
 
FTAB FTab_ex15f[] ={
  {"f1f", (voidf) C2F(f1f)},
  {"f2f", (voidf) C2F(f2f)},
  {(char *) 0, (voidf) 0}};

/***************************************************
 * deal with errors in scilab functions 
 ***************************************************/

#include <setjmp.h>
static  jmp_buf ex15fenv; 

/***************************************************
 * data for interface 
 ***************************************************/

static int sci_f, lhs_f, rhs_f;

/***************************************************
 * Functions 
 ***************************************************/

static int sciex15f (ARGS_ex15f);
static funcex Argex15f;

/***************************************************
 * intex15f : interface for ex15f 
 ***************************************************/

int intex15f(fname) 
     char *fname;
{ 
  int returned_from_longjump ;
  int m_X,n_X,l_X,m_Y,n_Y,l_y,m_Z,n_Z,l_Z;
  static int minlhs=1, minrhs=3, maxlhs=1, maxrhs=3;

  /*   Check rhs and lhs   */  
  CheckRhs(minrhs,maxrhs) ;
  CheckLhs(minlhs,maxlhs) ;

  /*   Variable #1 (X = real vector)   */
  GetRhsVar(1, "d", &m_X, &n_X, &l_X);

  /*   Variable #2 (Y = real vector)   */
  GetRhsVar(2, "d", &m_Y, &n_Y, &l_y);

  /*   ex15c(X,Y,f) 
   *   if f is a string we search for f in Tables and on succes 
   *         Argex15c will be the function to be called  
   *   if f is a macro then sciex15f will be called (see its definition bellow) 
   *         returned arguments are sci_f, lhs_f, rhs_f 
   *         function position in the stack sci_f required lhs and rhs in lhs_f, rhs_f 
   *         (we do not use lhs_f and rhs_f in this example)
   */

  Argex15f  = (funcex) GetFuncPtr("ex15f", 3, FTab_ex15f,
				  (voidf) sciex15f, &sci_f, &lhs_f, &rhs_f);
  if ( Argex15f == (funcex) 0 ) return 0;
  
  m_Z= m_X*n_X;  n_Z= m_Y*n_Y;
  /*  Creating the output variable Z (#4) , real matrix variable with m_Z rows and n_Z columns    */
  CreateVar(4, "d", &m_Z, &n_Z, &l_Z);

  /* If an error occurs while Z is calculated ... */
  if (( returned_from_longjump = setjmp(ex15fenv)) != 0 )
    {
      Scierror(999,"%s: Internal error \r\n",fname);
      return 0;
    }
  
  /*  Now matrix Z is populated i.e. appropriate values are 
      assigned to stk(l_Z)[0] ( = Z(1,1) ), stk(l_Z)[1]  ( = Z(2,1) ), ... */
  C2F(ex15f)(stk(l_X), &m_Z,stk(l_y), &n_Z, stk(l_Z), Argex15f);

  /*  Variable #4 is returned to Scilab  */
  LhsVar(1) = 4;
  return 0;
}

static int sciex15f(x,y,z)
     double *x,*y,*z;
     /* Computing z=f(x,y), f being the Scilab argument function */
     /* C function emulating the Scilab function pointed to by sci_f  */
{
  static int lhs=1,rhs=2;
  int scilab_i,scilab_j, un=1;
  /* Inputs (x(i),y(j)) at positions  (5,6) */
  CreateVar(5, "d", &un, &un, &scilab_i);
  stk(scilab_i)[0] = *x;

  CreateVar(6, "d", &un, &un, &scilab_j);
  stk(scilab_j)[0] = *y;

  /* executes the Scilab function (f) pointed to by sci_f. 
   * we provide a rhs=2 and expect lhs = 1 
   */

  PExecSciFunction(5, &sci_f, &lhs, &rhs, "ArgFex", ex15fenv);
  /* One output at position of first input (5) */
  *z = *stk(scilab_i);
  return 0;
}