summaryrefslogtreecommitdiff
path: root/macros/FunctionAnnotation/FA_GetOutArgInfo.sci
blob: 0cdba234d50d15d50821339640bf79441a7cc59f (plain)
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
131
132
133
134
135
136
137
138
139
140
141
142
function UpdatedOutArg = ...
   FA_GetOutArgInfo(InArg,NInArg,OutArg,NOutArg,SharedInfo,FunPrecSpecifier,FunTypeAnnot,FunSizeAnnot,ReportFileName)
// function UpdatedOutArg = ...
//    FA_GetOutArgInfo(InArg,NInArg,OutArg,NOutArg,SharedInfo,FunPrecSpecifier,FunTypeAnnot,FunSizeAnnot,ReportFileName)
// -----------------------------------------------------------------
// #RNU_RES_B
// InArg is used by eval don't remove it from the function call.
//
// #RNU_RES_E
// Input data:
// //NUT: Add description here
//
// Output data:
// //NUT: Add description here
//
// Status:
// 25-Oct-2007 -- Raffaele Nutricato: Author.
//
// Copyright 2007 Raffaele Nutricato.
// Contact: raffaele.nutricato@tiscali.it
// -----------------------------------------------------------------

// ------------------------------
// --- Check input arguments. ---
// ------------------------------
SCI2CNInArgCheck(argn(2),9,9);

// -----------------------
// --- Initialization. ---
// -----------------------
UpdatedOutArg   = OutArg;
for cntin = 1:NInArg
   IN(cntin).TP    = InArg(cntin).Type;
   IN(cntin).SZ(1) = InArg(cntin).Size(1);
   IN(cntin).SZ(2) = InArg(cntin).Size(2);
   if ((isnan(InArg(cntin).Value)) & (GetSymbolDimension(InArg(cntin).Size) == 0))
      // #RNU_RES_B
      // IN(cntin).VAL = '__SCI2CNANSIZE'; //RNU: toglimi
      //RNU: Replace the value of the variable with its name, in case it is a scalar variable.
      // #RNU_RES_E
      IN(cntin).VAL = InArg(cntin).Name;
   else
      IN(cntin).VAL = string(InArg(cntin).Value);
   end
end
DefaultPrecision = SharedInfo.DefaultPrecision;

// ---------------------------
// --- End Initialization. ---
// ---------------------------
if (mtlb_strcmp(FunTypeAnnot(1),''))
   NOutArg = 0;
else
   NOutArg = max(size(FunTypeAnnot));
end

flagfindlike = 0;
for counterin = 1:NInArg
   if (InArg(counterin).FindLike == 1 | InArg(counterin).FindLike == -1)
      // #RNU_RES_B
      // Then we must assume that the output will be findlike
      // 0 = no find-like
      // 1 = pure find-like
      //-1 = similar to find-like (out=fun(in)) where in is find-like.
      // #RNU_RES_E
      flagfindlike = -1;
   end
end

for counterout = 1:NOutArg
   if(mtlb_strcmp(FunTypeAnnot,'FA_TP_USER'))
      UpdatedOutArg(counterout).Type   = FA_TP_USER(FunPrecSpecifier,DefaultPrecision);
   else
      UpdatedOutArg(counterout).Type   = eval(FunTypeAnnot(counterout));
   end
   UpdatedOutArg(counterout).FindLike  = 0;
   lengthFA_SZ_RTMAX = length('FA_SZ_RTMAX');

   if (SCI2Cstrncmps1size('FA_SZ_RTMAX',FunSizeAnnot(counterout,1)))
      UpdatedOutArg(counterout).FindLike = 1;
      FunSizeAnnot(counterout,1) = part(FunSizeAnnot(counterout,1),lengthFA_SZ_RTMAX+1:length(FunSizeAnnot(counterout,1)));
   end

   if (SCI2Cstrncmps1size('FA_SZ_RTMAX',FunSizeAnnot(counterout,2)))
      UpdatedOutArg(counterout).FindLike = 1;
      FunSizeAnnot(counterout,2) = part(FunSizeAnnot(counterout,2),lengthFA_SZ_RTMAX+1:length(FunSizeAnnot(counterout,2)));
   end

   if (flagfindlike == -1)
      UpdatedOutArg(counterout).FindLike = -1;
   end

   // #RNU_RES_B
   // When the size is given by e IN(x).VAL  annotation we can have two cases:
   // IN(x).VAL is a number or IN(x).VAL is %nan. When it is %nan the
   // size is equal to the name of IN(x).
   // This is a dynamic memory extension of a local variable and for the moment
   // we issue an error according to SCI2C specifications
   // #RNU_RES_E
   tmpeval = eval(FunSizeAnnot(counterout,1));
   if (IsNanSize(tmpeval))
      if SharedInfo.ForExpr.OnExec == 0
         EM_NanSize(ReportFileName);
      else
         UpdatedOutArg(counterout).Size(1) = string(tmpeval);
      end
   elseif(isnum(tmpeval))
      if (eval(tmpeval) <= 0)
         EM_ZeroSize(ReportFileName);
      else
         UpdatedOutArg(counterout).Size(1) = string(tmpeval);
      end
   else
      UpdatedOutArg(counterout).Size(1) = string(tmpeval);
   end

   tmpeval = eval(FunSizeAnnot(counterout,2));
   if (IsNanSize(tmpeval))
      if SharedInfo.ForExpr.OnExec == 0
         EM_NanSize(ReportFileName);
      else
         // #RNU_RES_B
         // If we are in for expression I prefer to issue the error later.
         // #RNU_RES_E
         UpdatedOutArg(counterout).Size(2) = string(tmpeval);
      end
   elseif(isnum(tmpeval))
      if (eval(tmpeval) <= 0)
         EM_ZeroSize(ReportFileName);
      else
         UpdatedOutArg(counterout).Size(2) = string(tmpeval);
      end
   else
      UpdatedOutArg(counterout).Size(2) = string(tmpeval);
   end

   UpdatedOutArg(counterout).Value     = %nan;
   UpdatedOutArg(counterout).Dimension = GetSymbolDimension(UpdatedOutArg(counterout).Size);
   UpdatedOutArg(counterout).Scope     = 'Temp';//NUT anche su questo si puo' ragionare verifica anche la handleoperation.
end

endfunction