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
|
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;
for _InArgSize=1:size(InArg(cntin).Size, '*')
IN(cntin).SZ(_InArgSize) = InArg(cntin).Size(_InArgSize);
end
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 (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(FunTypeAnnot == 'FA_TP_USER')
UpdatedOutArg(counterout).Type = FA_TP_USER(FunPrecSpecifier,DefaultPrecision);
else
UpdatedOutArg(counterout).Type = eval(FunTypeAnnot(counterout));
end
UpdatedOutArg(counterout).FindLike = 0;
// This is just to remove the FA_SZ_RTMAX tag ???
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
for iterOutputPosition=1:size(FunSizeAnnot, 'c')
tmpeval = eval(FunSizeAnnot(counterout, iterOutputPosition));
if (IsNanSize(tmpeval))
if SharedInfo.ForExpr.OnExec == 0
EM_NanSize(ReportFileName);
else
UpdatedOutArg(counterout).Size(iterOutputPosition) = string(tmpeval);
end
elseif(isnum(tmpeval))
if (eval(tmpeval) <= 0)
EM_ZeroSize(ReportFileName);
else
UpdatedOutArg(counterout).Size(iterOutputPosition) = string(tmpeval);
end
else
UpdatedOutArg(counterout).Size(iterOutputPosition) = string(tmpeval);
end
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
|