Provided by: libfuntools-dev_1.4.6+git150811-2_amd64 bug

NAME

       FunTableRowPut - put Funtools rows

SYNOPSIS

       int FunTableRowPut(Fun fun, void *rows, int nev, int idx, char *plist)

DESCRIPTION

       The FunTableRowPut() routine writes rows to a FITS binary table, taking its input from an
       array of user structs that contain column values selected by a previous call to
       FunColumnSelect().  Selected column values are automatically converted from native data
       format to FITS data format as necessary.

       The first argument is the Fun handle associated with this row data.  The second rows
       argument is the array of user structs to output. The third nrow argument specifies the
       number number of rows to write.  The routine will write nrow records, starting from the
       location specified by rows.

       The fourth idx argument is the index of the first raw input row to write, in the case
       where rows from the user buffer are being merged with their raw input row counterparts
       (see below). Note that this idx value is has nothing to do with the row buffer specified
       in argument 1.  It merely matches the row being written with its corresponding (hidden)
       raw row.  Thus, if you read a number of rows, process them, and then write them out all at
       once starting from the first user row, the value of idx should be 0:

         Ev ebuf, ev;
         /* get rows -- let routine allocate the row array */
         while( (ebuf = (Ev)FunTableRowGet(fun, NULL, MAXROW, NULL, &got)) ){
           /* process all rows */
           for(i=0; i<got; i++){
             /* point to the i'th row */
             ev = ebuf+i;
             ...
           }
           /* write out this batch of rows, starting with the first */
           FunTableRowPut(fun2, (char *)ebuf, got, 0, NULL);
           /* free row data */
           if( ebuf ) free(ebuf);
         }

       On the other hand, if you write out the rows one at a time (possibly skipping rows), then,
       when writing the i'th row from the input array of rows, set idx to the value of i:

         Ev ebuf, ev;
         /* get rows -- let routine allocate the row array */
         while( (ebuf = (Ev)FunTableRowGet(fun, NULL, MAXROW, NULL, &got)) ){
           /* process all rows */
           for(i=0; i<got; i++){
             /* point to the i'th row */
             ev = ebuf+i;
             ...
             /* write out the current (i.e., i'th) row */
             FunTableRowPut(fun2, (char *)ev, 1, i, NULL);
           }
           /* free row data */
           if( ebuf ) free(ebuf);
         }

       The final argument is a param list string that is not currently used.  The routine returns
       the number of rows output.  This should be equal to the value passed in the third nrow</B
       argument.

       When FunTableRowPut() is first called for a given binary table, Funtools checks to see of
       the primary header has already been written (either by writing a previous row table or by
       writing an image.) If not, a dummy primary header is written to the file specifying that
       an extension should be expected.  After this, a binary table header is automatically
       written containing information about the columns that will populate this table.  In
       addition, if a Funtools reference handle was specified when this table was opened, the
       parameters from this Funtools reference handle are merged into the new binary table
       header.

       In a typical Funtools row loop, you read rows using FunTableRowGet()() and write rows
       using FunTableRowPut(). The columns written by FunTableRowPut()() are those defined as
       writable by a previous call to FunColumnSelect().  If that call to FunColumnSelect also
       specified merge=[update⎪replace⎪append], then the entire corresponding raw input row
       record will be merged with the output row according to the merge specification (see
       FunColumnSelect() above).

       A call to write rows can either be done once, after all rows in the input batch have been
       processed, or it can be done (slightly less efficiently) one row at a time (or anything in
       between). We do recommend that you write all rows associated with a given batch of input
       rows before reading new rows.  This is required if you are merging the output rows with
       the raw input rows (since the raw rows are destroyed with each successive call to get new
       rows).

       For example:

         Ev buf, ev;
         ...
         /* get rows -- let routine allocate the row array */
         while( (buf = (Ev)FunTableRowGet(fun, NULL, MAXROW, NULL, &got)) ){
           /* point to the i'th row */
           ev = buf + i;
           .... process
         }
         /* write out this batch of rows */
         FunTableRowPut(fun2, buf, got, 0, NULL);
         /* free row data */
         if( buf ) free(buf);
         }

       or

         Ev buf, ev;
         ...
         /* get rows -- let routine allocate the row array */
         while( (buf = (Ev)FunTableRowGet(fun, NULL, MAXROW, NULL, &got)) ){
           /* process all rows */
           for(i=0; i<got; i++){
             /* point to the i'th row */
             ev = buf + i;
             ... process
             /* write out this batch of rows with the new column */
             if( dowrite )
               FunTableRowPut(fun2, buf, 1, i, NULL);
           }
           /* free row data */
           if( buf ) free(buf);
         }

       Note that the difference between these calls is that the first one outputs got rows all at
       once and therefore passes idx=0 in argument four, so that merging starts at the first raw
       input row.  In the second case, a check it made on each row to see if it needs to be
       output.  If so, the value of idx is passed as the value of the i variable which points to
       the current row being processed in the batch of input rows.

       As shown above, successive calls to FunTableRowPut() will write rows sequentially. When
       you are finished writing all rows in a table, you should call FunFlush() to write out the
       FITS binary table padding. However, this is not necessary if you subsequently call
       FunClose() without doing any other I/O to the FITS file.

       Note that FunTableRowPut() also can be called as FunEventsPut(), for backward
       compatibility.

SEE ALSO

       See funtools(7) for a list of Funtools help pages