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