Doxygen Source Code Documentation
niml_do.c File Reference
#include "niml_private.h"
Go to the source code of this file.
Typedefs | |
typedef void(* | ddfun )(char *, NI_stream_type *, NI_element *) |
Functions | |
void | NI_register_doer (char *verb, NI_voidfunc *func) |
int | NI_do (NI_stream_type *ns, NI_element *nel) |
Variables | |
int | doer_num = 0 |
char ** | doer_verb = NULL |
NI_voidfunc ** | doer_func = NULL |
Typedef Documentation
|
|
Function Documentation
|
Carry out an action ordered by a "ni_do" element received on the input stream. Actions we know about:
Definition at line 75 of file niml_do.c. References builtin(), doer_func, doer_num, doer_verb, NI_element::name, NI_ELEMENT_TYPE, NI_free, NI_get_attribute(), NI_rowtype_define(), NI_stream_close_keep(), NI_stream_open(), object, tt, and NI_element::type. Referenced by NI_read_element().
00076 { 00077 char *verb , *object ; 00078 int ii , builtin=0 ; 00079 00080 /*- check inputs for OK-ositiness -*/ 00081 00082 if( ns == NULL || nel == NULL || nel->type != NI_ELEMENT_TYPE ) return -1 ; 00083 00084 if( strcmp(nel->name ,"ni_do") != 0 && 00085 strcmp(nel->name+1,"ni_do") != 0 ) return -1 ; 00086 00087 /* 25 Apr 2005: check for diverse forms of the verb and object attributes */ 00088 00089 verb = NI_get_attribute( nel , "ni_verb" ) ; 00090 if( verb == NULL ) verb = NI_get_attribute( nel , "verb" ) ; 00091 00092 object = NI_get_attribute( nel , "ni_object" ) ; 00093 if( object == NULL ) object = NI_get_attribute( nel , "object" ) ; 00094 if( object == NULL ) object = NI_get_attribute( nel , "ni_obj" ) ; 00095 if( object == NULL ) object = NI_get_attribute( nel , "obj" ) ; 00096 00097 if( verb == NULL || verb[0] == '\0' ) return -1 ; /* need a verb; */ 00098 /* but not always */ 00099 /* need an object */ 00100 /*******************************************/ 00101 /*---- check for various builtin verbs ----*/ 00102 /*******************************************/ 00103 00104 if( strcmp(verb,"reopen_this") == 0 ){ /****----- reopen stream ------****/ 00105 00106 NI_stream_type *nsnew ; 00107 00108 if( object == NULL || object[0] == '\0' ) return -1 ; /* bad */ 00109 00110 nsnew = NI_stream_open( object , "r" ) ; /* open new stream */ 00111 if( nsnew == NULL ) return -1 ; /* bad */ 00112 00113 NI_stream_close_keep(ns,0) ; /* trash old stream */ 00114 *ns = *nsnew; NI_free(nsnew); /* replace old guts */ 00115 builtin = 1 ; 00116 00117 } /****------------------------- end reopen --------------------------*****/ 00118 00119 else if( strcmp(verb,"close_this") == 0 ){ /****-- close this stream -****/ 00120 00121 NI_stream_close_keep(ns,0); /* close and mark as dead */ 00122 builtin = 1 ; 00123 00124 } /****------------------------ end close_this ------------------------****/ 00125 00126 else if( strcmp(verb,"typedef") == 0 ){ /****-- define a NIML type -****/ 00127 /**** [12 Feb 2003] ****/ 00128 char tnam[256] , tdef[8200] ; 00129 int tt ; 00130 00131 if( object == NULL || object[0] == '\0' ) return -1 ; /* bad */ 00132 00133 tnam[0] = tdef[0] = '\0' ; 00134 sscanf(object,"%255s %8199s",tnam,tdef) ; 00135 tt = NI_rowtype_define( tnam , tdef ) ; 00136 if( tt < 0 ) return -1 ; /* bad definition */ 00137 builtin = 1 ; 00138 00139 } /****------------------------ end typedef ---------------------------****/ 00140 00141 /**************************************************************/ 00142 /**** Here, check for user-defined callbacks [12 Feb 2003] ****/ 00143 00144 for( ii=0 ; ii < doer_num ; ii++ ){ 00145 if( strcmp(verb,doer_verb[ii]) == 0 ){ 00146 if( doer_func[ii] != NULL ){ 00147 void (*df)(char *,NI_stream_type *,NI_element *) = (ddfun)doer_func[ii] ; 00148 df( object , ns , nel ) ; 00149 } 00150 return 0 ; 00151 } 00152 } 00153 00154 /*--- if we get here, we got a verb we don't recognize ---*/ 00155 00156 return ((builtin) ? 0 : -1) ; 00157 } |
|
Register a callback for a "ni_do" verb. [12 Feb 2003] The function will be called like so
However, you CAN register a callback for a builtin verb. The normal processing will take place, then the user callback will be invoked if that processing was good. [This feature was added on 30 Dec 2003.] ----------------------------------------------------------------------------- Definition at line 30 of file niml_do.c. References doer_func, doer_num, doer_verb, NI_realloc, NI_strdup(), and NI_voidfunc. Referenced by AFNI_init_niml(), and timeout_CB().
00031 { 00032 int ii ; 00033 00034 if( verb == NULL || *verb == '\0' ) return ; 00035 00036 /* see if verb already in table */ 00037 00038 for( ii=0 ; ii < doer_num ; ii++ ) 00039 if( strcmp(verb,doer_verb[ii]) == 0 ) break ; 00040 00041 /* if was in table, replace func (may be NULL) */ 00042 00043 if( ii < doer_num ){ 00044 doer_func[ii] = func ; return ; 00045 } 00046 00047 /* defining a new verb */ 00048 00049 if( func == NULL ) return ; /* quit if no func */ 00050 00051 /* expand tables of verbs and funcs */ 00052 00053 ii = doer_num++ ; 00054 00055 doer_verb = NI_realloc( doer_verb, char*, sizeof(char *)*doer_num ) ; 00056 doer_verb[ii] = NI_strdup(verb) ; 00057 00058 doer_func = NI_realloc( doer_func , NI_voidfunc*, sizeof(NI_voidfunc *)*doer_num ) ; 00059 doer_func[ii] = func ; 00060 return ; 00061 } |
Variable Documentation
|
Definition at line 7 of file niml_do.c. Referenced by NI_do(), and NI_register_doer(). |
|
Definition at line 5 of file niml_do.c. Referenced by NI_do(), and NI_register_doer(). |
|
Definition at line 6 of file niml_do.c. Referenced by NI_do(), and NI_register_doer(). |