Doxygen Source Code Documentation
niml_rowtype.c File Reference
#include "niml_private.h"Go to the source code of this file.
Data Structures | |
| struct | Qadgop_byte |
| struct | Qadgop_complex |
| struct | Qadgop_double |
| struct | Qadgop_float |
| struct | Qadgop_int |
| struct | Qadgop_pointer |
| struct | Qadgop_rgb |
| struct | Qadgop_rgba |
| struct | Qadgop_short |
Defines | |
| #define | ROWTYPE_OFFSET 1001 |
| #define | ROWTYPE_BASE_CODE (ROWTYPE_OFFSET-NI_NUM_BASIC_TYPES-1) |
| #define | ROWTYPE_is_builtin_code(cc) ((cc) >= 0 && (cc) < ROWTYPE_OFFSET) |
| #define | ROWTYPE_register(rr) |
| #define | ERREX(str) |
| #define | FREEUP |
| #define | ADDOUT |
| #define | FREEUP do{ NI_free(rt); NI_free(vsiz); NI_free(fsiz); } while(0) |
Functions | |
| void | NI_rowtype_debug (int n) |
| void | setup_basic_types (void) |
| int | NI_rowtype_define (char *tname, char *tdef) |
| NI_procins * | NI_rowtype_procins (NI_rowtype *rt) |
| NI_rowtype * | NI_rowtype_find_name (char *nn) |
| NI_rowtype * | NI_rowtype_find_code (int nn) |
| int | NI_rowtype_name_to_code (char *nn) |
| char * | NI_rowtype_code_to_name (int nn) |
| char * | NI_rowtype_code_to_alias (int nn) |
| int | NI_rowtype_name_to_size (char *nn) |
| int | NI_rowtype_code_to_size (int dtyp) |
| int | NI_rowtype_vsize (NI_rowtype *rt, void *dpt) |
| void | NI_val_to_text (NI_rowtype *rt, char *dpt, char *wbuf) |
| void | NI_multival_to_text (NI_rowtype *rt, int nv, char *dpt, char *wbuf) |
| int | NI_val_to_binary (NI_rowtype *rt, char *dpt, char *wbuf) |
| int | NI_multival_to_binary (NI_rowtype *rt, int nv, char *dpt, char *wbuf) |
| int | NI_has_String (NI_rowtype *rt) |
| int | NI_write_rowtype (NI_stream_type *ns, NI_rowtype *rt, int ndat, void *dat, int tmode) |
| int | NI_write_columns (NI_stream_type *ns, int col_num, int *col_typ, int col_len, void **col_dpt, int tmode) |
| int | NI_read_columns (NI_stream_type *ns, int col_num, int *col_typ, int col_len, void **col_dpt, int tmode, int flags) |
| int | NI_binary_to_val (NI_stream_type *ns, NI_rowtype *rt, void *dpt, int swap) |
| int | NI_base64_to_val (NI_stream_type *ns, NI_rowtype *rt, void *dpt, int swap) |
| int | NI_text_to_val (NI_stream_type *ns, NI_rowtype *rt, void *dpt, int ltend) |
| void | NI_swap_column (NI_rowtype *rt, int nrow, char *dat) |
| void | NI_free_column (NI_rowtype *rt, int col_len, void *cpt) |
| void * | NI_copy_column (NI_rowtype *rt, int col_len, void *cpt) |
| int | NI_size_column (NI_rowtype *rt, int col_len, void *cpt) |
Variables | |
| int | type_alignment [NI_NUM_BASIC_TYPES+1] |
| int | type_size [NI_NUM_BASIC_TYPES+1] |
| char * | type_name [NI_NUM_BASIC_TYPES+1] |
| char * | type_alias [NI_NUM_BASIC_TYPES+1] |
| int | pointer_alignment |
| int | pointer_size |
| Htable * | rowtype_table = NULL |
| NI_rowtype ** | rowtype_array = NULL |
| int | rowtype_num = 0 |
| int | ROWTYPE_debug = 0 |
Define Documentation
|
|
Value: if( nout < 0 ){ \ fprintf(stderr,"NIML:: write abort!\n"); \ FREEUP ; return -1 ; \ } else ntot+=nout |
|
|
Value: do { fprintf(stderr,"** NI_rowtype_define('%s','%s'): %s\n",tname,tdef,str); \ return -1 ; } while(0) Definition at line 205 of file niml_rowtype.c. Referenced by NI_rowtype_define(). |
|
|
|
|
|
Value: |
|
|
Used to set the code for each new user-defined type. (The '-1' is to allow for the String type, which isn't a basic type but is a builtin type.) Definition at line 63 of file niml_rowtype.c. Referenced by NI_rowtype_define(), NI_rowtype_find_code(), and NI_rowtype_find_name(). |
|
|
Check if a rowtype code is a derived type or a builtin type Definition at line 67 of file niml_rowtype.c. Referenced by NI_has_String(). |
|
|
Rowtype code for first user-defined type. Definition at line 57 of file niml_rowtype.c. Referenced by NI_rowtype_code_to_size(), NI_rowtype_find_code(), and NI_rowtype_find_name(). |
|
|
Value: do{ int nn ; \ if( rowtype_table == NULL ) setup_basic_types() ; \ addto_Htable( (rr)->name , (rr) , rowtype_table ) ; \ nn = rowtype_num + 1 ; \ rowtype_array = NI_realloc( rowtype_array , \ NI_rowtype*, \ sizeof(NI_rowtype *)*nn ); \ rowtype_array[nn-1] = rr ; rowtype_num = nn ; \ } while(0) Definition at line 71 of file niml_rowtype.c. Referenced by NI_rowtype_define(), and setup_basic_types(). |
Function Documentation
|
||||||||||||||||||||
|
Decode Base64 data from the NI_stream ns into a rowtype struct *dpt.
Definition at line 1680 of file niml_rowtype.c. References NI_rowtype::code, NI_free, NI_malloc, NI_stream_readbuf64(), NI_STRING, NI_swap4(), NI_rowtype::part_dim, NI_rowtype::part_num, NI_rowtype::part_off, NI_rowtype::part_rtp, NI_rowtype::psiz, ROWTYPE_is_varsize, ROWTYPE_part_dimen, NI_rowtype::size, and swap. Referenced by NI_read_columns().
01681 {
01682 int nn , jj ;
01683
01684 if( rt->code == NI_STRING ) return 0 ; /* shouldn't happen */
01685
01686 if( rt->size == rt->psiz ){ /* fixed-size type with no padding */
01687 /* ==> can read directly into data struct */
01688
01689 jj = NI_stream_readbuf64( ns , (char *)dpt , rt->size ) ;
01690 return (jj == rt->size) ;
01691
01692 } else { /* derived type */
01693
01694 char *dat = (char *)dpt , **aaa = NULL ;
01695 int ii , naaa = 0 , iaaa = 0 ;
01696
01697 if( ROWTYPE_is_varsize(rt) ){ /* variable dim arrays inside */
01698 for( naaa=ii=0 ; ii < rt->part_num ; ii++ )
01699 if( rt->part_dim[ii] >= 0 ) naaa++ ; /* count var dim arrays */
01700 if( naaa > 0 )
01701 aaa = NI_malloc(char*, sizeof(char *)*naaa) ; /* save their addresses */
01702 } /* for possible deletion later */
01703
01704 /* loop over parts and load them;
01705 set nn=0 if read fails at any part (and break out of read loop) */
01706
01707 for( nn=1,ii=0 ; ii < rt->part_num ; ii++ ){
01708
01709 if( rt->part_dim[ii] < 0 ){ /* read one fixed dim part */
01710
01711 nn = NI_base64_to_val( ns, rt->part_rtp[ii], dat+rt->part_off[ii], 0 );
01712
01713 } else { /* read var dim array */
01714
01715 char **apt = (char **)(dat+rt->part_off[ii]); /* data in struct */
01716 /* will be ptr to array */
01717 int dim = ROWTYPE_part_dimen(rt,dat,ii) ; /* dimension of part */
01718 int siz = rt->part_rtp[ii]->size ; /* size of one part */
01719
01720 if( swap ) NI_swap4( 1 , &dim ) ; /* byte-swap dim, which was */
01721 /* just read in a moment ago */
01722
01723 if( dim > 0 ){ /* need to get some data */
01724 *apt = NI_malloc(char, siz * dim ); /* make array */
01725
01726 if( siz != rt->part_rtp[ii]->psiz ){ /* padded values ==> */
01727 for( jj=0 ; jj < dim ; jj++ ){ /* read 1 val at a time */
01728 nn = NI_base64_to_val( ns, rt->part_rtp[ii],
01729 *apt + siz * jj , 0 ) ;
01730 if( !nn ) break ; /* bad read */
01731 }
01732
01733 } else { /* unpadded values ==> read all at once */
01734 jj = NI_stream_readbuf64( ns , *apt , siz*dim ) ;
01735 nn = ( jj == siz*dim ) ;
01736 }
01737
01738 } else {
01739 *apt = NULL ; /* dim=0 ==> no array needed */
01740 }
01741 aaa[iaaa++] = *apt ; /* save for possible deletion */
01742 /* if read fails later in loop */
01743 }
01744
01745 if( !nn ) break ; /* some read was bad */
01746 } /* end of loop over parts */
01747
01748 /* bad news ==> delete any allocated var dim arrays */
01749
01750 if( !nn ){
01751 for( ii=0 ; ii < iaaa ; ii++ ) NI_free( aaa[ii] ) ;
01752 }
01753 NI_free( aaa ) ; /* don't need list of var dim arrays no more */
01754 }
01755
01756 return nn ;
01757 }
|
|
||||||||||||||||||||
|
Decode binary data from the NI_stream ns into a rowtype struct *dpt.
Definition at line 1591 of file niml_rowtype.c. References NI_rowtype::code, NI_free, NI_malloc, NI_stream_readbuf(), NI_STRING, NI_swap4(), NI_rowtype::part_dim, NI_rowtype::part_num, NI_rowtype::part_off, NI_rowtype::part_rtp, NI_rowtype::psiz, ROWTYPE_is_varsize, ROWTYPE_part_dimen, NI_rowtype::size, and swap. Referenced by NI_read_columns().
01592 {
01593 int nn , jj ;
01594
01595 if( rt->code == NI_STRING ) return 0 ; /* shouldn't happen */
01596
01597 if( rt->size == rt->psiz ){ /* fixed-size type with no padding */
01598 /* ==> can read directly into data struct */
01599
01600 jj = NI_stream_readbuf( ns , (char *)dpt , rt->size ) ;
01601 return (jj == rt->size) ;
01602
01603 } else { /* derived type */
01604
01605 char *dat = (char *)dpt , **aaa = NULL ;
01606 int ii , naaa = 0 , iaaa = 0 ;
01607
01608 if( ROWTYPE_is_varsize(rt) ){ /* variable dim arrays inside */
01609 for( naaa=ii=0 ; ii < rt->part_num ; ii++ )
01610 if( rt->part_dim[ii] >= 0 ) naaa++ ; /* count var dim arrays */
01611 if( naaa > 0 )
01612 aaa = NI_malloc(char*, sizeof(char *)*naaa) ; /* save their addresses */
01613 } /* for possible deletion later */
01614
01615 /* loop over parts and load them;
01616 set nn=0 if read fails at any part (and break out of read loop) */
01617
01618 for( nn=1,ii=0 ; ii < rt->part_num ; ii++ ){
01619
01620 if( rt->part_dim[ii] < 0 ){ /* read one fixed dim part */
01621
01622 nn = NI_binary_to_val( ns, rt->part_rtp[ii], dat+rt->part_off[ii], 0 );
01623
01624 } else { /* read var dim array */
01625
01626 char **apt = (char **)(dat+rt->part_off[ii]); /* data in struct */
01627 /* will be ptr to array */
01628 int dim = ROWTYPE_part_dimen(rt,dat,ii) ; /* dimension of part */
01629 int siz = rt->part_rtp[ii]->size ; /* size of one part */
01630
01631 if( swap ) NI_swap4( 1 , &dim ) ; /* byte-swap dim, which was */
01632 /* just read in a moment ago */
01633
01634 if( dim > 0 ){ /* need to get some data */
01635 *apt = NI_malloc(char, siz * dim ); /* make array */
01636
01637 if( siz != rt->part_rtp[ii]->psiz ){ /* padded values ==> */
01638 for( jj=0 ; jj < dim ; jj++ ){ /* read 1 val at a time */
01639 nn = NI_binary_to_val( ns, rt->part_rtp[ii],
01640 *apt + siz * jj , 0 ) ;
01641 if( !nn ) break ; /* bad read */
01642 }
01643
01644 } else { /* unpadded values ==> read all at once */
01645 jj = NI_stream_readbuf( ns , *apt , siz*dim ) ;
01646 nn = ( jj == siz*dim ) ;
01647 }
01648
01649 } else {
01650 *apt = NULL ; /* dim=0 ==> no array needed */
01651 }
01652 aaa[iaaa++] = *apt ; /* save for possible deletion */
01653 /* if read fails later in loop */
01654 }
01655
01656 if( !nn ) break ; /* some read was bad */
01657 } /* end of loop over parts */
01658
01659 /* bad news ==> delete any allocated var dim arrays */
01660
01661 if( !nn ){
01662 for( ii=0 ; ii < iaaa ; ii++ ) NI_free( aaa[ii] ) ;
01663 }
01664 NI_free( aaa ) ; /* don't need list of var dim arrays no more */
01665 }
01666
01667 return nn ;
01668 }
|
|
||||||||||||||||
|
Copy a column of rowtype structs, including var dim arrays. Return is the pointer to the copy. ------------------------------------------------------------------------------ Definition at line 2042 of file niml_rowtype.c. References NI_malloc, NI_strdup(), NI_STRING, NI_rowtype::part_dim, NI_rowtype::part_num, NI_rowtype::part_off, NI_rowtype::part_rtp, NI_rowtype::part_typ, ROWTYPE_is_varsize, ROWTYPE_part_dimen, and NI_rowtype::size. Referenced by NI_add_column().
02043 {
02044 char *dat=(char *)cpt , *ndat , *nptr , *qpt ;
02045 int ii , jj , kk ;
02046
02047 if( rt == NULL || dat == NULL || col_len < 1 ) return NULL ;
02048
02049 /* make a quick (surface) copy */
02050
02051 ndat = NI_malloc(char, rt->size * col_len ) ; /* new data column */
02052 memcpy( ndat , dat , rt->size * col_len ) ; /* the quick copying */
02053
02054 /* copy any var dim arrays inside, since the pointers
02055 in ndat right now still point to data in dat,
02056 but we want ndat to be entirely self-contained! */
02057
02058 if( ROWTYPE_is_varsize(rt) ){
02059 for( ii=0 ; ii < col_len ; ii++ ){ /* loop over structs */
02060 nptr = ndat + rt->size * ii ; /* ptr to this struct */
02061 for( jj=0 ; jj < rt->part_num ; jj++ ){ /* loop over parts */
02062
02063 if( rt->part_typ[jj] == NI_STRING ){ /* a string part */
02064 char **apt = (char **)(nptr+rt->part_off[jj]) ; /* *apt => data */
02065 qpt = NI_strdup(*apt) ; *apt = qpt ;
02066 } else if( rt->part_dim[jj] >= 0 ){
02067 char **apt = (char **)(nptr+rt->part_off[jj]) ; /* *apt => data */
02068 if( *apt != NULL ){
02069 kk = ROWTYPE_part_dimen(rt,nptr,jj) * rt->part_rtp[jj]->size ;
02070 qpt = NI_malloc(char, kk) ; memcpy(qpt,*apt,kk) ; *apt = qpt ;
02071 }
02072 }
02073 }
02074 }
02075 }
02076
02077 return ndat ;
02078 }
|
|
||||||||||||||||
|
Delete a column of rowtype structs, including any var dim arrays. Assumes everything was allocated with NI_malloc(). After this is called, the cpt argument should be set to NULL. ---------------------------------------------------------------------------- Definition at line 2010 of file niml_rowtype.c. References NI_free, NI_STRING, NI_rowtype::part_dim, NI_rowtype::part_num, NI_rowtype::part_off, NI_rowtype::part_typ, ROWTYPE_is_varsize, and NI_rowtype::size. Referenced by NI_free_element().
02011 {
02012 char *dat=(char *)cpt , *ptr ;
02013 int ii , jj ;
02014
02015 if( rt == NULL || dat == NULL || col_len < 1 ) return ; /* nothing to do */
02016
02017 /* if has variable dim arrays inside, free them */
02018
02019 if( ROWTYPE_is_varsize(rt) ){
02020 for( ii=0 ; ii < col_len ; ii++ ){ /* loop over structs */
02021 ptr = dat + rt->size * ii ; /* pointer to this struct */
02022 for( jj=0 ; jj < rt->part_num ; jj++ ){ /* loop over parts */
02023 if( rt->part_typ[jj] == NI_STRING ||
02024 rt->part_dim[jj] >= 0 ){
02025 char **apt = (char **)(ptr+rt->part_off[jj]) ;
02026 NI_free(*apt) ; *apt = NULL ;
02027 }
02028 }
02029 }
02030 }
02031
02032 /* free the column array itself */
02033
02034 NI_free(cpt) ; return ;
02035 }
|
|
|
Return 1 if the type contains a String part, 0 if not. -------------------------------------------------------------------------- Definition at line 1033 of file niml_rowtype.c. References NI_rowtype::code, NI_STRING, NI_rowtype::part_num, NI_rowtype::part_rtp, and ROWTYPE_is_builtin_code. Referenced by NI_read_columns(), NI_write_columns(), and NI_write_element().
01034 {
01035 int ii , jj ;
01036
01037 if( rt == NULL ) return 0 ;
01038
01039 /* test #1: if a NIML builtin type, test if it is String */
01040
01041 if( ROWTYPE_is_builtin_code(rt->code) ) return (rt->code == NI_STRING) ;
01042
01043 /* test the parts */
01044
01045 for( ii=0 ; ii < rt->part_num ; ii++ ){
01046 if( ROWTYPE_is_builtin_code(rt->part_rtp[ii]->code) ){ /* builtin part */
01047 if( rt->part_rtp[ii]->code == NI_STRING ) return 1;
01048 } else { /* derived part */
01049 if( NI_has_String( rt->part_rtp[ii] ) ) return 1; /* recursion */
01050 }
01051 }
01052 return 0 ;
01053 }
|
|
||||||||||||||||||||
|
Copy nv fixed dim type values in binary format to the wbuf.
Definition at line 1010 of file niml_rowtype.c. References NI_val_to_binary(), NI_rowtype::psiz, and NI_rowtype::size. Referenced by NI_write_columns().
01011 {
01012 int jj=0 ;
01013
01014 if( rt->size == rt->psiz ){ /* fixed dim, unpadded structs */
01015 /* ==> Write all data at once */
01016 jj = nv * rt->size ;
01017 memcpy(wbuf,dpt,jj);
01018
01019 } else if( rt->psiz > 0 ){ /* Derived type is harder: */
01020 /* Write each struct separately */
01021 int ii ;
01022 for( ii=0 ; ii < nv ; ii++ )
01023 jj += NI_val_to_binary( rt , dpt+(ii*rt->size) , wbuf+jj ) ;
01024
01025 }
01026 return jj ;
01027 }
|
|
||||||||||||||||||||
|
Encode nv type values at the end of the text string wbuf. typ must be a fixed dim type code, or NI_STRING. --------------------------------------------------------------------------- Definition at line 967 of file niml_rowtype.c. References NI_val_to_text(), and NI_rowtype::size. Referenced by NI_write_columns().
00968 {
00969 int ii , jj=rt->size ;
00970
00971 for( ii=0 ; ii < nv ; ii++ )
00972 NI_val_to_text( rt , dpt+ii*jj , wbuf ) ;
00973 }
|
|
||||||||||||||||||||||||||||||||
|
Read "columns" of data from a NI_stream. Each column is an array of structs of some NI_rowtype (including the builtin types):
Definition at line 1411 of file niml_rowtype.c. References NI_stream_type::bad, flags, NI_BASE64_MODE, NI_base64_to_val(), NI_BINARY_MODE, NI_binary_to_val(), NI_dpr(), NI_free, NI_has_String(), NI_LTEND_MASK, NI_malloc, NI_realloc, NI_rowtype_find_code(), NI_stream_goodcheck(), NI_stream_hasinput(), NI_stream_readable(), NI_stream_readbuf(), NI_stream_readbuf64(), NI_swap_column(), NI_SWAP_MASK, NI_TEXT_MODE, NI_text_to_val(), NI_rowtype::psiz, ROWTYPE_is_varsize, NI_rowtype::size, and swap. Referenced by NI_read_element().
01414 {
01415 int ii,jj , row , dim , nin , col , nn ;
01416 char *ptr , **col_dat=(char **)col_dpt ;
01417
01418 NI_rowtype **rt=NULL ; /* array of NI_rowtype, 1 per column */
01419 int *vsiz=NULL , vsiz_tot=0 ;
01420 int *fsiz=NULL , fsiz_tot=0 ;
01421
01422 int (*ReadFun)( NI_stream_type *, NI_rowtype *, void *, int ) ;
01423 int ltend = (flags & NI_LTEND_MASK) != 0 ;
01424 int swap = (flags & NI_SWAP_MASK) != 0 ;
01425 int ReadFlag ;
01426 int open_ended = (col_len==0) , row_top ; /* 27 Mar 2003 */
01427
01428 # undef FREEUP
01429 # define FREEUP do{ NI_free(rt); NI_free(vsiz); NI_free(fsiz); } while(0)
01430
01431 /*-- check inputs --*/
01432
01433 if( col_num <= 0 || col_len < 0 ) return 0 ;
01434 if( col_typ == NULL || col_dat == NULL ) return -1 ;
01435 if( !NI_stream_readable(ns) ) return -1 ;
01436
01437 #ifdef NIML_DEBUG
01438 NI_dpr("ENTER NI_read_columns\n") ;
01439 #endif
01440
01441 /*-- check stream --*/
01442
01443 if( ns->bad ){ /* not connected yet? */
01444 jj = NI_stream_goodcheck(ns,666) ; /* try to connect it */
01445 if( jj < 1 ) return jj ; /* 0 is nothing yet, -1 is death */
01446 }
01447 jj = NI_stream_hasinput(ns,666) ; /* any data to be had? */
01448 if( jj < 0 ) return jj ; /* only exit if stream is actually bad */
01449
01450 /* create array of NI_rowtype for columns, etc. */
01451
01452 rt = NI_malloc(NI_rowtype*, sizeof(NI_rowtype *) * col_num ) ;
01453 vsiz = NI_malloc(int, sizeof(int) * col_num ) ;
01454 fsiz = NI_malloc(int, sizeof(int) * col_num ) ;
01455 if( open_ended ) col_len = 1 ;
01456 for( col=0 ; col < col_num ; col++ ){
01457
01458 rt[col] = NI_rowtype_find_code( col_typ[col] ) ;
01459 if( rt[col] == NULL ){ FREEUP; return -1; }
01460 if( tmode != NI_TEXT_MODE && NI_has_String(rt[col]) ){ FREEUP; return -1; }
01461
01462 vsiz[col] = ROWTYPE_is_varsize(rt[col]) ; /* variable dim type? */
01463 fsiz[col] = rt[col]->size ; /* fixed size of struct (w/padding) */
01464 vsiz_tot += vsiz[col] ;
01465 fsiz_tot += fsiz[col] ;
01466
01467 /* setup data array for this column */
01468
01469 if( col_dat[col] == NULL ){
01470 col_dat[col] = NI_malloc(char, fsiz[col]*col_len ) ; /* make space */
01471 } else {
01472 if( open_ended ){ FREEUP; return -1; }
01473 memset( col_dat[col], 0 , fsiz[col]*col_len ) ; /* set space to 0 */
01474 }
01475 }
01476
01477 /*-- Special (and fast) case:
01478 one compact (no padding) fixed-size rowtype,
01479 and binary input ==> can read all data direct from stream at once --*/
01480
01481 if( col_num == 1 &&
01482 fsiz[0] == rt[0]->psiz && /* struct size == data size */
01483 tmode == NI_BINARY_MODE &&
01484 !open_ended ){
01485
01486 nin = NI_stream_readbuf( ns , col_dat[0] , fsiz[0]*col_len ) ;
01487 if( nin < fsiz[0] ){ FREEUP; return (nin >= 0) ? 0 : -1 ; } /* bad */
01488 nin = nin / fsiz[0] ; /* number of rows finished */
01489 goto ReadFinality ; /* post-process input down below */
01490 }
01491
01492 /*-- 21 Apr 2005: repeat above for Base64 input --*/
01493
01494 if( col_num == 1 &&
01495 fsiz[0] == rt[0]->psiz && /* struct size == data size */
01496 tmode == NI_BASE64_MODE &&
01497 !open_ended ){
01498
01499 nin = NI_stream_readbuf64( ns , col_dat[0] , fsiz[0]*col_len ) ;
01500 if( nin < fsiz[0] ){ FREEUP; return (nin >= 0) ? 0 : -1 ; } /* bad */
01501 nin = nin / fsiz[0] ; /* number of rows finished */
01502 goto ReadFinality ; /* post-process input down below */
01503 }
01504
01505 /*-- Choose function to read from stream and fill one struct --*/
01506
01507 switch( tmode ){
01508 case NI_TEXT_MODE: ReadFun = NI_text_to_val ; ReadFlag = ltend; break;
01509 case NI_BINARY_MODE: ReadFun = NI_binary_to_val; ReadFlag = swap ; break;
01510 case NI_BASE64_MODE: ReadFun = NI_base64_to_val; ReadFlag = swap ; break;
01511 default:
01512 fprintf(stderr,"\n** NI_read_columns: unknown input tmode=%d\n",tmode);
01513 FREEUP ; return -1 ;
01514 }
01515
01516 /*-- OK, have to read the hard ways --*/
01517
01518 row_top = (open_ended) ? 1999999999 : col_len ; /* 28 Mar 2003 */
01519
01520 for( row=0 ; row < row_top ; row++ ){ /* loop over rows */
01521 /* until all done */
01522
01523 #ifdef NIML_DEBUG
01524 NI_dpr(" Starting row #%d\n",row) ;
01525 #endif
01526
01527 /* 27 Mar 2003: maybe need to extend length of columns */
01528
01529 if( open_ended && row >= col_len ){
01530 #ifdef NIML_DEBUG
01531 NI_dpr(" Extending column lengths!\n") ;
01532 #endif
01533 jj = (int)(1.2*col_len+32) ;
01534 for( col=0 ; col < col_num ; col++ ){
01535 col_dat[col] = NI_realloc( col_dat[col] , char, fsiz[col]*jj ) ;
01536 memset( col_dat[col]+fsiz[col]*col_len, 0 , fsiz[col]*(jj-col_len) ) ;
01537 }
01538 col_len = jj ;
01539 }
01540
01541 /* loop over columns, read into struct */
01542
01543 for( col=0 ; col < col_num ; col++ ){
01544 ptr = col_dat[col] + fsiz[col]*row ; /* ptr to row-th struct */
01545 nn = ReadFun( ns, rt[col], ptr, ReadFlag ) ; /* read data to struct */
01546 if( !nn ) break ;
01547 }
01548 if( !nn ) break ; /* some ReadFun() failed */
01549 }
01550
01551 if( row == 0 ){ /* didn't finish any rows */
01552 if( open_ended ){
01553 for( col=0 ; col < col_num ; col++ ) NI_free(col_dat[col]) ;
01554 }
01555 FREEUP; return -1;
01556 }
01557
01558 nin = row ; /* number of rows finished */
01559
01560 if( open_ended && nin < col_len ){ /* truncate columns */
01561 for( col=0 ; col < col_num ; col++ )
01562 col_dat[col] = NI_realloc( col_dat[col] , char, fsiz[col]*nin ) ;
01563 }
01564
01565 /*-- Have read all data; byte swap if needed, then get outta here --*/
01566
01567 ReadFinality:
01568
01569 if( tmode != NI_TEXT_MODE && swap ){
01570 for( col=0 ; col < col_num ; col++ )
01571 NI_swap_column( rt[col] , nin , col_dat[col] ) ;
01572 }
01573
01574 #ifdef NIML_DEBUG
01575 NI_dpr("Leaving NI_read_columns\n") ;
01576 #endif
01577
01578 FREEUP ; return nin ;
01579 }
|
|
|
Given a rowtype code, find its alias name. This is only valid for builtin types; for user-defined types, the return value is the user-supplied type name string. Don't free this string! ---------------------------------------------------------------------- Definition at line 776 of file niml_rowtype.c. References NI_NUM_BASIC_TYPES, NI_rowtype_code_to_name(), setup_basic_types(), and type_alias. Referenced by NI_type_name().
00777 {
00778 if( rowtype_table == NULL ) setup_basic_types() ;
00779 if( nn <= NI_NUM_BASIC_TYPES ) return type_alias[nn] ;
00780 return NI_rowtype_code_to_name( nn ) ;
00781 }
|
|
|
Given a rowtype code, find its string name. Returns NULL if the code isn't found in the rowtype table, otherwise returns the pointer to the name inside the table (i.e., don't free this string!). ---------------------------------------------------------------------- Definition at line 763 of file niml_rowtype.c. References NI_rowtype::name, and NI_rowtype_find_code(). Referenced by NI_rowtype_code_to_alias(), and NI_type_name().
00764 {
00765 NI_rowtype *rt = NI_rowtype_find_code( nn ) ;
00766 if( rt != NULL ) return rt->name ;
00767 return NULL ;
00768 }
|
|
|
Given a rowtype code, find its struct size in bytes. See also NI_rowtype_name_to_size(). ------------------------------------------------------------- Definition at line 806 of file niml_rowtype.c. References NI_rowtype_find_code(), ROWTYPE_OFFSET, setup_basic_types(), NI_rowtype::size, and type_size. Referenced by NI_type_size().
00807 {
00808 static int last_dtyp=-1 , last_size=-1 ; /* 12 Dec 2002 */
00809 NI_rowtype *rt ;
00810
00811 if( rowtype_table == NULL ) setup_basic_types() ;
00812 if( dtyp < 0 ) return -1 ;
00813 if( dtyp < ROWTYPE_OFFSET ) return type_size[dtyp] ;
00814 if( dtyp == last_dtyp ) return last_size ;
00815
00816 rt = NI_rowtype_find_code(dtyp) ;
00817 if( rt != NULL ){
00818 last_dtyp = dtyp; last_size = rt->size; return last_size;
00819 }
00820 return -1 ; /* bad */
00821 }
|
|
|
Set debug flag for rowtype stuff. Definition at line 89 of file niml_rowtype.c. References ROWTYPE_debug.
00089 { ROWTYPE_debug = n ; }
|
|
||||||||||||
|
Definition at line 266 of file niml_rowtype.c. References NI_rowtype::algn, NI_rowtype::code, NI_rowtype::comp_dim, NI_rowtype::comp_num, NI_rowtype::comp_typ, delete_rowtype, ERREX, NI_rowtype::flag, NI_rowtype::name, NI_decode_string_list(), NI_delete_str_array, NI_free, NI_INT, NI_is_name(), NI_malloc, NI_new, NI_realloc, NI_rowtype_find_code(), NI_rowtype_find_name(), NI_strdup(), NI_strncpy(), NI_str_array::num, NI_rowtype::part_dim, NI_rowtype::part_num, NI_rowtype::part_off, NI_rowtype::part_rtp, NI_rowtype::part_siz, NI_rowtype::part_typ, pointer_alignment, pointer_size, NI_rowtype::psiz, ROWTYPE_BASE_CODE, ROWTYPE_is_varsize, rowtype_num, ROWTYPE_register, ROWTYPE_VARSIZE_MASK, setup_basic_types(), NI_rowtype::size, NI_str_array::str, and NI_rowtype::userdef. Referenced by NI_do(), NI_rowtype_find_name(), SUMA_Create_CommonFields(), and SUMA_FakeIt().
00267 {
00268 NI_rowtype *rt , *qt ;
00269 int ii,jj , id,jd,kd,isdim,nn , almax,cbase,np,pb , last_size ;
00270 NI_str_array *sar ;
00271 char *tp,*sp,*bp , str[256] ;
00272
00273 /*-- check inputs --*/
00274
00275 if( !NI_is_name(tname) ) ERREX("bad typename") ;
00276 if( strlen(tname) > 255 ) ERREX("toolong typename") ;
00277 if( tdef == NULL || *tdef == '\0' ) ERREX("empty type definition") ;
00278
00279 /*-- create Htable of basic types, if not already defined --*/
00280
00281 if( rowtype_table == NULL ) setup_basic_types() ;
00282
00283 /*-- see if type name already defined --*/
00284 /*-- 25 Mar 2003: if it is, return the old code --*/
00285
00286 rt = NI_rowtype_find_name( tname ) ;
00287 if( rt != NULL ){
00288 if( strcmp(rt->userdef,tdef) != 0 ){
00289 fprintf(stderr,
00290 "++ NI_rowtype_define: illegal attempt to redefine type '%s'\n"
00291 "++ old definition: %s\n"
00292 "++ (failed) new definition: %s\n" ,
00293 tname , rt->userdef , tdef ) ;
00294 }
00295 return rt->code ;
00296 }
00297
00298 /*-- break defining string into components --*/
00299
00300 sar = NI_decode_string_list( tdef , ",;" ) ;
00301
00302 if( sar == NULL || sar->num < 1 ){
00303 NI_free(sar) ; ERREX("illegal definition") ;
00304 }
00305
00306 /*-- initialize the new rowtype --*/
00307
00308 rt = NI_new( NI_rowtype ) ;
00309 rt->name = NI_strdup( tname ) ;
00310 rt->userdef = NI_strdup( tdef ) ;
00311 rt->flag = 0 ;
00312
00313 /*-- loop over components in tdef, loading the new rt with their info --*/
00314
00315 rt->part_num = rt->comp_num = 0 ;
00316
00317 for( ii=0 ; ii < sar->num ; ii++ ){
00318
00319 tp = sar->str[ii] ;
00320 id = 0 ; kd = strlen(tp) ; /* type name of part will be in tp[id..kd-1] */
00321 if( kd == 0 ){
00322 delete_rowtype(rt); NI_delete_str_array(sar); ERREX("empty component name?");
00323 }
00324
00325 /* get count, if present, into jd */
00326
00327 sp = strchr(tp,'*') ; /* format of component string: count*type */
00328 bp = strchr(tp,'[') ; /* format of component string: type[count] */
00329
00330 if( sp != NULL || bp != NULL ){ /*** a count is present ***/
00331
00332 if( sp != NULL && bp != NULL ){ /* can't have both forms! */
00333 delete_rowtype(rt); NI_delete_str_array(sar); ERREX("two repeat counts?");
00334 }
00335
00336 if( sp != NULL ){ /* format: count*type */
00337 nn = 0 ; /* - count starts at nn */
00338 id = (sp-tp)+1 ; /* - type name starts at id */
00339 } else { /* format: type[count] */
00340 kd = (bp-tp) ; /* - type name ends at kd-1 */
00341 nn = kd+1 ; /* - count starts at nn */
00342 }
00343
00344 jd = -1 ;
00345 if( tp[nn] != '#' ){ /* count is a plain number */
00346 isdim = 0 ;
00347 sscanf( tp+nn , "%d" , &jd ) ;
00348 if( jd <= 0 ){
00349 delete_rowtype(rt); NI_delete_str_array(sar); ERREX("bad repeat number");
00350 }
00351 } else { /* count is a #reference */
00352 isdim = 1 ;
00353 sscanf( tp+nn+1 , "%d" , &jd ) ; /* ref must be to index */
00354 if( jd <= 0 || jd > ii ){ /* before this component */
00355 delete_rowtype(rt); NI_delete_str_array(sar); ERREX("bad #index");
00356 }
00357 if( rt->comp_typ[jd-1] != NI_INT || /* ref must be to an int */
00358 rt->comp_dim[jd-1] >= 0 ){ /* of fixed dim (1 int) */
00359 delete_rowtype(rt); NI_delete_str_array(sar); ERREX("non-int #index");
00360 }
00361 }
00362 } else {
00363 isdim = 0 ; jd = 1 ; /* default count of 1 */
00364 }
00365
00366 /* get the type of this component from its name */
00367
00368 if( kd-id < 1 || kd-id > 255 ){
00369 delete_rowtype(rt); NI_delete_str_array(sar); ERREX("toolong component name");
00370 }
00371
00372 NI_strncpy( str , tp+id , kd-id+1 ) ; /* copy component name into str */
00373 qt = NI_rowtype_find_name( str ) ; /* look it up in the table */
00374 if( qt == NULL ){
00375 delete_rowtype(rt); NI_delete_str_array(sar); ERREX("bad component type");
00376 }
00377
00378 if( !isdim ){ /*** fixed count: add jd copies of this component type ***/
00379
00380 rt->comp_typ = NI_realloc( rt->comp_typ, int, sizeof(int)*(rt->comp_num+jd) );
00381 rt->comp_dim = NI_realloc( rt->comp_dim, int, sizeof(int)*(rt->comp_num+jd) );
00382
00383 for( jj=0 ; jj < jd ; jj++ ){
00384 rt->comp_typ[rt->comp_num + jj] = qt->code ;
00385 rt->comp_dim[rt->comp_num + jj] = -1 ; /* fixed dim part */
00386 }
00387
00388 rt->comp_num += jd ; /* have more components now */
00389 rt->part_num += jd * qt->part_num ; /* have more parts now */
00390
00391 if( ROWTYPE_is_varsize(qt) ) /* if component is variable dim, */
00392 rt->flag |= ROWTYPE_VARSIZE_MASK ; /* mark rowtype as variable dim */
00393
00394 } else { /*** variable count: add 1 component that is a pointer */
00395 /*** to an array of fixed dim elements, */
00396 /*** dimension given in component #jd */
00397
00398 /* but can't have a var dim array of var dim arrays! */
00399
00400 if( ROWTYPE_is_varsize(qt) ){
00401 delete_rowtype(rt); NI_delete_str_array(sar);
00402 ERREX("variable dim array must have fixed dim type");
00403 }
00404
00405 rt->comp_typ = NI_realloc( rt->comp_typ, int, sizeof(int)*(rt->comp_num+1) );
00406 rt->comp_dim = NI_realloc( rt->comp_dim, int, sizeof(int)*(rt->comp_num+1) );
00407
00408 rt->comp_typ[rt->comp_num] = qt->code ; /* type this points to */
00409 rt->comp_dim[rt->comp_num] = jd-1 ; /* which component has */
00410 /* array dimension count */
00411 rt->comp_num ++ ; /* 1 more component */
00412 rt->part_num ++ ; /* and 1 more part */
00413
00414 rt->flag |= ROWTYPE_VARSIZE_MASK ; /* mark rowtype as variable dim */
00415
00416 }
00417
00418 } /* end of loop over components */
00419
00420 NI_delete_str_array(sar) ; /* done with this string array */
00421
00422 if( rt->part_num == 0 ){ delete_rowtype(rt); ERREX("no components?"); }
00423
00424 /*** now loop over components, breaking them down into their parts,
00425 storing the part types and their offsets into the C struct ***/
00426
00427 rt->part_off = NI_malloc(int, sizeof(int) * rt->part_num ) ;
00428 rt->part_typ = NI_malloc(int, sizeof(int) * rt->part_num ) ;
00429 rt->part_dim = NI_malloc(int, sizeof(int) * rt->part_num ) ;
00430 rt->part_siz = NI_malloc(int, sizeof(int) * rt->part_num ) ;
00431 rt->part_rtp = NI_malloc(NI_rowtype*, sizeof(NI_rowtype *) * rt->part_num ) ;
00432
00433 almax = 1 ; /* will be largest type_alignment of any part */
00434 cbase = 0 ; /* base offset into struct for next component */
00435 id = 0 ; /* part number we are about to work on */
00436
00437 for( ii=0 ; ii < rt->comp_num ; ii++ ){
00438
00439 /*** component is a ***/
00440 if( rt->comp_dim[ii] >= 0 ){ /*** variable dim array ***/
00441 /*** ==> store 1 pointer ***/
00442
00443 if( pointer_alignment > 1 ){ /* make sure cbase */
00444 jd = cbase % pointer_alignment ; /* is aligned OK */
00445 if( jd > 0 ) cbase += (pointer_alignment-jd) ;
00446 }
00447
00448 /* Note that this is the only case where a part_typ
00449 might end up as a derived type - normally, part_typ
00450 will be a builtin type code (NI_BYTE .. NI_STRING).
00451 Note the limitation that the type of variable dim
00452 arrays be a fixed dim type. */
00453
00454 rt->part_typ[id] = rt->comp_typ[ii] ;
00455 rt->part_off[id] = cbase ;
00456 rt->part_siz[id] = pointer_size ;
00457 rt->part_rtp[id] = NI_rowtype_find_code( rt->part_typ[id] ) ;
00458
00459 /* count number of parts before the dimension component into kd */
00460 /* so we can store the part index of this dimension component */
00461
00462 for( jd=kd=0 ; jd < rt->comp_dim[ii] ; jd++ ){
00463 if( rt->comp_dim[jd] >= 0 ){ /* this component is a pointer itself */
00464 kd++ ;
00465 } else { /* this component has fixed dim parts */
00466 qt = NI_rowtype_find_code( rt->comp_typ[jd] ) ;
00467 kd += qt->part_num ;
00468 }
00469 }
00470 rt->part_dim[id] = kd ; /* which part is the dimension of this part */
00471
00472 kd = pointer_alignment ;
00473 if( kd > almax ) almax = kd ;
00474
00475 id++ ; cbase += pointer_size ;
00476
00477 } else { /*** fixed dim type, possibly with multiple parts ***/
00478
00479 qt = NI_rowtype_find_code( rt->comp_typ[ii] ) ; /* component type */
00480
00481 /* adjust cbase upward if this component isn't properly aligned */
00482
00483 if( qt->algn > 1 ){
00484 jd = cbase % qt->algn ;
00485 if( jd > 0 ) cbase += (qt->algn-jd) ;
00486 }
00487
00488 pb = id ; /* part base index for this component */
00489 np = qt->part_num ; /* number of parts to add here */
00490
00491 rt->part_typ[id] = qt->part_typ[0] ; /* first part from component */
00492 rt->part_off[id] = cbase ; /* goes at the current base */
00493 rt->part_dim[id] = -1 ; /* 1st part cannot be variable dim array */
00494 rt->part_rtp[id] = NI_rowtype_find_code( rt->part_typ[id] ) ;
00495
00496 kd = rt->part_rtp[id]->algn ; /* alignment of part */
00497 if( kd > almax ) almax = kd ; /* keep track of largest alignment */
00498
00499 last_size = rt->part_rtp[id]->size ; /* size of 1st part */
00500 rt->part_siz[id] = last_size ;
00501
00502 id++ ; /* prepare to add next part */
00503
00504 /* loop over rest of parts from this component */
00505
00506 for( jj=1 ; jj < np ; jj++,id++ ){
00507
00508 rt->part_typ[id] = qt->part_typ[jj] ; /* type of new part */
00509 rt->part_rtp[id] = NI_rowtype_find_code( rt->part_typ[id] ) ;
00510
00511 if( qt->part_dim[jj] < 0 ){ /******* fixed dim part **/
00512
00513 nn = last_size ; /* # bytes in last part */
00514 jd = rt->part_off[id-1] ; /* offset of last part */
00515 kd = rt->part_rtp[id]->algn ; /* how to align new part */
00516 if( kd > almax ) almax = kd ; /* keep track of largest alignment */
00517
00518 nn += jd ; /* next available byte = sum of last offset and size */
00519 if( kd > 1 ){ /* must move nn up if */
00520 jd = nn % kd ; /* not on exact multiple */
00521 if( jd > 0 ) nn += (kd-jd) ; /* of jj bytes alignment */
00522 }
00523 rt->part_off[id] = nn ;
00524 rt->part_dim[id] = -1 ; /* mark as fixed dim part */
00525
00526 last_size = rt->part_rtp[id]->size ; /* size of this part */
00527 rt->part_siz[id] = last_size ;
00528
00529 } else { /***** variable dim array part **/
00530
00531 nn = last_size ;
00532 jd = rt->part_off[id-1] ;
00533 kd = pointer_alignment ; /* we are storing a pointer here */
00534 if( kd > almax ) almax = kd ;
00535 nn += jd ;
00536 if( kd > 1 ){
00537 jd = nn % kd ;
00538 if( jd > 0 ) nn += (kd-jd) ;
00539 }
00540 rt->part_off[id] = nn ;
00541 last_size = pointer_size ;
00542 rt->part_siz[id] = last_size ;
00543
00544 /* qt->part_dim[jj] is the part index in qt
00545 of the dimension for this variable dim array part;
00546 we must convert that to a part index in the new rowtype */
00547
00548 rt->part_dim[id] = pb + qt->part_dim[jj] ;
00549
00550 }
00551
00552 } /* end of loop over parts within this component */
00553
00554 /* now move the base offset up by the size of the current
00555 component (which may be bigger than the sum of its parts) */
00556
00557 cbase += qt->size ;
00558
00559 } /* end of fixed dim component part-izing */
00560
00561 } /* end of loop over components */
00562
00563 /* now compute the overall size of this new rowtype:
00564 at this point,
00565 cbase = next byte offset available after last part;
00566 this would be the size, but may have to be pushed
00567 up to allow for byte alignment of this rowtype */
00568
00569 rt->algn = almax ;
00570 if( rt->algn > 1 ){
00571 jd = cbase % rt->algn ;
00572 if( jd > 0 ) cbase += (rt->algn-jd) ;
00573 }
00574 rt->size = cbase ; /* this size is the sizeof(struct),
00575 and doesn't include var dim arrays or
00576 Strings, just the pointers to those things */
00577
00578 /* 26 Dec 2002: Compute the sum of the part sizes
00579 (zero if this has variable dim arrays).
00580 If rt->psiz == rt->size, then
00581 struct is stored without padding bytes. */
00582
00583 rt->psiz = 0 ;
00584 if( !ROWTYPE_is_varsize(rt) ){
00585 for( ii=0 ; ii < rt->part_num ; ii++ )
00586 rt->psiz += rt->part_siz[ii] ;
00587 }
00588
00589 /* 28 Oct 2004: Move assignment of the new rowtype code to the end,
00590 since a recursive call via NI_rowtype_find_name()
00591 might have created a new rowtype before this one.
00592 An example definition: "int,VECTOR_float_32,int". */
00593
00594 rt->code = ROWTYPE_BASE_CODE + rowtype_num ;
00595
00596 /** debugging printouts **/
00597
00598 if( ROWTYPE_debug ){
00599 fprintf(stderr,"\n") ;
00600 fprintf(stderr,"NI_rowtype_define: '%s' = '%s'\n",tname,tdef) ;
00601 fprintf(stderr," code = %d\n",rt->code) ;
00602 fprintf(stderr," size = %d\n",rt->size) ;
00603 fprintf(stderr," psiz = %d\n",rt->psiz) ;
00604 fprintf(stderr," algn = %d\n",rt->algn) ;
00605 fprintf(stderr," flag = %d\n",rt->flag) ;
00606
00607 fprintf(stderr," comp_num = %d\n",rt->part_num) ;
00608
00609 fprintf(stderr," comp_typ = " ) ;
00610 for( ii=0 ; ii < rt->comp_num ; ii++ ) fprintf(stderr,"%4d ",rt->comp_typ[ii]) ;
00611 fprintf(stderr,"\n") ;
00612
00613 fprintf(stderr," comp_dim = " ) ;
00614 for( ii=0 ; ii < rt->comp_num ; ii++ ) fprintf(stderr,"%4d ",rt->comp_dim[ii]) ;
00615 fprintf(stderr,"\n") ;
00616
00617 fprintf(stderr," part_num = %d\n",rt->part_num) ;
00618
00619 fprintf(stderr," part_typ = " ) ;
00620 for( ii=0 ; ii < rt->part_num ; ii++ ) fprintf(stderr,"%4d ",rt->part_typ[ii]) ;
00621 fprintf(stderr,"\n") ;
00622
00623 fprintf(stderr," part_off = " ) ;
00624 for( ii=0 ; ii < rt->part_num ; ii++ ) fprintf(stderr,"%4d ",rt->part_off[ii]) ;
00625 fprintf(stderr,"\n") ;
00626
00627 fprintf(stderr," part_siz = " ) ;
00628 for( ii=0 ; ii < rt->part_num ; ii++ ) fprintf(stderr,"%4d ",rt->part_siz[ii]) ;
00629 fprintf(stderr,"\n") ;
00630
00631 fprintf(stderr," part_dim = " ) ;
00632 for( ii=0 ; ii < rt->part_num ; ii++ ) fprintf(stderr,"%4d ",rt->part_dim[ii]) ;
00633 fprintf(stderr,"\n") ;
00634 }
00635
00636 /* save this in the table of rowtypes,
00637 and return the numerical code for this new type */
00638
00639 ROWTYPE_register(rt) ;
00640 return rt->code ;
00641 }
|
|
|
Find a rowtype by its integer code. Definition at line 735 of file niml_rowtype.c. References ROWTYPE_BASE_CODE, rowtype_num, ROWTYPE_OFFSET, and setup_basic_types(). Referenced by NI_add_column(), NI_add_column_stride(), NI_alter_veclen(), NI_fill_column_stride(), NI_free_element(), NI_insert_value(), NI_read_columns(), NI_rowtype_code_to_name(), NI_rowtype_code_to_size(), NI_rowtype_define(), NI_write_columns(), NI_write_element(), and SUMA_MaskedCopyofDset().
00736 {
00737 if( nn < 0 ) return NULL ;
00738 if( rowtype_table == NULL ) setup_basic_types() ;
00739 if( nn >= ROWTYPE_OFFSET ) nn = nn - ROWTYPE_BASE_CODE ;
00740 if( nn < 0 || nn >= rowtype_num ) return NULL ;
00741 return rowtype_array[nn] ;
00742 }
|
|
|
Find a rowtype by its name. 19 Feb 2003: or its alias. 28 Oct 2004: If name is of form VECTOR_basictype_length, then a new rowtype is created on the spot; e.g., "VECTOR_float_32" is like "float[32]". Definition at line 670 of file niml_rowtype.c. References findin_Htable(), NI_NUM_BASIC_TYPES, NI_rowtype_define(), ROWTYPE_BASE_CODE, ROWTYPE_OFFSET, setup_basic_types(), tt, type_alias, and type_name. Referenced by NI_rowtype_define(), NI_rowtype_name_to_code(), and NI_rowtype_name_to_size().
00671 {
00672 NI_rowtype *rt ; int ii ;
00673 static int busy=0 ; /* 28 Oct 2004: prevent recursion */
00674
00675 if( nn == NULL || *nn == '\0' ) return NULL ;
00676 if( rowtype_table == NULL ) setup_basic_types() ;
00677 rt = (NI_rowtype *) findin_Htable(nn,rowtype_table) ;
00678 if( rt != NULL ) return rt ;
00679
00680 /* 19 Feb 2003: linear search for basic type alias */
00681
00682 for( ii=0 ; ii <= NI_NUM_BASIC_TYPES ; ii++ )
00683 if( strcmp(type_alias[ii],nn) == 0 ) return rowtype_array[ii] ;
00684
00685 /*-- 28 Oct 2004: Define fixed size vector types here and now:
00686 format of nn must be VECTOR_basictype_length --*/
00687
00688 if( busy ) return NULL ; /* cannot allow re-entry below here! */
00689
00690 ii = strlen(nn) ;
00691 if( ii < 12 || strncmp(nn,"VECTOR_",7) != 0 || strchr(nn+7,'_') == NULL )
00692 return NULL ;
00693
00694 { char bt[32] , rt[64] ; int tt , dd ;
00695
00696 /* extract basic type name (after "VECTOR_") into bt array */
00697
00698 for( ii=7 ; ii < 32 && nn[ii] != '\0' && nn[ii] != '_' ; ii++ )
00699 bt[ii-7] = nn[ii] ;
00700 if( nn[ii] != '_' ) return NULL ; /* bad end of basic type name */
00701 bt[ii-7] = '\0' ; /* terminate with NUL byte */
00702
00703 /* find bt name in basic type name list (or alias list) */
00704
00705 for( tt=0 ; tt <= NI_NUM_BASIC_TYPES ; tt++ )
00706 if( strcmp(type_name[tt],bt) == 0 ) break ;
00707
00708 if( tt > NI_NUM_BASIC_TYPES ){
00709 for( tt=0 ; tt <= NI_NUM_BASIC_TYPES ; tt++ )
00710 if( strcmp(type_alias[tt],bt) == 0 ) break ;
00711 if( tt > NI_NUM_BASIC_TYPES ) return NULL ;
00712 }
00713
00714 /* find dimension after the nn[ii] character, which is '_' */
00715
00716 dd = 0 ; sscanf( nn+ii+1 , "%d" , &dd ) ;
00717 if( dd <= 0 ) return NULL ;
00718
00719 /* ready to create a new rowtype now */
00720
00721 sprintf(rt,"%s[%d]",type_name[tt],dd) ;
00722
00723 busy = 1 ; /* prevent recursion!!! */
00724 tt = NI_rowtype_define( nn , rt ) ;
00725 busy = 0 ;
00726 if( tt >= ROWTYPE_OFFSET ) return rowtype_array[tt-ROWTYPE_BASE_CODE] ;
00727 }
00728
00729 return NULL ;
00730 }
|
|
|
Given a rowtype name, find its integer code. Returns -1 if the name isn't found in the rowtype table. ---------------------------------------------------------------------- Definition at line 749 of file niml_rowtype.c. References NI_rowtype::code, and NI_rowtype_find_name(). Referenced by decode_type_field().
00750 {
00751 NI_rowtype *rt = NI_rowtype_find_name( nn ) ;
00752 if( rt != NULL ) return rt->code ;
00753 return -1 ;
00754 }
|
|
|
Given a rowtype name, find its struct size in bytes.
Definition at line 794 of file niml_rowtype.c. References NI_rowtype_find_name(), and NI_rowtype::size.
00795 {
00796 NI_rowtype *rt = NI_rowtype_find_name( nn ) ;
00797 if( rt != NULL ) return rt->size ;
00798 return -1 ;
00799 }
|
|
|
Make an 'ni_do' element that defines a given rowtype. Definition at line 646 of file niml_rowtype.c. References NI_rowtype::name, NI_free, NI_malloc, NI_new_processing_instruction(), NI_set_attribute(), and NI_rowtype::userdef.
00647 {
00648 NI_procins *npi ;
00649 char *rhs ;
00650
00651 if( rt == NULL ) return NULL ;
00652
00653 npi = NI_new_processing_instruction( "ni_do" ) ;
00654 NI_set_attribute( npi , "ni_verb" , "typedef" ) ;
00655
00656 rhs = NI_malloc(char,strlen(rt->name)+strlen(rt->userdef)+4) ;
00657 sprintf( rhs , "%s %s" , rt->name , rt->userdef ) ;
00658 NI_set_attribute( npi , "ni_object" , rhs ) ;
00659 NI_free( rhs ) ;
00660 return npi ;
00661 }
|
|
||||||||||||
|
Compute the size of all the data in a struct defined in a NI_rowtype (not including padding), for this instance of the struct, allowing for variable array parts. Zero is returned if something bad happens. ------------------------------------------------------------------------- Definition at line 830 of file niml_rowtype.c. References NI_STRING, NI_strlen(), NI_rowtype::part_dim, NI_rowtype::part_num, NI_rowtype::part_rtp, NI_rowtype::part_siz, NI_rowtype::part_typ, NI_rowtype::psiz, ROWTYPE_is_varsize, and ROWTYPE_part_dimen. Referenced by NI_size_column(), and NI_write_columns().
00831 {
00832 int ii,jj , ss ;
00833 char *dat = (char *)dpt ;
00834
00835 if( rt == NULL ) return 0; /* nonsense input */
00836 if( !ROWTYPE_is_varsize(rt) ) return rt->psiz; /* fixed dim struct */
00837 if( dat == NULL ) return 0; /* var size with no data? */
00838
00839 /* loop over parts, adding up part sizes,
00840 including var dim arrays and String parts */
00841
00842 for( ii=ss=0 ; ii < rt->part_num ; ii++ ){
00843 if( rt->part_typ[ii] == NI_STRING ){ /* String is special */
00844 char *str = *((char **)((dat) + (rt)->part_off[ii])) ;
00845 ss += NI_strlen(str) ;
00846 } else if( rt->part_dim[ii] < 0 ){ /* 1 fixed dim type */
00847 ss += rt->part_siz[ii] ;
00848 } else { /* var dim array */
00849 jj = ROWTYPE_part_dimen(rt,dat,ii) ; /* array size */
00850 ss += jj * rt->part_rtp[ii]->psiz ; /* size of all parts */
00851 } /* in var dim array */
00852 }
00853
00854 return ss ;
00855 }
|
|
||||||||||||||||
|
Return the length in bytes of a column of data (not counting padding). The pointer to the data is needed since it might contain variable size data (String or vardim arrays). ---------------------------------------------------------------------------- Definition at line 2086 of file niml_rowtype.c. References NI_rowtype_vsize(), NI_rowtype::psiz, ROWTYPE_is_varsize, and NI_rowtype::size. Referenced by NI_write_element().
02087 {
02088 char *dat = (char *)cpt ;
02089 int ii , ndat ;
02090
02091 if( rt == NULL || col_len <= 0 )
02092 return 0; /* nonsense input */
02093 if( !ROWTYPE_is_varsize(rt) || dat == NULL )
02094 return (col_len*rt->psiz); /* fixed dim struct */
02095
02096 /* must loop through elements and add up their variable sizes */
02097
02098 ndat = 0 ;
02099 for( ii=0 ; ii < col_len ; ii++ )
02100 ndat += NI_rowtype_vsize( rt , dat + ii*rt->size ) ;
02101
02102 return ndat ;
02103 }
|
|
||||||||||||||||
|
Swap bytes in a bunch of rowtype structs. --------------------------------------------------------------------------- Definition at line 1942 of file niml_rowtype.c. References NI_rowtype::code, NI_BYTE, NI_COMPLEX, NI_DOUBLE, NI_FLOAT, NI_INT, NI_RGB, NI_RGBA, NI_SHORT, NI_STRING, NI_swap2(), NI_swap4(), NI_swap8(), NI_rowtype::part_dim, NI_rowtype::part_num, NI_rowtype::part_off, NI_rowtype::part_rtp, ROWTYPE_part_dimen, and NI_rowtype::size. Referenced by NI_read_columns().
01943 {
01944 if( rt == NULL || nrow <= 0 || dat == NULL ) return ; /* stupid inputs */
01945
01946 switch( rt->code ){
01947
01948 case NI_RGB:
01949 case NI_RGBA:
01950 case NI_STRING:
01951 case NI_BYTE: return ; /* nothing to do */
01952
01953 /*-- basic types --*/
01954
01955 case NI_SHORT:
01956 NI_swap2( nrow , dat ) ;
01957 return ;
01958
01959 case NI_INT:
01960 case NI_FLOAT:
01961 NI_swap4( nrow , dat ) ;
01962 return ;
01963
01964 case NI_DOUBLE:
01965 NI_swap8( nrow , dat ) ;
01966 return ;
01967
01968 case NI_COMPLEX:
01969 NI_swap4( 2*nrow , dat ) ;
01970 return ;
01971
01972 /* a derived type (use recursion) */
01973
01974 default:{
01975 int ii , row , fsiz = rt->size ;
01976 char *ptr ;
01977
01978 for( row=0 ; row < nrow ; row++ ){
01979 ptr = dat + fsiz*row ; /* ptr to row-th element */
01980
01981 /* loop over parts and swap them, 1 at a time */
01982
01983 for( ii=0 ; ii < rt->part_num ; ii++ ){
01984
01985 if( rt->part_dim[ii] < 0 ){ /* fixed dim part */
01986
01987 NI_swap_column( rt->part_rtp[ii] , 1 , ptr+rt->part_off[ii] ) ;
01988
01989 } else { /* var dim array */
01990
01991 char **apt = (char **)(ptr+rt->part_off[ii]); /* data in struct */
01992 /* is ptr to array */
01993 int dim = ROWTYPE_part_dimen(rt,dat,ii) ; /* dimension of part */
01994 NI_swap_column( rt->part_rtp[ii] , dim , *apt ) ;
01995
01996 }
01997 } /* end of loop over parts */
01998 } /* end of loop over rows */
01999 }
02000 return ;
02001 }
02002 }
|
|
||||||||||||||||||||
|
Decode text from the NI_stream into a rowtype struct.
Definition at line 1767 of file niml_rowtype.c. References rgba::a, rgba::b, rgb::b, NI_rowtype::code, rgba::g, rgb::g, complex::i, NI_BYTE, NI_COMPLEX, NI_decode_one_double(), NI_decode_one_string(), NI_DOUBLE, NI_FLOAT, NI_free, NI_INT, NI_malloc, NI_RGB, NI_RGBA, NI_SHORT, NI_STRING, NI_rowtype::part_dim, NI_rowtype::part_num, NI_rowtype::part_off, NI_rowtype::part_rtp, rgba::r, rgb::r, complex::r, ROWTYPE_is_varsize, ROWTYPE_part_dimen, NI_rowtype::size, unescape_inplace(), and v1. Referenced by NI_read_columns().
01768 {
01769 int nn ;
01770
01771 switch( rt->code ){
01772
01773 /*-- a derived type: fill the parts by recursion --*/
01774
01775 default:{
01776 char *dat = (char *)dpt , **aaa = NULL ;
01777 int ii , jj , naaa = 0 , iaaa = 0 ;
01778
01779 if( ROWTYPE_is_varsize(rt) ){ /* variable dim arrays inside */
01780 for( naaa=ii=0 ; ii < rt->part_num ; ii++ )
01781 if( rt->part_dim[ii] >= 0 ) naaa++ ; /* count var dim arrays */
01782 if( naaa > 0 )
01783 aaa = NI_malloc(char*, sizeof(char *)*naaa) ; /* save their addresses */
01784 } /* for possible deletion later */
01785
01786 /* loop over parts and load them */
01787
01788 for( nn=1,ii=0 ; ii < rt->part_num ; ii++ ){
01789
01790 if( rt->part_dim[ii] < 0 ){ /* one fixed dim part */
01791
01792 nn = NI_text_to_val( ns, rt->part_rtp[ii],
01793 dat+rt->part_off[ii], ltend );
01794
01795 } else { /* var dim array */
01796
01797 char **apt = (char **)(dat+rt->part_off[ii]); /* data in struct */
01798 /* will be ptr to array */
01799 int dim = ROWTYPE_part_dimen(rt,dat,ii) ; /* dimension of part */
01800 int siz = rt->part_rtp[ii]->size ; /* size of one part struct */
01801 if( dim > 0 ){
01802 *apt = NI_malloc(char, siz * dim ); /* make array */
01803 for( jj=0 ; jj < dim ; jj++ ){ /* get values for array */
01804 nn = NI_text_to_val( ns, rt->part_rtp[ii],
01805 *apt + siz * jj , ltend ) ;
01806 if( !nn ) break ;
01807 }
01808 } else {
01809 *apt = NULL ; /* dim=0 ==> no array needed */
01810 }
01811 aaa[iaaa++] = *apt ; /* save for possible deletion */
01812
01813 }
01814
01815 if( !nn ) break ; /* some read was bad */
01816 } /* end of loop over parts */
01817
01818 /* bad news ==> delete any allocated var dim arrays */
01819
01820 if( !nn ){
01821 for( ii=0 ; ii < iaaa ; ii++ ) NI_free( aaa[ii] ) ;
01822 NI_free( aaa ) ;
01823 return 0 ;
01824 }
01825 NI_free( aaa ) ; /* in any case, dump this */
01826 }
01827 break ;
01828
01829 /*-- the 9 builtin types below here; first up: String! --*/
01830
01831 case NI_STRING:{
01832 char *val=NULL ;
01833 char **vpt = (char **) dpt ;
01834 nn = NI_decode_one_string( ns , &val , ltend ) ;
01835 if( !nn || val == NULL ) return 0 ;
01836 unescape_inplace(val) ;
01837 *vpt = val ;
01838 }
01839 break ;
01840
01841 /*-- numeric types below here --*/
01842
01843 case NI_BYTE:{
01844 double val ;
01845 byte *vpt = (byte *) dpt ;
01846 nn = NI_decode_one_double( ns , &val , ltend ) ;
01847 if( !nn ) return 0 ;
01848 *vpt = (byte) val ;
01849 }
01850 break ;
01851
01852 case NI_SHORT:{
01853 double val ;
01854 short *vpt = (short *) dpt ;
01855 nn = NI_decode_one_double( ns , &val , ltend ) ;
01856 if( !nn ) return 0 ;
01857 *vpt = (short) val ;
01858 }
01859 break ;
01860
01861 case NI_INT:{
01862 double val ;
01863 int *vpt = (int *) dpt ;
01864 nn = NI_decode_one_double( ns , &val , ltend ) ;
01865 if( !nn ) return 0 ;
01866 *vpt = (int) val ;
01867 }
01868 break ;
01869
01870 case NI_FLOAT:{
01871 double val ;
01872 float *vpt = (float *) dpt ;
01873 nn = NI_decode_one_double( ns , &val , ltend ) ;
01874 if( !nn ) return 0 ;
01875 *vpt = (float) val ;
01876 }
01877 break ;
01878
01879 case NI_DOUBLE:{
01880 double val ;
01881 double *vpt = (double *) dpt ;
01882 nn = NI_decode_one_double( ns , &val , ltend ) ;
01883 if( !nn ) return 0 ;
01884 *vpt = (double) val ;
01885 }
01886 break ;
01887
01888 case NI_COMPLEX:{
01889 double v1,v2 ;
01890 complex *vpt = (complex *) dpt ;
01891 nn = NI_decode_one_double( ns , &v1 , ltend ) ;
01892 if( !nn ) return 0 ;
01893 nn = NI_decode_one_double( ns , &v2 , ltend ) ;
01894 if( !nn ) return 0 ;
01895 vpt->r = (float) v1 ;
01896 vpt->i = (float) v2 ;
01897 }
01898 break ;
01899
01900 case NI_RGB:{
01901 double v1,v2,v3 ;
01902 rgb *vpt = (rgb *) dpt ;
01903 nn = NI_decode_one_double( ns , &v1 , ltend ) ;
01904 if( !nn ) return 0 ;
01905 nn = NI_decode_one_double( ns , &v2 , ltend ) ;
01906 if( !nn ) return 0 ;
01907 nn = NI_decode_one_double( ns , &v3 , ltend ) ;
01908 if( !nn ) return 0 ;
01909 vpt->r = (byte) v1 ;
01910 vpt->g = (byte) v2 ;
01911 vpt->b = (byte) v3 ;
01912 }
01913 break ;
01914
01915 case NI_RGBA:{
01916 double v1,v2,v3,v4 ;
01917 rgba *vpt = (rgba *) dpt ;
01918 nn = NI_decode_one_double( ns , &v1 , ltend ) ;
01919 if( !nn ) return 0 ;
01920 nn = NI_decode_one_double( ns , &v2 , ltend ) ;
01921 if( !nn ) return 0 ;
01922 nn = NI_decode_one_double( ns , &v3 , ltend ) ;
01923 if( !nn ) return 0 ;
01924 nn = NI_decode_one_double( ns , &v4 , ltend ) ;
01925 if( !nn ) return 0 ;
01926 vpt->r = (byte) v1 ;
01927 vpt->g = (byte) v2 ;
01928 vpt->b = (byte) v3 ;
01929 vpt->a = (byte) v4 ;
01930 }
01931 break ;
01932
01933 } /* end of switch on type */
01934
01935 return 1 ; /* good */
01936 }
|
|
||||||||||||||||
|
Copy 1 fixed dim type (no String or var dim array parts here) value in binary format to the wbuf.
Definition at line 982 of file niml_rowtype.c. References NI_rowtype::part_num, NI_rowtype::part_off, NI_rowtype::part_siz, NI_rowtype::psiz, ROWTYPE_is_varsize, and NI_rowtype::size. Referenced by NI_multival_to_binary(), and NI_write_columns().
00983 {
00984 int jj=0 ; /* will be return value */
00985
00986 if( rt->size == rt->psiz ){ /* fixed dim, unpadded struct */
00987
00988 jj = rt->size ;
00989 memcpy(wbuf,dpt,jj) ;
00990
00991 } else if( !ROWTYPE_is_varsize(rt) ){ /* derived fixed dim type */
00992 /* ==> write each part separately */
00993 int ii ;
00994 for( ii=0 ; ii < rt->part_num ; ii++ ){
00995 memcpy(wbuf+jj,dpt+rt->part_off[ii],rt->part_siz[ii]) ;
00996 jj += rt->part_siz[ii] ;
00997 }
00998
00999 }
01000
01001 return jj ;
01002 }
|
|
||||||||||||||||
|
Encode 1 type value at the end of the text string wbuf (which is assumed to be plenty long). typ must be a fixed dim type code, or NI_STRING. Structs with var dim arrays must be handled separately. --------------------------------------------------------------------------- Definition at line 863 of file niml_rowtype.c. References a, NI_rowtype::code, gbuf, i, NI_BYTE, NI_COMPLEX, NI_DOUBLE, NI_FLOAT, NI_free, NI_INT, NI_RGB, NI_RGBA, NI_SHORT, NI_STRING, NI_rowtype::part_num, NI_rowtype::part_off, NI_rowtype::part_rtp, quotize_string(), and r. Referenced by NI_multival_to_text(), and NI_write_columns().
00864 {
00865 int jj = strlen(wbuf) ;
00866
00867 switch( rt->code ){
00868
00869 /*-- a derived type (will not contain var dim arrays) --*/
00870
00871 default:{
00872 if( rt != NULL ){
00873 int ii ;
00874 for( ii=0 ; ii < rt->part_num ; ii++ ) /* recursion */
00875 NI_val_to_text( rt->part_rtp[ii] , dpt + rt->part_off[ii] , wbuf ) ;
00876 }
00877 }
00878 break ;
00879
00880 /*-- integer types --*/
00881
00882 case NI_BYTE:{
00883 byte *vpt = (byte *)dpt ;
00884 sprintf(wbuf+jj," %u",(unsigned int)vpt[0]) ;
00885 }
00886 break ;
00887
00888 case NI_SHORT:{
00889 short *vpt = (short *)dpt ;
00890 sprintf(wbuf+jj," %d",(int)vpt[0]) ;
00891 }
00892 break ;
00893
00894 case NI_INT:{
00895 int *vpt = (int *)dpt ;
00896 sprintf(wbuf+jj," %d",vpt[0]) ;
00897 }
00898 break ;
00899
00900 /* multiple byte structs */
00901
00902 case NI_RGB:{
00903 rgb *vpt = (rgb *)dpt ;
00904 sprintf(wbuf+jj," %u %u %u",vpt[0].r,vpt[0].g,vpt[0].b) ;
00905 }
00906 break ;
00907
00908 case NI_RGBA:{
00909 rgba *vpt = (rgba *)dpt ;
00910 sprintf(wbuf+jj," %u %u %u %u",
00911 vpt[0].r,vpt[0].g,vpt[0].b,vpt[0].a) ;
00912 }
00913 break ;
00914
00915 /* for floating point outputs,
00916 first print to a temp string, then clip trailing and leading blanks */
00917
00918 case NI_FLOAT:{
00919 float *vpt = (float *)dpt ;
00920 char fbuf[32] ; int ff ;
00921 sprintf(fbuf,"%12.6g",vpt[0]) ;
00922 for( ff=strlen(fbuf) ; fbuf[ff]==' ' ; ff-- ) fbuf[ff] = '\0' ;
00923 for( ff=0 ; fbuf[ff] == ' ' ; ff++ ) ;
00924 sprintf(wbuf+jj," %s",fbuf+ff) ;
00925 }
00926 break ;
00927
00928 case NI_DOUBLE:{
00929 double *vpt = (double *)dpt ;
00930 char fbuf[32] ; int ff ;
00931 sprintf(fbuf,"%18.12g",vpt[0]) ;
00932 for( ff=strlen(fbuf) ; fbuf[ff]==' ' ; ff-- ) fbuf[ff] = '\0' ;
00933 for( ff=0 ; fbuf[ff] == ' ' ; ff++ ) ;
00934 sprintf(wbuf+jj," %s",fbuf+ff) ;
00935 }
00936 break ;
00937
00938 case NI_COMPLEX:{
00939 complex *vpt = (complex *)dpt ;
00940 char fbuf[32],gbuf[32] ; int ff,gg ;
00941 sprintf(fbuf,"%12.6g",vpt[0].r) ;
00942 for( ff=strlen(fbuf) ; fbuf[ff]==' ' ; ff-- ) fbuf[ff] = '\0' ;
00943 for( ff=0 ; fbuf[ff] == ' ' ; ff++ ) ;
00944 sprintf(gbuf,"%12.6g",vpt[0].i) ;
00945 for( gg=strlen(gbuf) ; gbuf[gg]==' ' ; gg-- ) gbuf[gg] = '\0' ;
00946 for( gg=0 ; gbuf[gg] == ' ' ; gg++ ) ;
00947 sprintf(wbuf+jj," %s %s",fbuf+ff,gbuf+gg) ;
00948 }
00949 break ;
00950
00951 case NI_STRING:{ /* 30 Dec 2002 */
00952 char **vpt = (char **)dpt , *str ;
00953 str = quotize_string( *vpt ) ;
00954 sprintf(wbuf+jj," %s",str) ;
00955 NI_free(str) ;
00956 }
00957 break ;
00958
00959 } /* end of switch on part type */
00960 }
|
|
||||||||||||||||||||||||||||
|
Write "columns" of data to a NI_stream. Each column is an array of structs of some NI_rowtype (including the builtin types):
Definition at line 1089 of file niml_rowtype.c. References a, B64_encode1, B64_encode2, B64_encode3, NI_stream_type::bad, c, cbuf, load_encode_table(), NI_BASE64_MODE, NI_BINARY_MODE, NI_clock_time(), NI_dpr(), NI_has_String(), NI_malloc, NI_multival_to_binary(), NI_multival_to_text(), NI_realloc, NI_rowtype_find_code(), NI_rowtype_vsize(), NI_stream_goodcheck(), NI_stream_write(), NI_stream_writeable(), NI_stream_writecheck(), NI_stream_writestring(), NI_STRING_TYPE, NI_TEXT_MODE, NI_val_to_binary(), NI_val_to_text(), NI_rowtype::part_dim, NI_rowtype::part_num, NI_rowtype::part_off, NI_rowtype::psiz, ROWTYPE_is_varsize, ROWTYPE_part_dimen, NI_rowtype::size, and NI_stream_type::type. Referenced by NI_write_element(), and NI_write_rowtype().
01092 {
01093 int ii,jj , row , dim , ntot,nout , col ;
01094 char *ptr , **col_dat=(char **)col_dpt ;
01095 int nwbuf,bb=0,cc=0;
01096 char *wbuf=NULL ; /* write buffer */
01097 char *bbuf=NULL ; /* copy of write buffer */
01098 char *cbuf=NULL ; /* Base64 buffer */
01099
01100 NI_rowtype **rt=NULL ; /* array of NI_rowtype, 1 per column */
01101 int *vsiz=NULL , vsiz_tot=0 ;
01102 int *fsiz=NULL , fsiz_tot=0 ;
01103
01104 # undef FREEUP
01105 # define FREEUP do{ NI_free(wbuf); NI_free(bbuf); NI_free(cbuf); \
01106 NI_free(rt) ; NI_free(vsiz); NI_free(fsiz); \
01107 } while(0)
01108
01109 /*-- check inputs --*/
01110
01111 if( col_num <= 0 || col_len <= 0 ) return 0 ;
01112 if( col_typ == NULL || col_dat == NULL ) return -1 ;
01113 if( !NI_stream_writeable(ns) ) return -1 ;
01114
01115 #if 0
01116 fprintf(stderr,"NI_write_columns: col_num=%d col_len=%d tmode=%d\n",col_num,col_len,tmode) ;
01117 #endif
01118
01119 /*-- check stream --*/
01120
01121 if( ns->bad ){ /* not connected yet? */
01122 jj = NI_stream_goodcheck(ns,666) ; /* try to connect it */
01123 if( jj < 1 ) return jj ; /* 0 is nothing yet, -1 is death */
01124 }
01125 #if 1
01126 jj = NI_stream_writecheck(ns,666) ;
01127 if( jj < 0 ) return jj ; /* only exit if stream is actually bad */
01128 #endif
01129
01130 if( ns->type == NI_STRING_TYPE ) /* output to string buffer ==> text mode */
01131 tmode = NI_TEXT_MODE ;
01132
01133 /* create array of NI_rowtype for columns, etc. */
01134
01135 rt = NI_malloc(NI_rowtype*, sizeof(NI_rowtype *) * col_num ) ;
01136 vsiz = NI_malloc(int, sizeof(int) * col_num ) ;
01137 fsiz = NI_malloc(int, sizeof(int) * col_num ) ;
01138 for( col=0 ; col < col_num ; col++ ){
01139
01140 /* convert column type code to rowtype pointer */
01141
01142 rt[col] = NI_rowtype_find_code( col_typ[col] ) ;
01143
01144 /* can't find type, or no data in column? take this job and shove it */
01145
01146 if( rt[col] == NULL || col_dat[col] == NULL ){ FREEUP; return -1; }
01147
01148 vsiz[col] = ROWTYPE_is_varsize(rt[col]) ; /* variable dim type? */
01149 fsiz[col] = rt[col]->size ; /* fixed size of struct (w/padding) */
01150 vsiz_tot += vsiz[col] ;
01151 fsiz_tot += fsiz[col] ;
01152
01153 /* can only write String parts in text mode */
01154
01155 if( tmode != NI_TEXT_MODE && NI_has_String(rt[col]) ) tmode = NI_TEXT_MODE;
01156 }
01157
01158 /*-- Special (and fast) case:
01159 one compact (no padding) fixed-size rowtype,
01160 and binary output ==> can write all data direct to stream at once --*/
01161
01162 if( col_num == 1 && tmode == NI_BINARY_MODE && fsiz[0] == rt[0]->psiz ){
01163 #if 0
01164 int ct = NI_clock_time() ;
01165 #endif
01166 nout = NI_stream_write( ns , col_dat[0] , fsiz[0]*col_len ) ;
01167 #if 0
01168 ct = NI_clock_time()-ct ;
01169 fprintf(stderr,"NI_write_columns FAST case: %d bytes in %d ms\n",fsiz[0]*col_len,ct) ;
01170 #endif
01171 FREEUP ; return nout ;
01172 }
01173
01174 /*-- allocate space for the write buffer (1 row at a time) --*/
01175
01176 switch( tmode ){
01177 default: tmode = NI_TEXT_MODE ; /* fall through */
01178 case NI_TEXT_MODE: nwbuf = 6*fsiz_tot ; break ;
01179
01180 case NI_BASE64_MODE:
01181 case NI_BINARY_MODE: nwbuf = fsiz_tot ; break ;
01182 }
01183 wbuf = NI_malloc(char, nwbuf+128) ; /* 128 for the hell of it */
01184
01185 /* create buffers for Base64 output, if needed */
01186
01187 if( tmode == NI_BASE64_MODE ){
01188 bbuf = NI_malloc(char, nwbuf+128) ; bb = 0 ; /* binary buffer */
01189 cbuf = NI_malloc(char, 2*nwbuf+128) ; cc = 0 ; /* base64 buffer */
01190 load_encode_table() ;
01191 }
01192
01193 /* this macro take the 'nout' number of output bytes
01194 and adds into the running total ntot if all was well;
01195 if all was not well with the write, then it aborts the output */
01196
01197 # undef ADDOUT
01198 # define ADDOUT \
01199 if( nout < 0 ){ \
01200 fprintf(stderr,"NIML:: write abort!\n"); \
01201 FREEUP ; return -1 ; \
01202 } else ntot+=nout
01203
01204 /*-- loop over output rows,
01205 format for output into wbuf, and then send to output stream --*/
01206
01207 ntot = 0 ; /* total number of bytes output to stream */
01208
01209 for( row=0 ; row < col_len ; row++ ){
01210
01211 /* expand write buffer if any type contains variable dim array(s) */
01212
01213 if( vsiz_tot ){
01214 for( jj=col=0 ; col < col_num ; col++ ){
01215 ptr = col_dat[col] + fsiz[col]*row ; /* ptr to row-th element */
01216 jj += NI_rowtype_vsize( rt[col] , ptr ); /* size of data, w/var arrays */
01217 }
01218 if( tmode == NI_TEXT_MODE ) jj *= 6 ;
01219 if( jj > nwbuf ){ /* did it get bigger? */
01220 nwbuf = jj ;
01221 wbuf = NI_realloc(wbuf, char,nwbuf+128) ;
01222 if( tmode == NI_BASE64_MODE ){ /* expand Base64 stuff, too */
01223 bbuf = NI_realloc(bbuf, char, nwbuf+128) ;
01224 cbuf = NI_realloc(cbuf, char,2*nwbuf+128) ;
01225 }
01226 }
01227 }
01228
01229 /* initialize write buffer for this row */
01230
01231 switch( tmode ){
01232 case NI_TEXT_MODE: wbuf[0] = '\0'; break; /* clear buffer */
01233 case NI_BASE64_MODE:
01234 case NI_BINARY_MODE: jj = 0 ; break; /* clear byte count */
01235 }
01236
01237 /* loop over columns, write each into the buffer */
01238
01239 for( col=0 ; col < col_num ; col++ ){
01240 ptr = col_dat[col] + fsiz[col]*row ; /* ptr to row-th struct */
01241 /* in this columns */
01242
01243 /* write each part of this struct into the buffer */
01244
01245 /* in text mode, strlen(wbuf) keeps track of number of bytes;
01246 in binary mode, jj keeps track of number of bytes written */
01247
01248 for( ii=0 ; ii < rt[col]->part_num ; ii++ ){ /*-- loop over parts --*/
01249
01250 if( rt[col]->part_dim[ii] < 0 ){ /*-- a single value --*/
01251 switch( tmode ){ /*-- output method (text or binary) --*/
01252
01253 case NI_TEXT_MODE: /*-- sprintf value to output --*/
01254 NI_val_to_text( rt[col]->part_rtp[ii],
01255 ptr+rt[col]->part_off[ii], wbuf ) ;
01256 break ;
01257
01258 case NI_BASE64_MODE: /*-- memcpy values to output --*/
01259 case NI_BINARY_MODE:
01260 jj += NI_val_to_binary( rt[col]->part_rtp[ii],
01261 ptr+rt[col]->part_off[ii], wbuf+jj ) ;
01262 break ;
01263 }
01264
01265 } else { /*-- variable dimension array --*/
01266
01267 char **apt = (char **)(ptr+rt[col]->part_off[ii]); /* data in struct */
01268 /* is ptr to array */
01269
01270 dim = ROWTYPE_part_dimen(rt[col],ptr,ii) ; /* dimension of part */
01271 if( dim > 0 && *apt != NULL ){
01272 switch( tmode ){
01273 case NI_TEXT_MODE:
01274 NI_multival_to_text( rt[col]->part_rtp[ii] , dim ,
01275 *apt , wbuf ) ;
01276 break ;
01277 case NI_BASE64_MODE:
01278 case NI_BINARY_MODE:
01279 jj += NI_multival_to_binary( rt[col]->part_rtp[ii] , dim ,
01280 *apt , wbuf+jj ) ;
01281 break ;
01282 }
01283 }
01284 }
01285
01286 } /* end of loop over parts in this column struct */
01287 } /* end of loop over columns */
01288
01289 /*- actually write the row data in wbuf out -*/
01290
01291 switch( tmode ){
01292
01293 case NI_TEXT_MODE: /* each row is on a separate line */
01294 strcat(wbuf,"\n") ;
01295 nout = NI_stream_writestring( ns , wbuf ) ;
01296 ADDOUT ;
01297 break ;
01298
01299 case NI_BINARY_MODE: /* jj bytes of binary in wbuf */
01300 nout = NI_stream_write( ns , wbuf , jj ) ;
01301 #ifdef NIML_DEBUG
01302 if( nout != jj ) NI_dpr("NI_write_columns: col#%d sends %d bytes; nout=%d\n",col,jj,nout) ;
01303 #endif
01304 ADDOUT ;
01305 break ;
01306
01307 case NI_BASE64_MODE:{ /* convert binary triples into base64 quads */
01308 int nb , nb3 , nb64 , pp,qq ;
01309 byte a,b,c,w,x,y,z ;
01310
01311 /* bbuf = bb bytes of unprocessed data from last struct
01312 plus jj bytes of data from new struct
01313 (bb will be 0 or 1 or 2) */
01314
01315 memcpy(bbuf+bb,wbuf,jj) ; /* add wbuf to tail of bbuf */
01316 nb = jj+bb ; /* number of bytes in bb */
01317 if( nb < 3 ){ bb = nb; break; } /* need at least 3 bytes */
01318 nb3 = 3*(nb/3) ; /* will encode nb3 bytes */
01319
01320 /* cbuf = base64 output buffer */
01321 /* cc = # bytes written since last EOL */
01322
01323 for( qq=pp=0 ; pp < nb3 ; ){
01324 a = bbuf[pp++] ; b = bbuf[pp++] ; c = bbuf[pp++] ;
01325 B64_encode3(a,b,c,w,x,y,z) ;
01326 cbuf[qq++] = w ; cbuf[qq++] = x ;
01327 cbuf[qq++] = y ; cbuf[qq++] = z ;
01328 cc += 4; if( cc > 64 ){ cbuf[qq++]=B64_EOL2; cc=0; }
01329 }
01330
01331 /* write base64 bytes to output */
01332
01333 nout = NI_stream_write( ns , cbuf , qq ) ;
01334 ADDOUT ;
01335
01336 /* deal with leftover bytes in bbuf */
01337
01338 bb = nb - nb3 ; /* num leftover bytes = 0, 1, or 2 */
01339 if( bb > 0 ){
01340 bbuf[0] = bbuf[nb3] ; /* copy leftovers */
01341 if( bb > 1 ) bbuf[1] = bbuf[nb3+1] ; /* to front of bbuf */
01342 }
01343 }
01344 break ;
01345 }
01346
01347 } /* end of loop over output structs (row) */
01348
01349 /* in Base64 mode, we might have to clean
01350 up if there are any leftover bytes in bbuf,
01351 or at least write an end of line */
01352
01353 if( tmode == NI_BASE64_MODE ){
01354 if( bb > 0 ){ /* num leftover bytes of data */
01355 byte w,x,y,z , a=bbuf[0],b=bbuf[1] ;
01356 if( bb == 2 ) B64_encode2(a,b,w,x,y,z) ;
01357 else B64_encode1(a,w,x,y,z) ;
01358 cbuf[0] = w ; cbuf[1] = x ;
01359 cbuf[2] = y ; cbuf[3] = z ; cbuf[4] = B64_EOL2 ;
01360 nout = NI_stream_write( ns , cbuf , 5 ) ;
01361 ADDOUT ;
01362 } else if( cc > 0 ){ /* just write an end of line */
01363 cbuf[0] = B64_EOL2 ;
01364 nout = NI_stream_write( ns , cbuf , 1 ) ;
01365 ADDOUT ;
01366 }
01367 }
01368
01369 /*-- cleanup and return --*/
01370
01371 FREEUP ;
01372 return ntot ;
01373 }
|
|
||||||||||||||||||||||||
|
Write one column of structs to the output stream. Now superseded by NI_write_columns(). -------------------------------------------------------------------------- Definition at line 1060 of file niml_rowtype.c. References NI_rowtype::code, and NI_write_columns().
01062 {
01063 void *dpt = dat ;
01064 if( rt == NULL ) return -1 ;
01065 return NI_write_columns( ns , 1 , &(rt->code) , ndat , &dpt , tmode ) ;
01066 }
|
|
|
Setup the alignment of basic NI types inside a struct (depends on CPU). Definition at line 94 of file niml_rowtype.c. References NI_rowtype::algn, NI_rowtype::code, NI_rowtype::comp_dim, NI_rowtype::comp_num, NI_rowtype::comp_typ, NI_rowtype::flag, NI_rowtype::name, new_Htable(), NI_BYTE, NI_COMPLEX, NI_DOUBLE, NI_FLOAT, NI_INT, NI_malloc, NI_new, NI_NUM_BASIC_TYPES, NI_RGB, NI_RGBA, NI_SHORT, NI_strdup(), NI_STRING, offsetof, NI_rowtype::part_dim, NI_rowtype::part_num, NI_rowtype::part_off, NI_rowtype::part_rtp, NI_rowtype::part_siz, NI_rowtype::part_typ, pointer_alignment, pointer_size, profile_Htable(), NI_rowtype::psiz, ROWTYPE_register, ROWTYPE_VARSIZE_MASK, NI_rowtype::size, type_alignment, type_name, type_size, and NI_rowtype::userdef. Referenced by NI_rowtype_code_to_alias(), NI_rowtype_code_to_size(), NI_rowtype_define(), NI_rowtype_find_code(), and NI_rowtype_find_name().
00095 {
00096 NI_rowtype *rt ;
00097 int ii ;
00098
00099 if( rowtype_table != NULL ) return ; /* don't run this twice */
00100
00101 /* get alignments and sizes of the basic types */
00102
00103 type_alignment[NI_BYTE ] = offsetof(Qadgop_byte ,b) ;
00104 type_alignment[NI_SHORT ] = offsetof(Qadgop_short ,b) ;
00105 type_alignment[NI_INT ] = offsetof(Qadgop_int ,b) ;
00106 type_alignment[NI_FLOAT ] = offsetof(Qadgop_float ,b) ;
00107 type_alignment[NI_DOUBLE ] = offsetof(Qadgop_double ,b) ;
00108 type_alignment[NI_COMPLEX] = offsetof(Qadgop_complex,b) ;
00109 type_alignment[NI_RGB ] = offsetof(Qadgop_rgb ,b) ;
00110 type_alignment[NI_RGBA ] = offsetof(Qadgop_rgba ,b) ;
00111
00112 type_size[NI_BYTE ] = sizeof(byte ) ;
00113 type_size[NI_SHORT ] = sizeof(short ) ;
00114 type_size[NI_INT ] = sizeof(int ) ;
00115 type_size[NI_FLOAT ] = sizeof(float ) ;
00116 type_size[NI_DOUBLE ] = sizeof(double ) ;
00117 type_size[NI_COMPLEX] = sizeof(complex) ;
00118 type_size[NI_RGB ] = sizeof(rgb ) ;
00119 type_size[NI_RGBA ] = sizeof(rgba ) ;
00120
00121 /* initialize the rowtype table with the basic types */
00122
00123 rowtype_table = new_Htable(19) ;
00124
00125 for( ii=0 ; ii < NI_NUM_BASIC_TYPES ; ii++ ){
00126
00127 rt = NI_new( NI_rowtype ) ;
00128 rt->code = ii ;
00129 rt->size = type_size[ii] ; /* size of "struct" */
00130 rt->psiz = rt->size ; /* size of all parts */
00131 rt->algn = type_alignment[ii] ; /* byte alignment */
00132 rt->name = NI_strdup(type_name[ii]);
00133 rt->userdef = NI_strdup(type_name[ii]);
00134 rt->flag = 0 ;
00135
00136 rt->comp_num = 1 ; /* basic types have */
00137 rt->comp_typ = NI_malloc(int, sizeof(int)) ; /* only one component */
00138 rt->comp_typ[0] = ii ;
00139 rt->comp_dim = NI_malloc(int, sizeof(int)) ;
00140 rt->comp_dim[0] = -1 ; /* fixed dim component */
00141
00142 rt->part_num = 1 ; /* basic types have */
00143 rt->part_typ = NI_malloc(int, sizeof(int)) ; /* only one part */
00144 rt->part_typ[0] = ii ;
00145 rt->part_off = NI_malloc(int, sizeof(int)) ;
00146 rt->part_off[0] = 0 ;
00147 rt->part_siz = NI_malloc(int, sizeof(int)) ;
00148 rt->part_siz[0] = type_size[ii] ;
00149 rt->part_dim = NI_malloc(int, sizeof(int)) ;
00150 rt->part_dim[0] = -1 ; /* fixed dim part */
00151 rt->part_rtp = NI_malloc(NI_rowtype*, sizeof(NI_rowtype *)) ;
00152 rt->part_rtp[0] = rt ;
00153
00154 ROWTYPE_register( rt ) ; /* put in the Htable */
00155 }
00156
00157 /* alignment and size of pointers */
00158
00159 pointer_alignment = offsetof(Qadgop_pointer,b) ;
00160 pointer_size = sizeof(void *) ;
00161
00162 /* insert a special rowtype for String (really a pointer) */
00163
00164 type_alignment[NI_STRING] = pointer_alignment ;
00165 type_size [NI_STRING] = pointer_size ;
00166
00167 rt = NI_new( NI_rowtype ) ;
00168 rt->code = NI_STRING ;
00169 rt->size = pointer_size ;
00170 rt->psiz = 0 ; /* variable dim */
00171 rt->algn = pointer_alignment ;
00172 rt->name = NI_strdup("String") ;
00173 rt->userdef = NI_strdup("String") ;
00174 rt->flag = ROWTYPE_VARSIZE_MASK ; /* variable dim */
00175
00176 rt->comp_num = 1 ;
00177 rt->comp_typ = NI_malloc(int, sizeof(int)) ;
00178 rt->comp_typ[0] = NI_STRING ;
00179 rt->comp_dim = NI_malloc(int, sizeof(int)) ;
00180 rt->comp_dim[0] = -1 ;
00181
00182 rt->part_num = 1 ;
00183 rt->part_typ = NI_malloc(int, sizeof(int)) ;
00184 rt->part_typ[0] = NI_STRING ;
00185 rt->part_off = NI_malloc(int, sizeof(int)) ;
00186 rt->part_off[0] = 0 ;
00187 rt->part_siz = NI_malloc(int, sizeof(int)) ;
00188 rt->part_siz[0] = pointer_size ;
00189 rt->part_dim = NI_malloc(int, sizeof(int)) ;
00190 rt->part_dim[0] = -1 ;
00191
00192 rt->part_rtp = NI_malloc(NI_rowtype*, sizeof(NI_rowtype *)) ;
00193 rt->part_rtp[0] = rt ;
00194
00195 ROWTYPE_register( rt ) ;
00196
00197 if( ROWTYPE_debug )
00198 profile_Htable( "rowtype_table" , rowtype_table ) ;
00199 }
|
Variable Documentation
|
|
Definition at line 40 of file niml_rowtype.c. Referenced by NI_rowtype_define(), and setup_basic_types(). |
|
|
Definition at line 41 of file niml_rowtype.c. Referenced by NI_rowtype_define(), and setup_basic_types(). |
|
|
The array of user-defined rowtypes, indexed by type code. Note that rowtypes are never deleted - they just accumulate. Definition at line 51 of file niml_rowtype.c. |
|
|
Debug flag for rowtype stuff. Definition at line 85 of file niml_rowtype.c. Referenced by NI_rowtype_debug(). |
|
|
Definition at line 52 of file niml_rowtype.c. Referenced by NI_rowtype_define(), and NI_rowtype_find_code(). |
|
|
The Htable of user-defined rowtypes, indexed by type name. Definition at line 46 of file niml_rowtype.c. |
|
|
Initial value: {
"uint8" , "int16" , "int32" ,
"float32" , "float64" , "complex64" ,
"rgb8" , "rgba8" , "CString"
}Definition at line 31 of file niml_rowtype.c. Referenced by NI_rowtype_code_to_alias(), and NI_rowtype_find_name(). |
|
|
Definition at line 23 of file niml_rowtype.c. Referenced by setup_basic_types(). |
|
|
Initial value: {
"byte" , "short" , "int" ,
"float" , "double" , "complex" ,
"rgb" , "rgba" , "String"
}Definition at line 25 of file niml_rowtype.c. Referenced by NI_rowtype_find_name(), and setup_basic_types(). |
|
|
Definition at line 24 of file niml_rowtype.c. Referenced by NI_rowtype_code_to_size(), and setup_basic_types(). |