00001 #ifndef SUMA_PARSECOMMANDS_INCLUDED
00002 #define SUMA_PARSECOMMANDS_INCLUDED
00003 
00004 
00005 #define SUMA_GENERIC_PROG_MAX_SURF 10  
00006 typedef struct {
00007    SUMA_SO_File_Type iType;
00008    char *sv_name;
00009    char *surf_names[SUMA_GENERIC_PROG_MAX_SURF];
00010    int N_surf;
00011    char *spec_file;
00012    char *in_name;
00013    char *surftype;
00014    char *out_prefix;   
00015    char *out_vol_prefix; 
00016    char out_vol_view[5];
00017    int out_vol_exists;
00018    char *out_grid_prefix; 
00019    char out_grid_view[5];
00020    int out_grid_exists;
00021    char *in_vol_prefix; 
00022    char in_vol_view[5];
00023    int in_vol_exists;
00024    int MaskMode;
00025    char *cmask;
00026    THD_3dim_dataset *in_vol;
00027    float VolCM[3];   
00028    double *mcdatav; 
00029    int debug;
00030    int ninmask;
00031    int fix_winding;
00032    float v0;
00033    float v1;
00034    int nvox;
00035    double *dvec;
00036    int obj_type;
00037    int obj_type_res;
00038    int xform;
00039    SUMA_SO_File_Format SurfFileFormat;
00040    SUMA_SO_File_Type SurfFileType;
00041    
00042    char *in_1D;  
00043    float *XYZ; 
00044    int N_XYZ;  
00045    
00046    float ExpFrac; 
00047    float Zt; 
00048    int N_it; 
00049    int Icold; 
00050    int NodeDbg; 
00051    float t;
00052    float tm;
00053    float t2;
00054    float t98;
00055    float r;
00056    float cog[3];
00057    float d1;
00058    float su1;
00059    float UseNew;
00060    float d4;
00061    float *ztv;
00062    int Kill98;
00063    int NoEyes;
00064    int NNsmooth;
00065    int smootheach;
00066    float avoid_vent;
00067    int smooth_end;
00068    int *k98mask;
00069    int k98maskcnt;
00070    float travstp;
00071    float *Stop;
00072    int MaxIntIter;
00073    int UseExpansion;
00074    float PercInt;
00075    int UseSkull;
00076    float bot_lztclip;
00077    float var_lzt;
00078    int send_hull;
00079    int DemoPause;
00080    int DoSpatNorm;
00081    float SpatNormDxyz;
00082    int WriteSpatNorm;
00083    int fillhole;
00084    THD_3dim_dataset *iset;
00085    FILE *dbg_eyenodes;
00086    float SpatShift[3];
00087    THD_3dim_dataset *OrigSpatNormedSet;   
00088    THD_3dim_dataset *in_edvol;
00089    float blur_fwhm;
00090    int iset_hand;
00091    
00092    int NearestNode;
00093    int NearestTriangle;
00094    int DistanceToMesh;
00095    int ProjectionOnMesh;
00096    int Data;
00097    
00098    char *in_nodeindices;
00099 } SUMA_GENERIC_PROG_OPTIONS_STRUCT;
00100 
00101 #define SUMA_MAX_SURF_ON_COMMAND 100
00102 #define SUMA_N_ARGS_MAX 1000
00103 
00104 typedef struct {
00105    
00106    char *spec_names[SUMA_MAX_SURF_ON_COMMAND];
00107    int N_spec_names;
00108    
00109    char *s_surfnames[SUMA_MAX_SURF_ON_COMMAND];
00110    char *s_surfprefix[SUMA_MAX_SURF_ON_COMMAND];
00111    char *s_surfpath[SUMA_MAX_SURF_ON_COMMAND];
00112    int s_N_surfnames;
00113    
00114    
00115    char *i_surfnames[SUMA_MAX_SURF_ON_COMMAND];
00116    char *i_surftopo[SUMA_MAX_SURF_ON_COMMAND];
00117    char *i_surfpath[SUMA_MAX_SURF_ON_COMMAND];
00118    char *i_surfprefix[SUMA_MAX_SURF_ON_COMMAND];
00119    char *i_state[SUMA_MAX_SURF_ON_COMMAND];
00120    char *i_group[SUMA_MAX_SURF_ON_COMMAND];
00121    int i_anatomical[SUMA_MAX_SURF_ON_COMMAND];
00122    int i_N_surfnames;
00123    SUMA_SO_File_Format i_FF[SUMA_MAX_SURF_ON_COMMAND];
00124    SUMA_SO_File_Type i_FT[SUMA_MAX_SURF_ON_COMMAND];
00125    
00126    
00127    char *ipar_surfnames[SUMA_MAX_SURF_ON_COMMAND];
00128    char *ipar_surftopo[SUMA_MAX_SURF_ON_COMMAND];
00129    char *ipar_surfpath[SUMA_MAX_SURF_ON_COMMAND];
00130    char *ipar_surfprefix[SUMA_MAX_SURF_ON_COMMAND];
00131    char *ipar_state[SUMA_MAX_SURF_ON_COMMAND];
00132    char *ipar_group[SUMA_MAX_SURF_ON_COMMAND];
00133    int ipar_anatomical[SUMA_MAX_SURF_ON_COMMAND];
00134    int ipar_N_surfnames;
00135    SUMA_SO_File_Format ipar_FF[SUMA_MAX_SURF_ON_COMMAND];
00136    SUMA_SO_File_Type ipar_FT[SUMA_MAX_SURF_ON_COMMAND];
00137    
00138    
00139    char *o_surfnames[SUMA_MAX_SURF_ON_COMMAND];
00140    char *o_surftopo[SUMA_MAX_SURF_ON_COMMAND];
00141    char *o_surfpath[SUMA_MAX_SURF_ON_COMMAND];
00142    char *o_surfprefix[SUMA_MAX_SURF_ON_COMMAND];
00143    char *o_state[SUMA_MAX_SURF_ON_COMMAND];
00144    char *o_group[SUMA_MAX_SURF_ON_COMMAND];
00145    int o_anatomical[SUMA_MAX_SURF_ON_COMMAND];
00146    int o_N_surfnames;
00147    SUMA_SO_File_Format o_FF[SUMA_MAX_SURF_ON_COMMAND];
00148    SUMA_SO_File_Type o_FT[SUMA_MAX_SURF_ON_COMMAND];
00149    
00150    
00151    char *t_surfnames[SUMA_MAX_SURF_ON_COMMAND];
00152    char *t_surftopo[SUMA_MAX_SURF_ON_COMMAND];
00153    char *t_surfpath[SUMA_MAX_SURF_ON_COMMAND];
00154    char *t_surfprefix[SUMA_MAX_SURF_ON_COMMAND];
00155    char *t_state[SUMA_MAX_SURF_ON_COMMAND];
00156    char *t_group[SUMA_MAX_SURF_ON_COMMAND];
00157    int t_anatomical[SUMA_MAX_SURF_ON_COMMAND];
00158    int t_N_surfnames;
00159    SUMA_SO_File_Format t_FF[SUMA_MAX_SURF_ON_COMMAND];
00160    SUMA_SO_File_Type t_FT[SUMA_MAX_SURF_ON_COMMAND];
00161    
00162    byte arg_checked[SUMA_N_ARGS_MAX];
00163    int N_args;
00164    char *sv[SUMA_MAX_SURF_ON_COMMAND];
00165    int N_sv;
00166    char *vp[SUMA_MAX_SURF_ON_COMMAND];
00167    int N_vp;
00168    
00169    
00170    SUMA_COMM_STRUCT *cs;
00171 
00172    
00173    byte accept_t;
00174    byte accept_s;
00175    byte accept_i;
00176    byte accept_ipar;
00177    byte accept_o;
00178    byte accept_spec;
00179    byte accept_sv;
00180    byte accept_talk_suma;
00181    byte check_input_surf;
00182 } SUMA_GENERIC_ARGV_PARSE;
00183 int  SUMA_GetNextCommand (char *S, char d, char term, char *Scom);
00184 SUMA_Boolean  SUMA_RegisterCommand(char *S, char d, char term, char *Scom, SUMA_Boolean Prepend);
00185 int SUMA_CommandCode(char *Scom);
00186 const char *SUMA_CommandString (SUMA_ENGINE_CODE code);
00187 SUMA_Boolean SUMA_RegisterEngineData (SUMA_EngineData *MTI, char *Fldname, void *FldValp, char *DestName, char *SourceName, SUMA_Boolean PassByPointer);
00188 SUMA_Boolean SUMA_FreeEngineData (SUMA_EngineData *MTI);
00189 SUMA_ENGINE_FIELD_CODE SUMA_EngineFieldCode(char *Scom);
00190 const char *SUMA_EngineFieldString (SUMA_ENGINE_FIELD_CODE i);
00191 SUMA_Boolean SUMA_ReleaseEngineData (SUMA_EngineData *MTI, char *Location);
00192 SUMA_Boolean SUMA_InitializeEngineData (SUMA_EngineData *MTI);
00193 int SUMA_EngineSourceCode (char *Scom);
00194 void SUMA_EngineSourceString (char *Scom, int ses_code);
00195 const char *SUMA_DomainKinships_String (SUMA_DOMAIN_KINSHIPS code);
00196 DList *SUMA_CreateList (void);
00197 SUMA_EngineData *SUMA_InitializeEngineListData (SUMA_ENGINE_CODE CommandCode);
00198 DListElmt * SUMA_RegisterEngineListCommand (DList *list, SUMA_EngineData * EngineData,  
00199                                              SUMA_ENGINE_FIELD_CODE Fld, void *FldValp, 
00200                                              SUMA_ENGINE_SOURCE Src, void *Srcp, SUMA_Boolean PassByPointer, 
00201                                              SUMA_ENGINE_INSERT_LOCATION InsertAt, DListElmt *Element);
00202 SUMA_Boolean SUMA_ReleaseEngineListElement (DList *list, DListElmt *element);
00203 DList * SUMA_DestroyList (DList *list);
00204 DList * SUMA_EmptyDestroyList (DList *list);
00205 void SUMA_FreeEngineListData(void *MTI);
00206 SUMA_ENGINE_CODE SUMA_GetListNextCommand (DList *list);
00207 void SUMA_ShowList (DList *list, FILE *Out);
00208 void SUMA_FreeMessageListData(void *Hv);
00209 SUMA_Boolean SUMA_ReleaseMessageListElement (DList *list, DListElmt *element) ;
00210 DList *SUMA_CreateMessageList (void);
00211 SUMA_Boolean SUMA_RegisterMessage ( DList *list, char *Message, char *Source, SUMA_MESSAGE_TYPES Type, SUMA_MESSAGE_ACTION Action);
00212 char *SUMA_BuildMessageLog (DList *ML);
00213 void SUMA_FreeActionStackData(void *asdata);
00214 DList *SUMA_CreateActionStack (void);
00215 void SUMA_ReleaseActionStackData (void *asdata);
00216 DList *SUMA_EmptyDestroyActionStack (DList *AS);
00217 const char *SUMA_ColMixModeString (SUMA_COL_MIX_MODE mode);
00218 SUMA_SO_File_Type SUMA_SurfaceTypeCode (char *cd);
00219 const char * SUMA_SurfaceTypeString (SUMA_SO_File_Type tp);
00220 SUMA_SO_File_Type SUMA_guess_surftype_argv(char *str);
00221 void *SUMA_strtol_vec(char *op, int nvals, int *nread, SUMA_VARTYPE vtp);
00222 SUMA_GENERIC_ARGV_PARSE *SUMA_CreateGenericArgParse(char *optflags);
00223 SUMA_GENERIC_ARGV_PARSE *SUMA_FreeGenericArgParse(SUMA_GENERIC_ARGV_PARSE *ps);
00224 char *SUMA_help_IO_Args(SUMA_GENERIC_ARGV_PARSE *opt);
00225 SUMA_GENERIC_ARGV_PARSE *SUMA_Parse_IO_Args (int argc, char *argv[], char *optflags);
00226 SUMA_GENERIC_PROG_OPTIONS_STRUCT * SUMA_Alloc_Generic_Prog_Options_Struct(void);
00227 SUMA_GENERIC_PROG_OPTIONS_STRUCT * SUMA_Free_Generic_Prog_Options_Struct(SUMA_GENERIC_PROG_OPTIONS_STRUCT *Opt);
00228 void *SUMA_AdvancePastNumbers(char *op, char **opend, SUMA_VARTYPE tp);
00229 
00230 
00231 
00232 
00233 
00234 
00235 
00236 
00237 
00238 
00239 
00240 
00241 
00242 
00243 #define SUMA_REGISTER_HEAD_COMMAND_NO_DATA(list, Command, Src, Srcp) {\
00244    SUMA_EngineData *ED_macro; \
00245    ED_macro = SUMA_InitializeEngineListData (Command);   \
00246    if (!SUMA_RegisterEngineListCommand (  list, ED_macro, \
00247                                           SEF_Empty, NULL,  \
00248                                           Src, (void *)Srcp, NOPE,   \
00249                                           SEI_Head, NULL)) {   \
00250       fprintf (SUMA_STDERR, "Error %s: Failed to register command.\n", FuncName);   \
00251    }  \
00252 }
00253 
00254 
00255 
00256 
00257 
00258 
00259 #define SUMA_REGISTER_TAIL_COMMAND_NO_DATA(list, Command, Src, Srcp) {\
00260    SUMA_EngineData *ED_macro; \
00261    ED_macro = SUMA_InitializeEngineListData (Command);   \
00262    if (!SUMA_RegisterEngineListCommand (  list, ED_macro, \
00263                                           SEF_Empty, NULL,  \
00264                                           Src, (void *)Srcp, NOPE,   \
00265                                           SEI_Tail, NULL)) {   \
00266       fprintf (SUMA_STDERR, "Error %s: Failed to register command.\n", FuncName);   \
00267    }  \
00268 }
00269 
00270 
00271 
00272 
00273 
00274 #define SUMA_L_Err(msg) {\
00275    SUMA_RegisterMessage (SUMAg_CF->MessageList, msg, FuncName, SMT_Error, SMA_Log); \
00276 }
00277 
00278 
00279 
00280 
00281 #define SUMA_S_Err(msg) {\
00282    fprintf (SUMA_STDERR, "Error %s (%s:%d):\n %s\n", FuncName, __FILE__ , __LINE__, msg);  \
00283 }
00284 
00285 
00286 
00287 
00288 #define SUMA_SL_Err(msg) {\
00289    SUMA_S_Err(msg);  \
00290    SUMA_L_Err(msg); \
00291 }
00292 
00293 
00294 
00295 
00296 #define SUMA_SLP_Err(msg) {\
00297    SUMA_S_Err(msg);  \
00298    SUMA_RegisterMessage (SUMAg_CF->MessageList, msg, FuncName, SMT_Error, SMA_LogAndPopup); \
00299 }
00300 
00301 
00302 
00303 
00304 
00305 #define SUMA_L_Note(msg) {\
00306    SUMA_RegisterMessage (SUMAg_CF->MessageList, msg, FuncName, SMT_Notice, SMA_Log); \
00307 }
00308 
00309 
00310 
00311 
00312 #define SUMA_S_Note(msg) {\
00313    fprintf (SUMA_STDERR, "Notice %s:\n %s\n", FuncName, msg);  \
00314 }
00315 
00316 
00317 
00318 
00319 #define SUMA_SL_Note(msg) {\
00320    fprintf (SUMA_STDERR, "Notice %s:\n %s\n", FuncName, msg);  \
00321    SUMA_RegisterMessage (SUMAg_CF->MessageList, msg, FuncName, SMT_Notice, SMA_Log); \
00322 }
00323 
00324 
00325 
00326 
00327 #define SUMA_SLP_Note(msg) {\
00328    fprintf (SUMA_STDERR, "Notice %s:\n %s\n", FuncName, msg);  \
00329    SUMA_RegisterMessage (SUMAg_CF->MessageList, msg, FuncName, SMT_Notice, SMA_LogAndPopup); \
00330 }
00331 
00332 
00333 
00334 
00335 
00336 #define SUMA_L_Text(msg) {\
00337    SUMA_RegisterMessage (SUMAg_CF->MessageList, msg, FuncName, SMT_Text, SMA_Log); \
00338 }
00339 
00340 
00341 
00342 
00343 #define SUMA_S_Text(msg) {\
00344    fprintf (SUMA_STDERR, "%s\n", msg);  \
00345 }
00346 
00347 
00348 
00349 
00350 #define SUMA_SL_Text(msg) {\
00351    fprintf (SUMA_STDERR, "%s\n", msg);  \
00352    SUMA_RegisterMessage (SUMAg_CF->MessageList, msg, FuncName, SMT_Text, SMA_Log); \
00353 }
00354 
00355 
00356 
00357 
00358 #define SUMA_SLP_Text(msg) {\
00359    fprintf (SUMA_STDERR, "%s\n", msg);  \
00360    SUMA_RegisterMessage (SUMAg_CF->MessageList, msg, FuncName, SMT_Text, SMA_LogAndPopup); \
00361 }
00362 
00363 
00364 
00365 
00366 
00367 #define SUMA_L_Warn(msg) {\
00368    SUMA_RegisterMessage (SUMAg_CF->MessageList, msg, FuncName, SMT_Warning, SMA_Log); \
00369 }
00370 
00371 
00372 
00373 
00374 #define SUMA_S_Warn(msg) {\
00375    fprintf (SUMA_STDERR, "Warning %s:\n %s\n", FuncName, msg);  \
00376 }
00377 
00378 
00379 
00380 
00381 #define SUMA_SL_Warn(msg) {\
00382    fprintf (SUMA_STDERR, "Warning %s:\n %s\n", FuncName, msg);  \
00383    SUMA_RegisterMessage (SUMAg_CF->MessageList, msg, FuncName, SMT_Warning, SMA_Log); \
00384 }
00385 
00386 
00387 
00388 
00389 #define SUMA_SLP_Warn(msg) {\
00390    fprintf (SUMA_STDERR, "Warning %s:\n %s\n", FuncName, msg);  \
00391    SUMA_RegisterMessage (SUMAg_CF->MessageList, msg, FuncName, SMT_Warning, SMA_LogAndPopup); \
00392 }
00393 
00394 
00395 
00396 
00397 
00398 #define SUMA_L_Crit(msg) {\
00399    SUMA_RegisterMessage (SUMAg_CF->MessageList, msg, FuncName, SMT_Critical, SMA_Log); \
00400 }
00401 
00402 
00403 
00404 
00405 #define SUMA_S_Crit(msg) {\
00406    fprintf (SUMA_STDERR, "Critical %s:\n %s\n", FuncName, msg);  \
00407 }
00408 
00409 
00410 
00411 
00412 #define SUMA_SL_Crit(msg) {\
00413    fprintf (SUMA_STDERR, "Critical %s:\n %s\n", FuncName, msg);  \
00414    SUMA_RegisterMessage (SUMAg_CF->MessageList, msg, FuncName, SMT_Critical, SMA_Log); \
00415 }
00416 
00417 
00418 
00419 
00420 #define SUMA_SLP_Crit(msg) {\
00421    fprintf (SUMA_STDERR, "Critical %s:\n %s\n", FuncName, msg);  \
00422    SUMA_RegisterMessage (SUMAg_CF->MessageList, msg, FuncName, SMT_Critical, SMA_LogAndPopup); \
00423 }
00424 
00425 #define SUMA_BEEP {  \
00426    if (SUMAg_SVv[0].X->TOPLEVEL) XBell (XtDisplay (SUMAg_SVv[0].X->TOPLEVEL), SUMA_BEEP_LENGTH_MS);  \
00427 }
00428 
00429 
00430 
00431 #define SUMA_LH(msg) {\
00432    if (LocalHead) fprintf (SUMA_STDERR, "%s (%s:%d):\n %s\n", FuncName, __FILE__, __LINE__,msg);  \
00433 }
00434 
00435 
00436 
00437 
00438 
00439 
00440 #define SUMA_IS_BLANK(c) ( ((c) == ' ' || (c) == '\t' || (c) == '\n' || (c) == '\v' || (c) == '\f' || (c) == '\r') ? 1 : 0 )
00441 
00442 
00443 
00444 
00445 
00446 
00447 #define SUMA_SKIP_BLANK(op, eop){  \
00448    while (*op != '\0' && op != eop && SUMA_IS_BLANK(*op)) ++op; \
00449 }
00450 #define SUMA_SKIP_LINE(op, eop){   \
00451    while (*op != '\0' && op != eop && *op != '\n' && *op != '\f' && *op != '\r') ++op; \
00452    SUMA_SKIP_BLANK(op, eop);\
00453 }
00454 #define SUMA_IS_COMMENT_LINE(opor, eop, cc, ans){   \
00455    char *m_op = opor;  \
00456    ans = 0;\
00457    SUMA_SKIP_BLANK(m_op, eop);\
00458    if (*m_op == cc) { ans = 1; } \
00459 }
00460 
00461 
00462 
00463 
00464 
00465 
00466 
00467 
00468 
00469 
00470 #define SUMA_SKIP_TO_NEXT_BLANK(op, eop){  \
00471    char m_quote_open = '\0';   \
00472    while (*op != '\0' && op !=eop && !( !m_quote_open && (*op == ' ' || *op == '\t' || *op == '\n' || *op == '\v' || *op == '\f' || *op == '\r')) ) { \
00473       if (*op == '"' || *op == '\'') {  \
00474          if (!m_quote_open) m_quote_open = *op; \
00475          else if (m_quote_open == *op) m_quote_open = '\0'; \
00476       }  \
00477       ++op; \
00478    }  \
00479 }
00480 
00481 
00482 
00483 
00484 
00485 
00486 
00487 
00488 
00489 
00490 #define SUMA_GET_BETWEEN_BLANKS(op, eop, op2){  \
00491    SUMA_SKIP_BLANK(op, eop);    \
00492    op2 = op;                  \
00493    SUMA_SKIP_TO_NEXT_BLANK(op2, eop);  \
00494 }
00495 
00496 
00497 
00498 
00499 
00500 
00501 
00502 
00503 
00504 
00505 
00506 
00507 
00508 
00509 #define SUMA_ADVANCE_PAST(op,eop,attr,Found,Word){ \
00510    int m_natr = strlen(attr); \
00511    char *m_bop = op;    \
00512    Found = 0;  \
00513    while (op < eop && *op != '\0' && Found < m_natr) { \
00514       if (*op == attr[Found]) {  \
00515           \
00516          ++Found; \
00517       } else {    \
00518          Found = 0;  \
00519       }  \
00520       ++op; \
00521       if (Word && Found == m_natr) { \
00522          if ( !(*op == '\0' || op == eop || SUMA_IS_BLANK(*op)) ) {  \
00523             Found = 0;   \
00524          } else {  \
00525             char *m_bef = op - m_natr - 1; \
00526             if ( !(m_bef < m_bop || SUMA_IS_BLANK(*m_bef)) ) {  \
00527                Found = 0;   \
00528             }  \
00529          }  \
00530       }  \
00531    }  \
00532    \
00533    if (Found != m_natr) { Found = 0; op = m_bop; } \
00534 }
00535 
00536 
00537 
00538 
00539 
00540 
00541 
00542 
00543 #define SUMA_ADVANCE_PAST_NUM(op, num, Found){\
00544    char *m_ope=NULL;    \
00545    Found = 0;  \
00546    num = strtod(op, &m_ope); \
00547    if (m_ope > op) {  \
00548       Found = 1; \
00549       op = m_ope; \
00550    } else { \
00551       num = 0;\
00552    }  \
00553 }
00554 
00555 
00556 
00557 
00558 
00559 #define SUMA_COPY_TO_STRING(op,op2,sval){   \
00560    int m_imax, m_i; \
00561    if (sval) { SUMA_SL_Err("sval must be null when macro is called"); } \
00562    else if (op2 > op) {   \
00563       m_imax = op2 - op;   \
00564       if (m_imax > 5000) {   SUMA_SL_Warn("Unexpectedly large field!"); } \
00565       sval = (char *)SUMA_calloc(m_imax + 2, sizeof(char));   \
00566       if (!sval) { SUMA_SL_Crit("Failed To Allocate"); } \
00567       else { for (m_i=0; m_i < m_imax; ++m_i) { sval[m_i] = op[m_i]; } sval[m_imax] = '\0'; }\
00568    }  \
00569 }
00570 
00571 
00572 
00573 #endif