Skip to content

AFNI/NIfTI Server

Sections
Personal tools
You are here: Home » AFNI » Documentation

Doxygen Source Code Documentation


Main Page   Alphabetical List   Data Structures   File List   Data Fields   Globals   Search  

niml_sucker.c File Reference

#include "niml_private.h"

Go to the source code of this file.


Data Structures

struct  NI_converterstruct

Functions

char * NI_self_idcode (void *nini)
void NI_suck_stream (char *sname, int msec, int *ndc, NI_objcontainer ***dc)
void NI_register_objconverters (char *self_name, NI_objconverter_func elm_to_obj, NI_objconverter_func obj_to_elm)
void NI_convert_elm_to_obj (NI_objcontainer *dc)

Variables

int num_converters = 0
NI_converterstructconverters = NULL

Function Documentation

void NI_convert_elm_to_obj NI_objcontainer   dc
 

See if we can convert an element to an object. On input:

  • dc->typename should be "NI_ELEMENT" or "NI_GROUP"
  • conversion is based on dc->self_name On output
  • dc->typename will be set to dc->self_name
  • data in dc->self_data will be altered, and the NIML element will have been destroyed -----------------------------------------------------------------------------

Definition at line 154 of file niml_sucker.c.

References IDCODE_LEN, NI_strncpy(), num_converters, NI_objcontainer::self_name, and NI_converterstruct::to_obj.

Referenced by NI_suck_stream().

00155 {
00156    int cc , nn ;
00157 
00158    if( dc == NULL ) return ;
00159 
00160    if( strcmp(dc->typename,"NI_ELEMENT") != 0 &&
00161        strcmp(dc->typename,"NI_GROUP"  ) != 0   ) return ;
00162 
00163    for( cc=0 ; cc < num_converters ; cc++ )
00164      if( strcmp(converters[cc].self_name,dc->self_name) == 0 ) break ;
00165 
00166    if( cc == num_converters ) return ;
00167 
00168    nn = converters[cc].to_obj( dc ) ;
00169    if( nn > 0 )
00170      NI_strncpy( dc->typename , dc->self_name , IDCODE_LEN ) ;
00171 
00172    return ;
00173 }

void NI_register_objconverters char *    self_name,
NI_objconverter_func    elm_to_obj,
NI_objconverter_func    obj_to_elm
 

Definition at line 118 of file niml_sucker.c.

References IDCODE_LEN, NI_objconverter_func, NI_strncpy(), num_converters, realloc, NI_converterstruct::to_elm, and NI_converterstruct::to_obj.

00121 {
00122    int cc ;
00123 
00124    if( self_name == NULL || *self_name == '\0' ) return ;
00125    if( elm_to_obj == (NI_objconverter_func)NULL  ) return ;
00126 
00127    for( cc=0 ; cc < num_converters ; cc++ )
00128      if( strcmp(converters[cc].self_name,self_name) == 0 ) break ;
00129 
00130    if( cc == num_converters ){
00131      num_converters++ ;
00132      converters = (NI_converterstruct *)
00133                     realloc( (void *)converters ,
00134                              sizeof(NI_converterstruct)*num_converters ) ;
00135    }
00136 
00137    NI_strncpy( converters[cc].self_name , self_name , IDCODE_LEN ) ;
00138    converters[cc].to_obj = elm_to_obj ;
00139    converters[cc].to_elm = obj_to_elm ;
00140    return ;
00141 }

char* NI_self_idcode void *    nini
 

Return a pointer to the idcode of a NIML element (group or data), if it has one. Otherwise, return NULL. Do not modify or free() this string, since it points into the NIML element struct. -----------------------------------------------------------------------------

Definition at line 9 of file niml_sucker.c.

References NI_get_attribute().

Referenced by NI_suck_stream().

00010 {
00011    char *rhs ;
00012    int ii ;
00013    static char *iname[] = { "self_idcode" ,
00014                             "AFNI_idcode" ,
00015                             "ni_idcode"   ,
00016                             "idcode"      ,
00017                             NULL           } ;
00018 
00019    for( ii=0 ; iname[ii] != NULL ; ii++ ){
00020      rhs = NI_get_attribute( nini , iname[ii] ) ;
00021      if( rhs != NULL ) return rhs ;
00022    }
00023 
00024    return NULL ;
00025 }

void NI_suck_stream char *    sname,
int    msec,
int *    ndc,
NI_objcontainer ***    dc
 

Open a stream, read all NIML stuff possible from it, close it.

  • Returns an array of (*ndc) object containers in (*dc).
  • Max time delay allowed at any I/O step is msec.
  • If (*ndc)==0 on return, then nothing good happened. -----------------------------------------------------------------------------

Definition at line 34 of file niml_sucker.c.

References calloc, free, IDCODE_LEN, NI_group::name, NI_element::name, NI_add_trusted_host(), NI_clock_time(), NI_convert_elm_to_obj(), NI_ELEMENT_TYPE, NI_element_type(), NI_GROUP_TYPE, NI_read_element(), NI_self_idcode(), NI_stream_closenow(), NI_stream_goodcheck(), NI_stream_open(), NI_strncpy(), realloc, NI_objcontainer::self_data, NI_objcontainer::self_idcode, and NI_objcontainer::self_name.

00035 {
00036    NI_stream ns ;
00037    int nn , start_msec=NI_clock_time() ;
00038    NI_objcontainer *mdc ;
00039    void *nini ;
00040    char *rhs ;
00041 
00042    /*-- startup and sanity checks --*/
00043 
00044    if( ndc == NULL ) return ;  /* clueless caller */
00045    *ndc = 0 ;                  /* number of objects found thus far */
00046    if( dc == NULL ) return ;   /* stupid caller */
00047    *dc = NULL ;                /* array of objects found thus far */
00048 
00049    ns = NI_stream_open( sname , "r" ) ;
00050    if( ns == NULL ) return ;                /* not so good */
00051 
00052    NI_add_trusted_host(NULL) ;
00053         if( msec == 0 ) msec = 1 ;                /* short waits */
00054    else if( msec <  0 ) msec = 999999999 ;        /* long waits */
00055 
00056    /*-- wait for connection to be good --*/
00057 
00058    nn = NI_stream_goodcheck( ns , msec ) ;
00059    if( nn <= 0 ){ NI_stream_closenow(ns); return; }
00060 
00061    /*-- loopback point to get a new NI element (group or data) --*/
00062 
00063  GetElement:
00064    nini = NI_read_element( ns , msec ) ;
00065    if( nini == NULL ){ NI_stream_closenow(ns); return; } /*** the way out ***/
00066 
00067    nn  = NI_element_type(nini) ;
00068    rhs = NI_self_idcode (nini) ;
00069    mdc = (NI_objcontainer *)calloc(1,sizeof(NI_objcontainer)) ;
00070 
00071    mdc->self_data = nini ;
00072    NI_strncpy( mdc->self_idcode , rhs , IDCODE_LEN ) ;
00073 
00074    if( nn == NI_ELEMENT_TYPE ){
00075      NI_element *nel = (NI_element *)nini ;
00076 
00077      NI_strncpy( mdc->typename  , "NI_ELEMENT" , IDCODE_LEN ) ;
00078      NI_strncpy( mdc->self_name , nel->name    , IDCODE_LEN ) ;
00079 
00080    } else if( nn == NI_GROUP_TYPE ){
00081      NI_group *ngr = (NI_group *)nini ;
00082 
00083      NI_strncpy( mdc->typename  , "NI_GROUP" , IDCODE_LEN ) ;
00084      NI_strncpy( mdc->self_name , ngr->name  , IDCODE_LEN ) ;
00085 
00086    } else {  /** should never happen */
00087 
00088      fprintf(stderr,"\n** ERROR: non-NIML data on stream '%s' !!\n",sname) ;
00089      free((void *)mdc) ;
00090      goto GetElement ;
00091 
00092    }
00093 
00094    /*-- add new element to output list --*/
00095 
00096    NI_convert_elm_to_obj( mdc ) ; /* convert to struct in-place, if possible */
00097 
00098    (*ndc)++ ;
00099    (*dc) = (NI_objcontainer **)realloc( (void *)(*dc) ,
00100                                          sizeof(NI_objcontainer *) * (*ndc) ) ;
00101    (*dc)[(*ndc)-1] = mdc ;
00102 
00103    goto GetElement ;
00104 }

Variable Documentation

NI_converterstruct* converters = NULL [static]
 

Definition at line 114 of file niml_sucker.c.

int num_converters = 0 [static]
 

Definition at line 113 of file niml_sucker.c.

Referenced by NI_convert_elm_to_obj(), and NI_register_objconverters().

 

Powered by Plone

This site conforms to the following standards: