1 #include "niml.h"
2 
3 /*************************************************************************/
4 /*** Compile with
5      gcc -O2 -o nimltest nimltest.c niml.c -I.                         ***/
6 /*************************************************************************/
7 
main(int argc,char * argv[])8 int main( int argc , char *argv[] )
9 {
10    NI_stream ns , nsout , nsf=NULL ;
11    int nn , tt , nopt=1 , bmode , tflag=0 ;
12    void *nini ;
13    char *ccc ;
14 
15    if( argc < 2 ){
16       printf("Usage: nimltest [-bB fname] [-w[r]] [-#] streamspec\n");exit(0);
17    }
18 
19 #if 0
20    for( nn=0 ; nn < 5 ; nn++ ){
21      ccc = UNIQ_idcode() ;
22      fprintf(stderr,"%d: %s\n",nn,ccc) ; free(ccc) ;
23    }
24    ccc = UNIQ_hashcode("Elvis") ;
25    fprintf(stderr,"   %s\n",ccc) ; free(ccc) ;
26 #endif
27 
28    /* writing to a stream? */
29 
30    if( strncmp(argv[1],"-w",2) == 0 ){
31       char lbuf[1024] , *bbb ;
32       int raw=(argv[1][2]=='r') ;
33       if( argc < 3 ) exit(1) ;
34       nopt = 2 ;
35       ns = NI_stream_open( argv[nopt] , "w" ) ;
36       if( ns == NULL ){
37          fprintf(stderr,"NI_stream_open fails\n") ; exit(1) ;
38       }
39       while(1){
40         nn = NI_stream_writecheck( ns , 400 ) ;
41         if( nn == 1 ){ fprintf(stderr,"\n") ; break ; }
42         if( nn <  0 ){ fprintf(stderr,"BAD writecheck\n"); exit(1) ; }
43         fprintf(stderr,".") ;
44       }
45       if( !raw ){
46         while(1){
47           fprintf(stderr,"READY> ") ;
48           bbb = fgets( lbuf , 1024 , stdin ) ; if( bbb == NULL ) exit(0) ;
49           nn = NI_stream_write( ns , lbuf , strlen(lbuf) ) ;
50           if( nn < 0 ){
51              fprintf(stderr,"NI_stream_write fails\n"); exit(1);
52           }
53         }
54       } else {
55         int nbyt ;
56         while(1){
57           nbyt = fread( lbuf , 1,1024 , stdin ) ;
58           if( nbyt <= 0 ){ NI_sleep(10) ; NI_stream_close(ns) ; exit(0) ; }
59           nn = NI_stream_write( ns , lbuf , nbyt ) ;
60           if( nn < 0 ){
61              fprintf(stderr,"NI_stream_write fails\n"); exit(1);
62           }
63         }
64       }
65    }
66 
67    if( strcmp(argv[1],"-b") == 0 || strcmp(argv[1],"-B") == 0 ){
68       char fname[256] ;
69       nopt = 3 ;
70       if( argc < 4 ){ fprintf(stderr,"Too few args\n"); exit(1); }
71 
72       sprintf(fname,"file:%s",argv[2]) ;
73       nsf = NI_stream_open( fname, "w" ) ;
74       if( nsf == NULL ) fprintf(stderr,"Can't open %s\n",fname) ;
75 
76       bmode = (strcmp(argv[1],"-b") == 0) ? NI_BINARY_MODE
77                                           : NI_BASE64_MODE ;
78    }
79 
80    if( strcmp(argv[nopt],"-#") == 0 ){
81      tflag = NI_HEADERSHARP_FLAG ; nopt++ ;
82    }
83 
84    /* reading! */
85 
86    NI_add_trusted_host(NULL) ;
87 
88    ns = NI_stream_open( argv[nopt] , "r" ) ;
89    if( ns == NULL ){
90       fprintf(stderr,"NI_stream_open fails\n") ; exit(1) ;
91    }
92    while(1){
93       nn = NI_stream_goodcheck( ns , 400 ) ;
94       if( nn == 1 ){ fprintf(stderr,"\n") ; break ; }
95       if( nn <  0 ){ fprintf(stderr,"BAD goodcheck\n"); exit(1) ; }
96       fprintf(stderr,".") ;
97    }
98 
99 GetElement:
100    nini = NI_read_element( ns , -1 ) ;  /* wait forever */
101    if( nini == NULL ){
102       if( NI_stream_goodcheck(ns,0) < 0 ){
103          fprintf(stderr,"NI_read_element fails\n") ; exit(1) ;
104       }
105       NI_sleep(999) ; goto GetElement ;
106    }
107 
108    tt = NI_element_type( nini ) ;
109 
110    if( tt == NI_ELEMENT_TYPE ){
111       NI_element *nel = (NI_element *) nini ;
112       fprintf(stderr,"Data element:\n"
113                      "  name       = %s\n"
114                      "  vec_num    = %d\n"
115                      "  vec_len    = %d\n"
116                      "  vec_filled = %d\n"
117                      "  vec_rank   = %d\n"
118                      "  attr_num   = %d\n" ,
119           nel->name,nel->vec_num,nel->vec_len,nel->vec_filled,
120           nel->vec_rank,nel->attr_num );
121        for( nn=0 ; nn < nel->attr_num ; nn++ )
122           fprintf(stderr,"  %2d: lhs=%s  rhs=%s\n",
123                   nn , nel->attr_lhs[nn] , nel->attr_rhs[nn] ) ;
124 
125 #if 0
126        for( nn=0 ; nn < nel->vec_rank ; nn++ ){
127           fprintf(stderr,"  axis[%d]: len=%d delta=%f origin=%f unit=%s label=%s\n",
128                   nn , nel->vec_axis_len[nn] ,
129                   (nel->vec_axis_delta)  ? nel->vec_axis_delta[nn]  : -666.0 ,
130                   (nel->vec_axis_origin) ? nel->vec_axis_origin[nn] : -666.0 ,
131                   (nel->vec_axis_unit)   ? nel->vec_axis_unit[nn]   : "NULL" ,
132                   (nel->vec_axis_label)  ? nel->vec_axis_label[nn]  : "NULL"  ) ;
133        }
134 #endif
135    } else if( tt == NI_GROUP_TYPE ){
136       NI_group *ngr = (NI_group *) nini ;
137       fprintf(stderr,"Group element:\n"
138                      "  part_num = %d\n"
139                      "  attr_num = %d\n" ,
140               ngr->part_num , ngr->attr_num ) ;
141        for( nn=0 ; nn < ngr->attr_num ; nn++ )
142           fprintf(stderr,"  %2d: lhs=%s  rhs=%s\n",
143                   nn , ngr->attr_lhs[nn] , ngr->attr_rhs[nn] ) ;
144 
145    } else if( tt == NI_PROCINS_TYPE ){
146       NI_procins *npi = (NI_procins *)nini ;
147       fprintf(stderr,"Processing instruction:\n"
148                      "  target = %s\n" , npi->name ) ;
149       for( nn=0 ; nn < npi->attr_num ; nn++ )
150          fprintf(stderr,"  %2d: lhs=%s  rhs=%s\n",
151                  nn , npi->attr_lhs[nn] , npi->attr_rhs[nn] ) ;
152    }
153 
154 #if 1
155    nsout = NI_stream_open( "str:" , "w" ) ;
156    if( nsout == NULL ){
157       fprintf(stderr,"NI_stream_open fails for output\n"); exit(1);
158    }
159 
160    nn = NI_write_element( nsout , nini , NI_TEXT_MODE | tflag ) ;
161 
162    fprintf(stderr,"\n------ NI_write_element = %d ------\n%s\n==========================\n" ,
163            nn, NI_stream_getbuf(nsout) ) ;
164    NI_stream_close(nsout) ;
165 #endif
166 
167    if( nsf != NULL ){
168       nn = NI_write_element( nsf , nini , bmode ) ;
169       fprintf(stderr,"NI_write_element to file = %d\n",nn) ;
170    }
171 
172    goto GetElement ;
173 }
174