1 /*
2  *  gretl -- Gnu Regression, Econometrics and Time-series Library
3  *  Copyright (C) 2001 Allin Cottrell and Riccardo "Jack" Lucchetti
4  *
5  *  This program is free software: you can redistribute it and/or modify
6  *  it under the terms of the GNU General Public License as published by
7  *  the Free Software Foundation, either version 3 of the License, or
8  *  (at your option) any later version.
9  *
10  *  This program is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  *  GNU General Public License for more details.
14  *
15  *  You should have received a copy of the GNU General Public License
16  *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
17  *
18  */
19 
20 #ifndef GRETL_FUNC_H
21 #define GRETL_FUNC_H
22 
23 #include "usermat.h"
24 
25 typedef enum {
26     FN_NEEDS_DATA,  /* needs some (any) sort of dataset */
27     FN_NEEDS_TS,    /* function requires time-series data */
28     FN_NEEDS_QM,    /* function requires quarterly or monthly data */
29     FN_NEEDS_PANEL, /* function requires panel data */
30     FN_NODATA_OK    /* function does not require a dataset */
31 } DataReq;
32 
33 typedef enum {
34     UFUN_ROLE_NONE,
35     UFUN_BUNDLE_PRINT,
36     UFUN_BUNDLE_PLOT,
37     UFUN_BUNDLE_TEST,
38     UFUN_BUNDLE_FCAST,
39     UFUN_BUNDLE_EXTRA,
40     UFUN_GUI_MAIN,
41     UFUN_GUI_PRECHECK,
42     UFUN_LIST_MAKER,
43     UFUN_ROLE_MAX
44 } UfunRole;
45 
46 typedef enum {
47     UFUN_PRIVATE   = 1 << 0,
48     UFUN_PLUGIN    = 1 << 1,
49     UFUN_NOPRINT   = 1 << 2,
50     UFUN_MENU_ONLY = 1 << 3,
51     UFUN_USES_SET  = 1 << 4
52 } UfunAttrs;
53 
54 #define NEEDS_TS    "needs-time-series-data"
55 #define NEEDS_QM    "needs-qm-data"
56 #define NEEDS_PANEL "needs-panel-data"
57 #define NO_DATA_OK  "no-data-ok"
58 
59 #define FN_NAMELEN 32
60 
61 #define ok_function_return_type(r) (r == GRETL_TYPE_DOUBLE || \
62 				    r == GRETL_TYPE_SERIES || \
63 				    r == GRETL_TYPE_MATRIX || \
64 				    r == GRETL_TYPE_LIST ||   \
65 				    r == GRETL_TYPE_STRING || \
66 				    r == GRETL_TYPE_BUNDLE || \
67 				    r == GRETL_TYPE_STRINGS ||  \
68 				    r == GRETL_TYPE_MATRICES || \
69 				    r == GRETL_TYPE_BUNDLES ||	\
70 				    r == GRETL_TYPE_LISTS ||	\
71 				    r == GRETL_TYPE_ARRAYS ||	\
72 				    r == GRETL_TYPE_VOID || \
73 				    r == GRETL_TYPE_NUMERIC)
74 
75 typedef struct ufunc_ ufunc;
76 typedef struct fncall_ fncall;
77 typedef struct fnpkg_ fnpkg;
78 
79 int n_user_functions (void);
80 
81 int n_free_functions (void);
82 
83 ufunc *get_user_function_by_name (const char *name);
84 
85 const ufunc *get_user_function_by_index (int idx);
86 
87 fncall *fncall_new (ufunc *fun, int preserve);
88 
89 void fncall_destroy (fncall *call);
90 
91 GretlType fncall_get_return_type (fncall *fc);
92 
93 fncall *get_pkg_function_call (const char *funcname,
94 			       const char *pkgname,
95 			       const char *pkgpath);
96 
97 int fn_n_params (const ufunc *fun);
98 
99 int fn_param_type (const ufunc *fun, int i);
100 
101 const char *fn_param_name (const ufunc *fun, int i);
102 
103 const char *fn_param_descrip (const ufunc *fun, int i);
104 
105 const char **fn_param_value_labels (const ufunc *fun, int i,
106 				    int *n);
107 
108 int fn_param_has_default (const ufunc *fun, int i);
109 
110 double fn_param_default (const ufunc *fun, int i);
111 
112 double fn_param_minval (const ufunc *fun, int i);
113 
114 double fn_param_maxval (const ufunc *fun, int i);
115 
116 double fn_param_step (const ufunc *fun, int i);
117 
118 int fn_param_optional (const ufunc *fun, int i);
119 
120 int fn_param_uses_xlist (const ufunc *fun, int i);
121 
122 int fn_param_uses_mylist (const ufunc *fun, int i);
123 
124 int user_func_get_return_type (const ufunc *fun);
125 
126 int user_func_is_noprint (const ufunc *fun);
127 
128 int user_func_is_menu_only (const ufunc *fun);
129 
130 const char *user_function_name_by_index (int i);
131 
132 int user_function_index_by_name (const char *name,
133 				 fnpkg *pkg);
134 
135 int user_function_set_debug (const char *name, int debug);
136 
137 void function_names_init (void);
138 
139 const char *next_available_function_name (fnpkg *pkg,
140 					  int *idxp);
141 
142 int gretl_compiling_function (void);
143 
144 int gretl_compiling_python (const char *line);
145 
146 int gretl_function_depth (void);
147 
148 int gretl_function_recursing (void);
149 
150 void current_function_info (char const **funcname,
151 			    char const **pkgname);
152 
153 fnpkg *get_active_function_package (gretlopt opt);
154 
155 fnpkg *gretl_function_get_package (const ufunc *fun);
156 
157 int gretl_start_compiling_function (const char *line,
158 				    const DATASET *dset,
159 				    PRN *prn);
160 
161 int gretl_function_append_line (ExecState *s);
162 
163 int gretl_is_public_user_function (const char *name);
164 
165 int gretl_function_exec (fncall *call, int rtype, DATASET *dset,
166 			 void *ret, char **descrip, PRN *prn);
167 
168 int attach_loop_to_function (void *ptr);
169 
170 int detach_loop_from_function (void *ptr);
171 
172 int set_function_should_return (const char *line);
173 
174 int current_function_size (void);
175 
176 char *gretl_func_get_arg_name (const char *argvar, int *err);
177 
178 int object_is_const (const char *name, int vnum);
179 
180 int object_is_function_arg (const char *name);
181 
182 void allow_full_data_access (int s);
183 
184 int series_is_accessible_in_function (int ID, const DATASET *dset);
185 
186 const char *series_get_list_parent (int ID);
187 
188 void sample_range_get_extrema (const DATASET *dset, int *t1, int *t2);
189 
190 void extend_function_sample_range (int addobs);
191 
192 int function_return_type_from_string (const char *s);
193 
194 int gretl_function_print_code (ufunc *u, int tabwidth, PRN *prn);
195 
196 char **gretl_function_retrieve_code (ufunc *u, int *nlines);
197 
198 int print_function_package_sample (const char *fname, int tabwidth,
199 				   PRN *prn);
200 
201 void set_current_function_package (fnpkg *pkg);
202 
203 fnpkg *function_package_new (const char *fname,
204 			     char **pubnames, int n_pub,
205 			     char **privnames, int n_priv,
206 			     int *err);
207 
208 int function_package_connect_funcs (fnpkg *pkg,
209 				    char **pubnames, int n_pub,
210 				    char **privnames, int n_priv);
211 
212 int function_package_set_properties (fnpkg *pkg, ...);
213 
214 int function_package_get_properties (fnpkg *pkg, ...);
215 
216 const char *function_package_get_string (fnpkg *pkg,
217 					 const char *id);
218 
219 int function_package_set_data_files (fnpkg *pkg, char **S, int n);
220 
221 char **function_package_get_data_files (fnpkg *pkg, int *n);
222 
223 int function_package_set_depends (fnpkg *pkg, char **S, int n);
224 
225 char **function_package_get_depends (fnpkg *pkg, int *n);
226 
227 const char *function_package_get_name (fnpkg *pkg);
228 
229 double function_package_get_version (fnpkg *pkg);
230 
231 int function_package_write_file (fnpkg *pkg);
232 
233 int create_and_write_function_package (const char *fname,
234 				       gretlopt opt,
235 				       PRN *prn);
236 
237 int function_set_package_role (const char *name, fnpkg *pkg,
238 			       const char *attr, PRN *prn);
239 
240 int function_ok_for_package_role (const char *name,
241 				  int role);
242 
243 const char *package_role_get_key (int flag);
244 
245 int check_function_needs (const DATASET *dset, DataReq dreq,
246 			  int minver);
247 
248 int package_version_ok (int minver, char *reqstr);
249 
250 int write_loaded_functions_file (const char *fname, int mpicall);
251 
252 int read_session_functions_file (const char *fname);
253 
254 fnpkg *get_function_package_by_name (const char *pkgname);
255 
256 fnpkg *get_function_package_by_filename (const char *fname, int *err);
257 
258 const char *get_function_package_path_by_name (const char *pkgname);
259 
260 char **package_peek_dependencies (const char *fname, int *ndeps);
261 
262 int include_gfn (const char *fname, gretlopt opt, PRN *prn);
263 
264 int function_package_is_loaded (const char *fname,
265 				const char **version);
266 
267 int gfn_is_loaded (const char *gfnname);
268 
269 void function_package_unload_by_filename (const char *fname);
270 
271 void function_package_unload_full_by_filename (const char *fname);
272 
273 int delete_function_package (const char *gfnname);
274 
275 int uninstall_function_package (const char *package, gretlopt opt,
276 				PRN *prn);
277 
278 int print_function_package_info (const char *fname, int gui_mode,
279 				 PRN *prn);
280 
281 int bundle_function_package_info (const char *fname, gretl_bundle *b);
282 
283 int print_function_package_code (const char *fname, int tabwidth,
284 				 PRN *prn);
285 
286 int print_function_package_help (const char *fname, PRN *prn);
287 
288 ufunc *get_function_from_package (const char *funname, fnpkg *pkg);
289 
290 int get_function_file_header (const char *fname, char **pdesc,
291 			      char **pver, char **pdate,
292 			      char **pauthor, int *pdfdoc);
293 
294 double gfn_file_get_version (const char *fname);
295 
296 int user_function_help (const char *fnname, gretlopt opt, PRN *prn);
297 
298 int function_package_has_PDF_doc (fnpkg *pkg, char **pdfname);
299 
300 int function_package_has_gui_help (fnpkg *pkg);
301 
302 void function_package_set_editor (fnpkg *pkg, void *editor);
303 
304 void *function_package_get_editor (fnpkg *pkg);
305 
306 int package_has_menu_attachment (const char *fname,
307 				 char **pkgname,
308 				 char **attach,
309 				 char **label);
310 
311 int package_needs_zipping (const char *fname,
312 			   int *pdfdoc,
313 			   char ***datafiles,
314 			   int *n_files);
315 
316 void gretl_functions_cleanup (void);
317 
318 int push_function_arg (fncall *fc, const char *name,
319 		       void *uvar, GretlType type,
320 		       void *value);
321 
322 int push_anon_function_arg (fncall *fc, GretlType type,
323 			    void *value);
324 
325 int push_function_args (fncall *fc, ...);
326 
327 void adjust_indent (const char *line, int *this_indent,
328 		    int *next_indent);
329 
330 #endif /* GRETL_FUNC_H */
331