1 #ifndef SUMA_PARSECOMMANDS_INCLUDED
2 #define SUMA_PARSECOMMANDS_INCLUDED
3 
4 /* structures to be used by most command line programs */
5 #define SUMA_GENERIC_PROG_MAX_SURF 10  /*!< Maximum number of surfaces allowed*/
6 #define SUMA_GENERIC_PROG_MAX_IN_NAME 500 /*!< Maximum number of input dsets allowed*/
7 
8 #define SUMA_MAX_SURF_ON_COMMAND 1000
9 #define SUMA_MAX_DSET_ON_COMMAND 1000
10 #define SUMA_MAX_DO_ON_COMMAND 100
11 #define SUMA_N_ARGS_MAX 1000
12 #define SUMA_VIEW_LENGTH 5
13 
14 typedef struct {
15    /* spec related input */
16    char *spec_names[SUMA_MAX_SURF_ON_COMMAND];
17    int N_spec_names;
18 
19    char *s_surfnames[SUMA_MAX_SURF_ON_COMMAND];
20    char *s_surfprefix[SUMA_MAX_SURF_ON_COMMAND];
21    char *s_surfpath[SUMA_MAX_SURF_ON_COMMAND];
22    int s_N_surfnames;
23 
24    /* -i_ related input */
25    char *i_surfnames[SUMA_MAX_SURF_ON_COMMAND];
26    char *i_surftopo[SUMA_MAX_SURF_ON_COMMAND];
27    char *i_surfpath[SUMA_MAX_SURF_ON_COMMAND];
28    char *i_surfprefix[SUMA_MAX_SURF_ON_COMMAND];
29    char *i_state[SUMA_MAX_SURF_ON_COMMAND];
30    char *i_group[SUMA_MAX_SURF_ON_COMMAND];
31    int i_anatomical[SUMA_MAX_SURF_ON_COMMAND];
32    int i_N_surfnames;
33    int i_DO_type[SUMA_MAX_SURF_ON_COMMAND];
34    SUMA_SO_File_Format i_FF[SUMA_MAX_SURF_ON_COMMAND];
35    SUMA_SO_File_Type i_FT[SUMA_MAX_SURF_ON_COMMAND];
36 
37    /* -ipar_ related input */
38    char *ipar_surfnames[SUMA_MAX_SURF_ON_COMMAND];
39    char *ipar_surftopo[SUMA_MAX_SURF_ON_COMMAND];
40    char *ipar_surfpath[SUMA_MAX_SURF_ON_COMMAND];
41    char *ipar_surfprefix[SUMA_MAX_SURF_ON_COMMAND];
42    char *ipar_state[SUMA_MAX_SURF_ON_COMMAND];
43    char *ipar_group[SUMA_MAX_SURF_ON_COMMAND];
44    int ipar_anatomical[SUMA_MAX_SURF_ON_COMMAND];
45    int ipar_N_surfnames;
46    SUMA_SO_File_Format ipar_FF[SUMA_MAX_SURF_ON_COMMAND];
47    SUMA_SO_File_Type ipar_FT[SUMA_MAX_SURF_ON_COMMAND];
48 
49    /* -o_related input */
50    char *o_surfnames[SUMA_MAX_SURF_ON_COMMAND];
51    char *o_surftopo[SUMA_MAX_SURF_ON_COMMAND];
52    char *o_surfpath[SUMA_MAX_SURF_ON_COMMAND];
53    char *o_surfprefix[SUMA_MAX_SURF_ON_COMMAND];
54    char *o_state[SUMA_MAX_SURF_ON_COMMAND];
55    char *o_group[SUMA_MAX_SURF_ON_COMMAND];
56    int o_anatomical[SUMA_MAX_SURF_ON_COMMAND];
57    int o_N_surfnames;
58    SUMA_SO_File_Format o_FF[SUMA_MAX_SURF_ON_COMMAND];
59    SUMA_SO_File_Type o_FT[SUMA_MAX_SURF_ON_COMMAND];
60 
61    /* -t_related input */
62    char *t_surfnames[SUMA_MAX_SURF_ON_COMMAND];
63    char *t_surftopo[SUMA_MAX_SURF_ON_COMMAND];
64    char *t_surfpath[SUMA_MAX_SURF_ON_COMMAND];
65    char *t_surfprefix[SUMA_MAX_SURF_ON_COMMAND];
66    char *t_state[SUMA_MAX_SURF_ON_COMMAND];
67    char *t_group[SUMA_MAX_SURF_ON_COMMAND];
68    int t_anatomical[SUMA_MAX_SURF_ON_COMMAND];
69    int t_N_surfnames;
70    SUMA_SO_File_Format t_FF[SUMA_MAX_SURF_ON_COMMAND];
71    SUMA_SO_File_Type t_FT[SUMA_MAX_SURF_ON_COMMAND];
72 
73    byte arg_checked[SUMA_N_ARGS_MAX];
74    int N_args;
75    char *sv[SUMA_MAX_SURF_ON_COMMAND];
76    int N_sv;
77    char *vp[SUMA_MAX_SURF_ON_COMMAND];
78    int N_vp;
79 
80    /* -talk_suma options */
81    SUMA_COMM_STRUCT *cs;
82 
83    /* mask fields */
84    char *cmask ;
85    char *bmaskname ;
86    char *nmaskname ;
87 
88    /* dsets */
89    char *dsetname[SUMA_MAX_DSET_ON_COMMAND];
90    int N_dsetname;
91 
92    /* DOs */
93    char *DO_name[SUMA_MAX_DO_ON_COMMAND];
94    int N_DO;
95    int DO_type[SUMA_MAX_DO_ON_COMMAND];
96 
97    /* flags for what to read */
98    byte accept_t;
99    byte accept_s;
100    byte accept_i;
101    byte onestate; /* if 1, All -i surfaces will have the same state */
102    int anatomical; /* if 1, All -i, -t surfs will be deemed anat. correct */
103    byte accept_ipar;
104    byte accept_o;
105    byte accept_spec;
106    byte accept_sv;
107    byte accept_talk_suma;
108    byte check_input_surf;
109    byte accept_mask;
110    byte accept_dset;
111    byte accept_do;
112    byte accept_cmap;
113 
114    /* flags for help */
115    byte hverb; /* help verbosity */
116 
117    /* flags for cmap selection */
118    char *cmap;
119    char *cmapfile;
120    char *cmapdb;
121 
122    // Other flags
123    Boolean verbose;
124 
125 } SUMA_GENERIC_ARGV_PARSE;
126 
127 typedef struct {
128    SUMA_SO_File_Type iType;
129    char *sv_name; /* do not free, argv[.] copy */
130    char *surf_names[SUMA_GENERIC_PROG_MAX_SURF];/* do not free, argv[.] copy */
131    int N_surf;
132    char *spec_file; /* do not free, argv[.] copy */
133    char *in_name;    /* do not free, argv[.] copy */
134    char *in_namev[SUMA_GENERIC_PROG_MAX_IN_NAME];/*whole bunch of input files*/
135    int n_in_namev;
136    char *surftype; /* do not free, argv[.] copy */
137    char *out_prefix;   /* this one's dynamically allocated so
138                           you'll have to free it yourself */
139    SUMA_DSET_FORMAT oform;
140 
141    char *out_vol_prefix; /* this one's dynamically allocated so
142                            you'll have to free it yourself */
143    char out_vol_view[SUMA_VIEW_LENGTH];
144    int out_vol_exists;
145    char *out_grid_prefix; /* this one's dynamically allocated so
146                              you'll have to free it yourself */
147    char out_grid_view[SUMA_VIEW_LENGTH];
148    int out_grid_exists;
149    char *in_vol_prefix; /* this one's dynamically allocated
150                            so you'll have to free it yourself */
151    char in_vol_view[SUMA_VIEW_LENGTH];
152    int in_vol_exists;
153    int MaskMode;
154    char *cmask;
155    char *dmask;
156    THD_3dim_dataset *in_vol;
157    float VolCM[3];   /* input volume's center of mass */
158    float *mcfv;      /* the dataset that is passed to the
159                         marching cube algorithm */
160    int debug;
161    int ninmask;
162    int fix_winding;
163    float v0;
164    float v1;
165    int nvox;
166    float *fvec;
167    int n_fvec;
168    int fvec_dim;
169    double *dvec;
170    int obj_type;
171    int obj_type_res;
172    int xform;
173    SUMA_SO_File_Format SurfFileFormat;
174    SUMA_SO_File_Type SurfFileType;
175    /* following fields are intended for use in ConvexHull only */
176    char *in_1D;  /* name of 1D file containing XYZ coords */
177    float *XYZ; /* a 3*N_XYZ vector of XYZ coordinates.
178                   This vector should be freed at the end*/
179    int N_XYZ;  /* number of points in XYZ */
180    /* following fields are intended for use in BrainWarp only */
181    float ExpFrac; /* a fraction (0.01) used to control the rate of expansion of
182                  the surface (see su3 variable in SUMA_StretchToFitLeCerveau ) */
183    float Zt; /* a fraction controlling the separation between brain and non
184                brain, see variable tb in SUMA_StretchToFitLeCerveau ) */
185    int N_it; /* number of iterations */
186    int Icold; /* number of Ico subdivisions */
187    int NodeDbg; /* node to debug */
188    float t;
189    float tm;
190    float t2;
191    float t98;
192    float r;
193    float cog[3];
194    float d1;
195    float su1;
196    float UseNew;
197    float d4;
198    float *ztv;
199    int Kill98;
200    int NoEyes;
201    int NNsmooth;
202    int smootheach;
203    float avoid_vent;
204    int smooth_end;
205    int *k98mask;
206    int k98maskcnt;
207    float travstp;
208    float *Stop;
209    int MaxIntIter;
210    int UseExpansion;
211    float PercInt;
212    int UseSkull;
213    float bot_lztclip;
214    float var_lzt;
215    int send_hull;
216    int DemoPause;
217    int DoSpatNorm;
218    float SpatNormDxyz;
219    int specie;
220    int WriteSpatNorm;
221    int fillhole;
222    THD_3dim_dataset *iset;
223    FILE *dbg_eyenodes;
224    float SpatShift[3];
225    THD_3dim_dataset *OrigSpatNormedSet;
226    THD_3dim_dataset *in_edvol;
227    float blur_fwhm;
228    int iset_hand;
229    char *shrink_bias_name;
230    float *shrink_bias;
231    int NearestNode;
232    int NearestTriangle;
233    int DistanceToMesh;
234    int NearestNodeCoords;
235    int ProjectionOnMesh;
236    int Data;
237 
238    char *in_nodeindices;
239 
240    float *emask;
241    float efrac;
242    float *fatemask;
243    int Use_emask;
244    byte *nmask;
245 
246    int PushToEdge;
247    int DoSkulls;
248    byte b1;
249    byte b2;
250 
251    void *popt;    /*< NULL pointer to hide program specific structure */
252 
253    float *Brain_Contour;
254    float *Brain_Hull;
255    float *Skull_Outer;
256    float *Skull_Inner;
257 
258    char *UseThisBrain;/* do not free, argv[.] copy */
259    char *UseThisBrainHull; /* do not free, argv[.] copy */
260    char *UseThisSkullOuter; /* do not free, argv[.] copy */
261    byte SurfaceCoil; /* data acquired with SurfaceCoil */
262 
263    int iopt;
264 
265    char **com;
266    int N_com;
267 
268    char *unit_sphere_name;
269    char *bases_prefix;
270 
271    int dmed;
272    int unif;
273    int geom;
274    int corder;
275    int poly;
276 
277    int match_area;
278 
279    float xyz_scale;
280    SUMA_GENERIC_ARGV_PARSE *ps; /* a holder for convenience, never free it*/
281 
282    char *s; /* freed in the end */
283 
284    int *ivec;
285    int n_ivec;
286 
287    float permask;
288    float flt1, flt2, flt3;
289    float PlEq[4];
290 } SUMA_GENERIC_PROG_OPTIONS_STRUCT; /* also edit defaults in
291                                  SUMA_Alloc_Generic_Prog_Options_Struct and in
292                                  SUMA_Free_Generic_Prog_Options_Struct */
293 
294 double SUMA_ParseTime(char *tm);
295 int  SUMA_GetNextCommand (char *S, char d, char term, char *Scom);
296 SUMA_Boolean  SUMA_RegisterCommand(char *S, char d, char term, char *Scom, SUMA_Boolean Prepend);
297 int SUMA_CommandCode(char *Scom);
298 SUMA_NI_COMMAND_CODE SUMA_niCommandCode(char *Scom);
299 const char *SUMA_CommandString (SUMA_ENGINE_CODE code);
300 const char *SUMA_niCommandString (SUMA_NI_COMMAND_CODE code);
301 SUMA_Boolean SUMA_RegisterEngineData (SUMA_EngineData *MTI, char *Fldname, void *FldValp, char *DestName, char *SourceName, SUMA_Boolean PassByPointer);
302 SUMA_Boolean SUMA_FreeEngineData (SUMA_EngineData *MTI);
303 SUMA_ENGINE_FIELD_CODE SUMA_EngineFieldCode(char *Scom);
304 const char *SUMA_EngineFieldString (SUMA_ENGINE_FIELD_CODE i);
305 SUMA_Boolean SUMA_ReleaseEngineData (SUMA_EngineData *MTI, char *Location);
306 SUMA_Boolean SUMA_InitializeEngineData (SUMA_EngineData *MTI);
307 int SUMA_EngineSourceCode (char *Scom);
308 void SUMA_EngineSourceString (char *Scom, int ses_code);
309 const char *SUMA_DomainKinships_String (SUMA_DOMAIN_KINSHIPS code);
310 DList *SUMA_CreateList (void);
311 SUMA_EngineData *SUMA_InitializeEngineListData (SUMA_ENGINE_CODE CommandCode);
312 DListElmt * SUMA_RegisterEngineListCommand (DList *list, SUMA_EngineData * EngineData,
313                                              SUMA_ENGINE_FIELD_CODE Fld, void *FldValp,
314                                              SUMA_ENGINE_SOURCE Src, void *Srcp, SUMA_Boolean PassByPointer,
315                                              SUMA_ENGINE_INSERT_LOCATION InsertAt, DListElmt *Element);
316 SUMA_Boolean SUMA_ReleaseEngineListElement (DList *list, DListElmt *element);
317 DList * SUMA_DestroyList (DList *list);
318 DList * SUMA_EmptyDestroyList (DList *list);
319 void SUMA_FreeEngineListData(void *MTI);
320 SUMA_ENGINE_CODE SUMA_GetListNextCommand (DList *list);
321 void SUMA_ShowList (DList *list, FILE *Out);
322 void SUMA_FreeMessageListData(void *Hv);
323 SUMA_Boolean SUMA_ReleaseMessageListElement (DList *list, DListElmt *element) ;
324 DList *SUMA_CreateMessageList (void);
325 SUMA_Boolean SUMA_RegisterMessage ( DList *list, char *Message, char *Source, SUMA_MESSAGE_TYPES Type, SUMA_MESSAGE_ACTION Action);
326 char *SUMA_BuildMessageLog (DList *ML);
327 void SUMA_FreeActionStackData(void *asdata);
328 DList *SUMA_CreateActionStack (void);
329 void SUMA_ReleaseActionStackData (void *asdata);
330 DList *SUMA_EmptyDestroyActionStack (DList *AS);
331 const char *SUMA_ColMixModeString (SUMA_COL_MIX_MODE mode);
332 SUMA_SO_File_Type SUMA_SurfaceTypeCode (char *cd);
333 const char * SUMA_SurfaceTypeString (SUMA_SO_File_Type tp);
334 const char * SUMA_SurfaceFormatString (SUMA_SO_File_Format ff);
335 SUMA_SO_File_Format SUMA_SurfaceFormatCode (char *cd);
336 SUMA_DO_DRAW_MASK SUMA_DO_DrawMaskName2Code (char *name);
337 char *SUMA_DO_DrawMaskCode2Name(SUMA_DO_DRAW_MASK dd);
338 char *SUMA_DO_DrawMaskCode2Name_human(SUMA_DO_DRAW_MASK dd);
339 SUMA_SO_File_Type SUMA_guess_surftype_argv(char *str);
340 SUMA_SO_File_Type SUMA_GuessSurfFormatFromExtension_core(char *Name,
341                                  char **specname, char **svname, char **sname);
342 SUMA_SO_File_Type SUMA_GuessSurfFormatFromExtension(
343    char *Name,  char *fallbackname);
344 SUMA_GENERIC_ARGV_PARSE *SUMA_CreateGenericArgParse(char *optflags);
345 SUMA_GENERIC_ARGV_PARSE *SUMA_FreeGenericArgParse(SUMA_GENERIC_ARGV_PARSE *ps);
346 char *SUMA_help_IO_Args(SUMA_GENERIC_ARGV_PARSE *opt);
347 SUMA_GENERIC_ARGV_PARSE *SUMA_Parse_IO_Args (int argc, char *argv[], char *optflags);
348 SUMA_GENERIC_PROG_OPTIONS_STRUCT * SUMA_Alloc_Generic_Prog_Options_Struct(void);
349 SUMA_GENERIC_PROG_OPTIONS_STRUCT * SUMA_Free_Generic_Prog_Options_Struct(SUMA_GENERIC_PROG_OPTIONS_STRUCT *Opt);
350 SUMA_Boolean SUMA_isOutputFormatFromArg(char *arg, SUMA_DSET_FORMAT *o_formp);
351 SUMA_Boolean SUMA_isInputFormatFromArg(char *arg, SUMA_DSET_FORMAT *o_formp);
352 SUMA_Boolean SUMA_isFormatFromArg(char *arg, SUMA_DSET_FORMAT *o_formp);
353 SUMA_Boolean SUMA_isIOFormatFromArg(char *argi, SUMA_DSET_FORMAT *oformp,
354                                     int *io);
355 
356 /*!
357    \brief Macro that adds a command to the head of command list.
358    SUMA_REGISTER_HEAD_COMMAND_NO_DATA(list, Command, Src, Srcp)
359 
360    \param list (DList *) pointer to list
361    \param Command (SUMA_ENGINE_CODE) command code
362    \param Src (SUMA_ENGINE_SOURCE) source of command
363    \param Srcp (void *) pointer to source pointer. (No need to type cast it yourself, macro will)
364 
365    - Expects the variable FuncName (char *) to be defined already (that's the case in all of SUMA's functions)
366    - No Engine Data can be passed with this macro
367 
368 */
369 #define SUMA_REGISTER_HEAD_COMMAND_NO_DATA(list, Command, Src, Srcp) {\
370    SUMA_EngineData *ED_macro; \
371    ED_macro = SUMA_InitializeEngineListData (Command);   \
372    if (!SUMA_RegisterEngineListCommand (  list, ED_macro, \
373                                           SEF_Empty, NULL,  \
374                                           Src, (void *)Srcp, NOPE,   \
375                                           SEI_Head, NULL)) {   \
376       fprintf (SUMA_STDERR, "Error %s: Failed to register command.\n", FuncName);   \
377    }  \
378 }
379 
380 /*!
381    \brief Macro that adds a command to the tail of command list.
382 
383    \sa SUMA_REGISTER_HEAD_COMMAND_NO_DATA
384 */
385 #define SUMA_REGISTER_TAIL_COMMAND_NO_DATA(list, Command, Src, Srcp) {\
386    SUMA_EngineData *ED_macro; \
387    ED_macro = SUMA_InitializeEngineListData (Command);   \
388    if (!SUMA_RegisterEngineListCommand (  list, ED_macro, \
389                                           SEF_Empty, NULL,  \
390                                           Src, (void *)Srcp, NOPE,   \
391                                           SEI_Tail, NULL)) {   \
392       fprintf (SUMA_STDERR, "Error %s: Failed to register command.\n", FuncName);   \
393    }  \
394 }
395 
396 /*!
397    \brief Macro that reports an error to the log
398 
399 */
400 #define SUMA_L_Err(...) {\
401    char m_stemp[256];   \
402    snprintf(m_stemp, 255, __VA_ARGS__ );  \
403    SUMA_RegisterMessage (SUMAg_CF->MessageList, m_stemp, \
404                          FuncName, SMT_Error, SMA_Log); \
405 }
406 /*!
407    \brief Macro that reports an error to stderr
408 
409 */
410 #define SUMA_S_Errv( ... ) {\
411    fprintf (SUMA_STDERR, \
412             "--     Error %s (%s:%d):\n", FuncName, __FILE__ , __LINE__);  \
413    fprintf (SUMA_STDERR, __VA_ARGS__);  \
414 }
415 #define SUMA_S_Err( ... ) {\
416    SUMA_S_Errv( __VA_ARGS__ );  \
417    fprintf (SUMA_STDERR,"\n");   \
418 }
419 
420 /*!
421    \brief Macro that reports an error to stderr and log
422 
423 */
424 #define SUMA_SL_Err(...) {\
425    SUMA_S_Err(__VA_ARGS__);  \
426    SUMA_L_Err(__VA_ARGS__); \
427 }
428 
429 /*!
430    \brief Macro that reports an error to stderr and log and popup
431 
432 */
433 #define SUMA_SLP_Err(...) {\
434    static char mm[1024];   \
435    SUMA_S_Err(__VA_ARGS__);  \
436    snprintf(mm, 1022, __VA_ARGS__); \
437    SUMA_RegisterMessage (SUMAg_CF->MessageList, mm, FuncName, \
438                          SMT_Error, SMA_LogAndPopup); \
439 }
440 
441 /*!
442    \brief Macro that reports a notice to the log
443 
444 */
445 #define SUMA_L_Note(...) {\
446    char m_stemp[256];   \
447    snprintf(m_stemp, 255, __VA_ARGS__);   \
448    SUMA_RegisterMessage (SUMAg_CF->MessageList, m_stemp, \
449                          FuncName, SMT_Notice, SMA_Log); \
450 }
451 /*!
452    \brief Macro that reports a notice to stderr
453 
454 */
455 #define SUMA_S_Notev( ... ) {\
456    fprintf (SUMA_STDERR, "++     Notice %s (%s:%d @%s):\n", \
457             FuncName, __FILE__ , __LINE__, SUMA_time());  \
458    fprintf (SUMA_STDERR, __VA_ARGS__);  \
459 }
460 #define SUMA_S_Note( ... ) {\
461    SUMA_S_Notev(__VA_ARGS__);  \
462    fprintf (SUMA_STDERR,"\n");   \
463 }
464 
465 /*!
466    \brief Macro that reports a notice to stderr and log
467 
468 */
469 #define SUMA_SL_Note(...) {\
470    SUMA_S_Note(__VA_ARGS__); \
471    SUMA_L_Note(__VA_ARGS__);  \
472 }
473 
474 /*!
475    \brief Macro that reports a notice to stderr and log and popup
476 
477 */
478 #define SUMA_SLP_Note(...) {\
479    char m_stemp[256];   \
480    snprintf(m_stemp, 255, __VA_ARGS__);   \
481    SUMA_S_Note(__VA_ARGS__); \
482    SUMA_RegisterMessage (SUMAg_CF->MessageList, m_stemp, \
483                          FuncName, SMT_Notice, SMA_LogAndPopup); \
484 }
485 
486 /*!
487    \brief Macro that reports a text message to the log
488 
489 */
490 #define SUMA_L_Text(...) {\
491    char m_stemp[256];   \
492    snprintf(m_stemp, 255, __VA_ARGS__);   \
493    SUMA_RegisterMessage (SUMAg_CF->MessageList, m_stemp, \
494                          FuncName, SMT_Text, SMA_Log); \
495 }
496 /*!
497    \brief Macro that reports a text message to stderr
498 
499 */
500 #define SUMA_S_Text(...) {\
501    fprintf (SUMA_STDERR, __VA_ARGS__);  \
502 }
503 /*!
504    \brief Macro that reports a text message to stderr and log
505 
506 */
507 #define SUMA_SL_Text(...) {\
508    char m_stemp[256];   \
509    SUMA_S_Text(__VA_ARGS__);  \
510    snprintf(m_stemp, 255, __VA_ARGS__);   \
511    SUMA_RegisterMessage (SUMAg_CF->MessageList, m_stemp, \
512                          FuncName, SMT_Text, SMA_Log); \
513 }
514 /*!
515    \brief Macro that reports a text message to stderr and log and popup
516 
517 */
518 #define SUMA_SLP_Text(...) {\
519    char m_stemp[256];   \
520    snprintf(m_stemp, 255, __VA_ARGS__);   \
521    SUMA_S_Text(__VA_ARGS__);  \
522    SUMA_RegisterMessage (SUMAg_CF->MessageList, m_stemp, \
523                          FuncName, SMT_Text, SMA_LogAndPopup); \
524 }
525 
526 /*!
527    \brief Macro that reports a warning to the log
528 
529 */
530 #define SUMA_L_Warn(...) {\
531    char m_stemp[256];   \
532    snprintf(m_stemp, 255, __VA_ARGS__ );   \
533    SUMA_RegisterMessage (SUMAg_CF->MessageList, m_stemp, \
534                          FuncName, SMT_Warning, SMA_Log); \
535 }
536 /*!
537    \brief Macro that reports a warning to stderr
538 
539 */
540 #define SUMA_S_Warnv( ... ) {\
541    fprintf (SUMA_STDERR, "oo     Warning %s (%s:%d):\n", \
542                          FuncName, __FILE__ , __LINE__);  \
543    fprintf (SUMA_STDERR, __VA_ARGS__);  \
544 }
545 #define SUMA_S_Warn( ... ) {\
546    SUMA_S_Warnv(__VA_ARGS__);  \
547    fprintf (SUMA_STDERR,"\n");   \
548 }
549 /*!
550    \brief Macro that reports a warning to stderr and log
551 
552 */
553 #define SUMA_SL_Warn(...) {\
554    char m_stemp[513];   \
555    SUMA_S_Warn(__VA_ARGS__);  \
556    snprintf(m_stemp, 511, __VA_ARGS__);   \
557    SUMA_RegisterMessage (SUMAg_CF->MessageList, m_stemp, FuncName, SMT_Warning, SMA_Log); \
558 }
559 /*!
560    \brief Macro that reports a warning to stderr and log and popup
561 
562 */
563 #define SUMA_SLP_Warn(...) {\
564    char m_stemp[513];   \
565    SUMA_S_Warn(__VA_ARGS__);  \
566    snprintf(m_stemp, 511, __VA_ARGS__);   \
567    SUMA_RegisterMessage (SUMAg_CF->MessageList, m_stemp, \
568                          FuncName, SMT_Warning, SMA_LogAndPopup); \
569 }
570 
571 /*!
572    \brief Macro that reports a critical error to the log
573 
574 */
575 #define SUMA_L_Crit(...) {\
576    char m_stemp[513];   \
577    snprintf(m_stemp, 511, __VA_ARGS__);   \
578    SUMA_RegisterMessage (SUMAg_CF->MessageList, m_stemp, FuncName, \
579                          SMT_Critical, SMA_Log); \
580 }
581 /*!
582    \brief Macro that reports a critical error to stderr
583 
584 */
585 #define SUMA_S_Crit( ... ) {\
586    SUMA_S_Critv( __VA_ARGS__ );  \
587    fprintf (SUMA_STDERR,"\n");   \
588 }
589 #define SUMA_S_Critv( ... ) {\
590    fprintf (SUMA_STDERR, "**     Critical %s (%s:%d):\n", \
591                          FuncName, __FILE__, __LINE__);  \
592    fprintf (SUMA_STDERR, __VA_ARGS__);  \
593 }
594 
595 /*!
596    \brief Macro that reports a critical error to stderr and log
597 
598 */
599 #define SUMA_SL_Crit(...) {\
600    char m_stemp[513];   \
601    snprintf(m_stemp, 511, __VA_ARGS__);   \
602    SUMA_S_Crit(__VA_ARGS__); \
603    SUMA_RegisterMessage (SUMAg_CF->MessageList, m_stemp, FuncName, \
604                          SMT_Critical, SMA_Log); \
605 }
606 /*!
607    \brief Macro that reports a critical error to stderr and log and popup
608 
609 */
610 #define SUMA_SLP_Crit(...) {\
611    char m_stemp[513];   \
612    snprintf(m_stemp, 511, __VA_ARGS__);   \
613    SUMA_S_Crit(__VA_ARGS__); \
614    SUMA_RegisterMessage (SUMAg_CF->MessageList, m_stemp, FuncName, \
615                          SMT_Critical, SMA_LogAndPopup); \
616 }
617 
618 #define SUMA_BEEP {  \
619    if (SUMAg_SVv[0].X->TOPLEVEL) XBell (XtDisplay (SUMAg_SVv[0].X->TOPLEVEL), SUMA_BEEP_LENGTH_MS);  \
620 }
621 /*!
622    \brief Macro that reports a message to SUMA_STDERR if LocalHead is set to YUP
623 */
624 #define SUMA_LHv( ...) {\
625    if (LocalHead) {  \
626       fprintf (SUMA_STDERR, "##      %s (%s:%d  @%s):\n", \
627                FuncName, __FILE__, __LINE__, SUMA_time());  \
628       fprintf (SUMA_STDERR, __VA_ARGS__);  \
629    }  \
630 }
631 #define SUMA_LH( ... ) {\
632    if (LocalHead) {  \
633       SUMA_LHv( __VA_ARGS__ );  \
634       fprintf (SUMA_STDERR,"\n");   \
635    }  \
636 }
637 
638 
639 #define SUMA_ANIM_EXT(Ext) (  (\
640                                  SUMA_iswordsame_ci(Ext,".agif") || SUMA_iswordsame_ci(Ext,".gif") ||   \
641                                  SUMA_iswordsame_ci(Ext,".mpeg") || SUMA_iswordsame_ci(Ext,".mpg") \
642                               )  ? 1:0 )
643 #define SUMA_IMG_EXT(Ext) (  (\
644                                  SUMA_iswordsame_ci(Ext,".jpeg") || SUMA_iswordsame_ci(Ext,".jpg") ||   \
645                                  SUMA_iswordsame_ci(Ext,".png") || \
646                                  SUMA_iswordsame_ci(Ext,".gif") \
647                               )  ? 1:0 )
648 
649 
650 #endif
651