1 #ifndef SUMA_UTILS_INCLUDED
2 #define SUMA_UTILS_INCLUDED
3 
4 /* Do not include matrix.h if matrix_f.h has been included
5 Otherwise any program using matrix_f.h will have type conflicts.
6 Also, any inclusion of matrix_f.h should precede inclusion of
7 mri_lib.h, 3ddata.h, or suma_string_utils.h */
8 #ifndef  MATRIX_F_INCLUDED
9 #include "matrix.h"
10 #endif
11 
12 typedef enum { SUMA_notypeset = -1,
13                SUMA_byte = NI_BYTE,
14                SUMA_short = NI_SHORT,
15                SUMA_int = NI_INT,
16                SUMA_float = NI_FLOAT32,
17                SUMA_double = NI_FLOAT64,
18                SUMA_complex = NI_COMPLEX64,
19                SUMA_string = NI_STRING} SUMA_VARTYPE;
20 
21 typedef enum { SUMA_noGLtuples = -1,
22                SUMA_b = 1001, /* unsigned byte */
23                SUMA_bbb = 1002, /* 3* unsigned byte */
24                SUMA_bbbb = 1003, /* 3* unsigned byte */
25                SUMA_F = 1011, /* one float */
26                SUMA_FFF = 1012, /* 3* float */
27                SUMA_FFFF = 1013, /* 4 * float */
28               } SUMA_GL_TUPLES;
29 
30 #define SUMA_MX_VEC_MAX_DIMS 50
31 typedef struct {
32    SUMA_VARTYPE tp;
33    int N_dims;
34    int N_vals;
35    int dims[SUMA_MX_VEC_MAX_DIMS];
36    int fdfm[SUMA_MX_VEC_MAX_DIMS];
37    void *v;
38    byte *bv;
39    short *sv;
40    int *iv;
41    float *fv;
42    double *dv;
43    complex *cv;
44    byte fdf;
45    matrix *m;
46 } SUMA_MX_VEC;
47 
48 /*! filename and path */
49 typedef struct {
50    char *Path;
51    char *FileName;
52 }SUMA_FileName;
53 
54 /*! filename, extension and path */
55 typedef struct {
56    char *AbsPath;
57    char *RelPath;
58    char *RelDir;
59    char *Path;
60    char *FileName;
61    char *FileName_NoExt;
62    char *FullName;
63    char *FullName_NoSel;
64    char *Ext;
65    char *Prefix;
66    char *View;
67    char *TypeExt;
68    char *StorageModeName;
69    int   StorageMode;
70    char *NodeSelect;
71    char *ColSelect;
72    char *RowSelect;
73    char *RangeSelect;
74    int only_index;
75    int OnDisk;
76    unsigned long Size;
77    char *HeadName;
78    char *BrikName;
79    char *NameAsParsed;
80    char *cwdAsParsed;
81    char *ExistsAs;
82 }SUMA_PARSED_NAME;
83 
84 typedef struct {
85    char *envhelp;
86    char *envname;
87    char *envval;  /* This is the default */
88 }ENV_SPEC;
89 
90 typedef struct {
91    char *name;
92    char *help;
93    char *val;  /* This is the default */
94 }HELP_OPT;
95 
96 typedef struct {
97    char name[10][64]; /*Name of gui with lineage.
98                         E.g. for SurfCont->Coloring Controls->more
99                         [0] "SurfCont"
100                         [1] "Coloring Controls"
101                         [2] "more"
102                         [3] ""                     */
103    int name_lvl;
104    char hint[256];  /* Whatever is registered under "hint" */
105    char *help;  /* Whatever is registered under "help", this one
106                       will be a pointer copy so don't free it.*/
107    int type; /* 0 -- A container widget, not one to be pressed
108                 1 -- A regular widget */
109    void *w; /* A copy of the widget pointer... Is this wise?*/
110 }GUI_WIDGET_HELP;
111 
112 
113 /*! string stucture */
114 typedef struct {
115    int N_alloc;  /*!< space allocated for s */
116    char *s; /*!< string s */
117 } SUMA_STRING;
118 
119 
120 #define SUMA_Boolean byte
121 #define NOPE 0
122 #define YUP 1
123 
124 
125 #define SUMA_MAX_NAME_LENGTH 500   /*!< Maximum number of characters in a filename */
126 #define SUMA_MAX_DIR_LENGTH 2000    /*!< Maximum number of characters in a directory name */
127 #define SUMA_MAX_FILENAME_LENGTH (SUMA_MAX_NAME_LENGTH+SUMA_MAX_DIR_LENGTH+1)
128 #ifndef SUMA_IDCODE_LENGTH
129    #define SUMA_IDCODE_LENGTH 50
130 #endif
131 
132 #define SUMA_VERSION_VECTOR 20060703, 20041229, 20040610, 20040116, \
133                             20040106, -10000 /*!< modify this dude and you must update SUMA_New_Additions_perver
134                                        in SUMA_help.c.
135                                        Add to the left of the vector, leave the last value of -10000 untouched
136                                        If you like to think of floating point version numbers,divide by 10000
137                                        This define is stuck here so that non-SUMA DataSet manipulating programs
138                                        can use it, one hopes.
139                                        Numbering is yyyymmdd */
140 
141 /* Do not use SUMA_IS_NUM_E inside SUMA_IS_DIGIT_CHAR
142    See also SUMA_IS_DIGIT */
143 #define SUMA_IS_DIGIT_CHAR(s,n) (\
144    (isdigit(s[n]) || s[n] == '.' || s[n] == '-' || s[n] == '+') )
145 #define SUMA_IS_NUM_E(s, n) (\
146    (n > 0 && (s[n] == 'e' || s[n] == 'E') && SUMA_IS_DIGIT_CHAR(s,n-1)) )
147 #define SUMA_IS_NUM_CHAR(s,n) (SUMA_IS_DIGIT_CHAR(s,n) ||  SUMA_IS_NUM_E(s,n))
148 
149 
150 #define SUMA_EMPTY_ATTR "~"
151 #define AFNI_NI_CSS "~"
152 #define AFNI_NI_cSS '~'    /* AFNI's NIML Column String Separator (used to separate strings belonging to different columns of input)
153                               AFNI takes the niml attribute string and turns it into its internal attribute structure.
154                               AFNI_NI_CSS[0] is replaced by \0 and the string is broken into its per-column string list.
155                               That is not the case for BRICK_STATSYM which is treated as one ';' separated string that gets
156                               separately transformed into BRICK_STATAUX attribute entry in AFNI.
157                               This is somewhat confusing when viewing an AFNI dataset in NIML format because BRICK_STATSYM is of ni_type = "String"
158                               like say BRICK_LABS. However this makes sense in AFNI's format because these strings actually
159                               get transformed to attributes of different types in AFNI's internal format.
160                               SUMA will use the same separator for all attributes of ni_type = "String".
161                               Use Macros SUMA_2_AFNI_NI_PCS and AFNI_2_SUMA_NI_PCS if you need to change between SUMA- and AFNI-per-column-strings
162                               */
163 #define SUMA_NI_CSS ";"    /* SUMA's NIML  Per-Column-String Separator
164                               (used to separate strings belonging to
165                               different columns of input)  */
166 #define SUMA_NI_cSS ';'
167 
168 #define SUMA_2_AFNI_NI_PCS(a) {\
169    int m_i = 0; \
170    if ((a)) { while ((a)[m_i]) { if ((a)[m_i] == SUMA_NI_cSS) (a)[m_i] = AFNI_NI_cSS; ++m_i; } }\
171 }
172 
173 #define AFNI_2_SUMA_NI_PCS(a) {\
174    int m_i = 0; \
175    if ((a)) { while ((a)[m_i]) { if ((a)[m_i] == AFNI_NI_cSS) (a)[m_i] = SUMA_NI_cSS; ++m_i; } }\
176 }
177 
178 /*! macros to access pointers to elements in type double multiplexed vectors with mxv->fdf = 1;
179   \sa SUMA_NewMxVec*/
180 #define mxvdp4(mxv,i,j,k,l) ( mxv->dv + ( (int)(i) + (int)(j) * mxv->fdfm[0] + (int)(k) * mxv->fdfm[1] + (int)(l) * mxv->fdfm[2] ) )
181 #define mxvdp3(mxv,i,j,k)   ( mxv->dv + ( (int)(i) + (int)(j) * mxv->fdfm[0] + (int)(k) * mxv->fdfm[1]   ) )
182 #define mxvdp2(mxv,i,j  )   ( mxv->dv + ( (int)(i) + (int)(j) * mxv->fdfm[0]   ) )
183 #define mxvdp1(mxv,i  )     ( mxv->dv + ( (int)(i)   ) )
184 /*! macros to access elements in type double multiplexed vectors with mxv->fdf = 1;
185   \sa SUMA_NewMxVec*/
186 #define mxvd4(mxv,i,j,k,l) ( mxv->dv[( (int)(i) + (int)(j) * mxv->fdfm[0] + (int)(k) * mxv->fdfm[1] + (int)(l) * mxv->fdfm[2] )] )
187 #define mxvd3(mxv,i,j,k)   ( mxv->dv[( (int)(i) + (int)(j) * mxv->fdfm[0] + (int)(k) * mxv->fdfm[1]   )] )
188 #define mxvd2(mxv,i,j  )   ( mxv->dv[( (int)(i) + (int)(j) * mxv->fdfm[0]   )] )
189 #define mxvd1(mxv,i  )     ( mxv->dv[( (int)(i)   )] )
190 /*! macros to access elements in type complex multiplexed vectors with mxv->fdf = 1;
191   \sa SUMA_NewMxVec*/
192 #define mxvc4(mxv,i,j,k,l) ( mxv->cv[( (int)(i) + (int)(j) * mxv->fdfm[0] + (int)(k) * mxv->fdfm[1] + (int)(l) * mxv->fdfm[2] )] )
193 #define mxvc3(mxv,i,j,k)   ( mxv->cv[( (int)(i) + (int)(j) * mxv->fdfm[0] + (int)(k) * mxv->fdfm[1]   )] )
194 #define mxvc2(mxv,i,j  )   ( mxv->cv[( (int)(i) + (int)(j) * mxv->fdfm[0]   )] )
195 #define mxvc1(mxv,i  )     ( mxv->cv[( (int)(i)   )] )
196 
197 #define IN_MASK(mm,k) ( (!(mm) || (mm)[k]) )
198 
199 SUMA_MX_VEC *SUMA_FreeMxVec(SUMA_MX_VEC *mxv);
200 SUMA_MX_VEC *SUMA_NewMxVec(SUMA_VARTYPE tp, int N_dims, int *dims,
201                            byte first_dim_first);
202 char *SUMA_MxVec_Info (SUMA_MX_VEC *mxv, int detail, char *title);
203 void SUMA_ShowMxVec (SUMA_MX_VEC *mxv, int detail, FILE *out, char *title);
204 int SUMA_MxVecInit(SUMA_MX_VEC *mxv, void *val);
205 int SUMA_NewMxAllocVec(SUMA_MX_VEC *mxv) ;
206 SUMA_MX_VEC *SUMA_NewMxNullVec(SUMA_VARTYPE tp, int N_dims, int *dims,
207                                byte first_dim_first);
208 SUMA_MX_VEC *SUMA_VecToMxVec(SUMA_VARTYPE tp, int N_dims, int *dims,
209                               byte first_dim_first, void *vec);
210 
211 char * SUMA_to_lower(char *s) ;
212 int SUMA_filexists (char *f_name);
213 int SUMA_search_file(char **fnamep, char *epath);
214 char *SUMA_help_basics();
215 char *SUMA_help_cmap();
216 char *SUMA_help_talk();
217 char *SUMA_help_mask();
218 char *SUMA_help_dset();
219 int get_Domemtrace(void);
220 void set_Domemtrace(int s);
221 int get_Doiotrace(void);
222 void set_Doiotrace(int s) ;
223 int get_IgnoreXforms(void);
224 void setIgnoreXforms(int s) ;
225 void SUMA_process_environ(void);
226 int NoSumaRcFound (void);
227 void SUMA_ParseInput_basics_ns (char *argv[], int argc);
228 int SUMA_ParseInput_basics_eng (char *argv[], int argc);
229 void WorkErrLog_ns(void);
230 SUMA_FileName SUMA_StripPath (char *FileName);
231 SUMA_PARSED_NAME * SUMA_ParseFname (char *FileName, char *cwd);
232 SUMA_PARSED_NAME * SUMA_ParseFname_eng (char *FileName, char *ucwd,
233                                         int diskcheck);
234 SUMA_PARSED_NAME * SUMA_DuplicateParsedName(SUMA_PARSED_NAME *pn);
235 SUMA_PARSED_NAME * SUMA_ModifyParsedName (SUMA_PARSED_NAME *pn,
236                                           char *what, char *val);
237 char * SUMA_ModifyName(char *name, char *what, char *val, char *cwd);
238 SUMA_PARSED_NAME * SUMA_ParseModifyName(char *name,
239                                         char *what, char *val, char *cwd);
240 char *SUMA_Extension(char *filename, char *ext, SUMA_Boolean Remove);
241 SUMA_Boolean SUMA_isExtension(char *filename, char *ext);
242 char * SUMA_CropExtension(char *filename, char *ext);
243 void *SUMA_Free_Parsed_Name(SUMA_PARSED_NAME *Test);
244 char *SUMA_FnameGet(char *Fname, char *sel, char *cwd);
245 int SUMA_NumStringUnits (char *s, int marktip);
246 int SUMA_strtod(char *n, double *valp);
247 int SUMA_StringToNum (char *s, void *vv, int N, int p);
248 int SUMA_StringToNumSide (char *s, void *vv, int N, int p, int *sd);
249 int SUMA_isNumString (char *s, void *p);
250 int SUMA_CleanNumString (char *s, void *p);
251 int SUMA_CleanNumStringSide (char *s, void *p);
252 char *SUMA_copy_string(char *buf);
253 char * SUMA_replace_string(char *s1, char *s2);
254 char *SUMA_copy_quoted( char *s, char *eop,
255                         char q1, char q2, int deblank,
256                         int withquotes, int *is_closed );
257 char *args_in_quotes(char **argv, int *kar, int N_argv, char *opq,
258                      char *cloq, int clearused);
259 char *args_in_niml_quotes(char **argv, int *kar, int N_argv, int clearused);
260 char *args_in_simple_quotes(char **argv, int *kar, int N_argv, int clearused);
261 char * SUMA_append_string(char *s1, char *s2);
262 char * SUMA_append_extension(char *s1, char *s2);
263 char * SUMA_append_replace_string(char *s1, char *s2, char *Spc,int whichTofree);
264 char * SUMA_ar_string(char *s1, char *s2, char *Spc, int whichTofree);
265 char * SUMA_append_replace_string_eng(char *s1, char *s2, char *Spc,
266                                       int whichTofree, int cleanstart);
267 char * SUMA_append_replace_num(char *s1, char *form, double num,
268                                SUMA_VARTYPE tp, int whichTofree);
269 char * SUMA_truncate_string (char *s1, int length);
270 char *SUMA_set_string_length(char *buf, char cp, int n);
271 SUMA_STRING * SUMA_StringAppend (SUMA_STRING *SS, char *newstring);
272 SUMA_STRING * SUMA_StringAppend_va (SUMA_STRING *SS, char *newstring, ... );
273 
274 void SUMA_sigfunc(int sig);
275 char * SUMA_pad_string(char *buf, char cp, int n, int add2end);
276 NI_str_array *SUMA_free_NI_str_array(NI_str_array *nisa);
277 int SUMA_AddColAtt_CompString(NI_element *nel, int col, char *lbl,
278                               char *sep, int insert_mode);
279 
280 SUMA_Boolean SUMA_ShowParsedFname(SUMA_PARSED_NAME *pn, FILE *out);
281 
282 char *SUMA_isEnv(char *env, char *sval);
283 float SUMA_floatEnv(char *env, float defval);
284 ENV_SPEC SUMA_envlistelement(int i);
285 char * SUMA_EnvVal(char *env);
286 int SUMA_EnvEquals(char *env, char *sval, byte ci, char *sep);
287 
288 
289 int SUMA_NodeIndex_To_Index(int *NodeIndex, int N_Node, int n);
290 SUMA_Boolean SUMA_binSearch(float *nodeList, float target,int *seg, byte ematch);
291 int SUMA_binFind( float *indexList, int N_node, float target, byte ematch);
292 SUMA_Boolean SUMA_ibinSearch( int *indexList, int target, int *seg);
293 int SUMA_ibinFind( int *indexList, int N_node, int target);
294 int *SUMA_reorder(int *y, int *isort, int N_isort);
295 char **SUMA_sreorder(char **y, int *isort, int N_isort);
296 double *SUMA_dreorder(double *y, int *isort, int N_isort);
297 byte *SUMA_breorder(byte *y, int *isort, int N_isort);
298 float *SUMA_freorder(float *y, int *isort, int N_isort);
299 float *SUMA_freorder_triplets(float *y, int *isort, int N_isort);
300 char *SUMA_floats_to_string(float *rgba, int N, float scl, char *here, int *Err,
301                             char *sep, int MVf);
302 #define SUMA_RGBA_to_string SUMA_floats_to_string
303 float *SUMA_string_to_RGBA(char *s, float *here, float scl, int *Err);
304 #endif
305