/usr/share/gnudatalanguage/astrolib/ftput.pro is in gdl-astrolib 2018.02.16+dfsg-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174  | pro ftput,h,tab,field,row,values,nulls
;+
; NAME:
;       FTPUT
; PURPOSE:
;       Procedure to add or update a field in an FITS ASCII table
; CALLING SEQUENCE:
;       FTPUT, htab, tab, field, row, values, [ nulls ]
;
; INPUTS:
;       htab - FITS ASCII table header string array
;       tab - FITS ASCII table array (e.g. as read by READFITS)
;       field - string field name or integer field number
;       row -  either a non-negative integer scalar giving starting row to 
;               update, or a non-negative integer vector specifying rows to 
;               update.   FTPUT will append a new row to a table if the value 
;               of 'row' exceeds the number of rows in the tab array    
;       values - value(s) to add or update.   If row is a vector
;               then values must contain the same number of elements.
;
; OPTIONAL INPUT:
;       nulls - null value flag of same length as values.
;               It should be set to 1 at null value positions
;               and 0 elsewhere.
;
; OUTPUTS:
;       htab,tab will be updated as specified.
;
; EXAMPLE:
;       One has a NAME and RA  and Dec vectors for 500 stars with formats A6,
;       F9.5 and F9.5 respectively.   Write this information to an ASCII table 
;       named 'star.fits'.
;
;       IDL> FTCREATE,24,500,h,tab       ;Create table header and (empty) data
;       IDL> FTADDCOL,h,tab,'RA',8,'F9.5','DEGREES'   ;Explicity define the
;       IDL> FTADDCOL,h,tab,'DEC',8,'F9.5','DEGREES'  ;RA and Dec columns
;       IDL> FTPUT,h,tab,'RA',0,ra       ;Insert RA vector into table
;       IDL> FTPUT,h,tab,'DEC',0,dec       ;Insert DEC vector into table
;       IDL> FTPUT, h,tab, 'NAME',0,name   ;Insert NAME vector with default
;       IDL> WRITEFITS,'stars.fits',tab,h ;Write to a file
;   
;      Note that (1) explicit formatting has been supplied for the (numeric)
;      RA and Dec vectors, but was not needed for the NAME vector, (2) A width
;      of 24 was supplied in FTCREATE based on the expected formats (6+9+9),
;      though the FT* will adjust this value as necessary, and (3) WRITEFITS
;      will create a minimal primary header  
; NOTES:
;       (1) If the specified field is not already in the table, then FTPUT will
;       create a new column for that field using default formatting.   However,
;        FTADDCOL should be called prior to FTPUT for explicit formatting.
;
; PROCEDURES CALLED
;       FTADDCOL, FTINFO, FTSIZE, SXADDPAR, SXPAR()
; HISTORY:
;       version 1  D. Lindler July, 1987
;       Allow E format         W. Landsman          March 1992
;       Write in F format if E format will overflow    April 1994
;       Update documentation W. Landsman   January 1996
;       Allow 1 element vector  W. Landsman   March 1996
;       Adjust string length to maximum of input string array   June 1997
;       Work for more than 32767 elements August 1997
;       Converted to IDL V5.0   W. Landsman   September 1997
;       Updated call to the new FTINFO   W. Landsman   May 2000
;       Fix case where header does not have any columns yet W.Landsman Sep 2002
;       Assume since V5.2, omit fstring() call  W. Landsman April 2006
;-
 On_error,2
 compile_opt idl2
 if N_params() LT 5 then begin
    print,'Syntax - FTPUT, htab, tab, field, row, values, [nulls]'
    return
 endif
 nrow = N_elements(row)        ;Number of elements in row vector
 nullflag = N_elements(nulls) GT 0         ;Null values supplied?
 ftsize,h,tab,ncols,nrows,tfields,allcols,allrows     ; Get size of table
; Make values a vector if scalar supplied
 s = size(values) & ndim = s[0] & type = s[ndim+1]
 if ndim gt 1 then $
        message,'Input values must be scalar or 1-D array'
 sz_row = size(row)
 scalar = sz_row[0] EQ 0
 v = values
 if nullflag then nullvals = nulls
; Get info on field specified
 ftinfo,h,ft_str, Count = tfields
 if tfields EQ 0 then ipos = -1 else begin
  if size(field,/TNAME) EQ 'STRING' then begin
    field = strupcase(strtrim(field,2))
    ttype = strtrim(ft_str.ttype,2)
    ipos = where(ttype EQ field, Npos)
 endif else ipos = field -1
 endelse
 if ipos[0] EQ -1 then begin            ;Does it exist?
; Add new column if it doesn't exist
          if type EQ 7 then type = (-max(strlen(v)))
          ftaddcol, h, tab, field, type
          ftinfo,h,ft_str
          ftsize,h,tab,ncols,nrows,tfields,allcols,allrows
          ipos = tfields-1
 endif 
 ipos = ipos[0]
 tbcol = ft_str.tbcol[ipos]-1                   ;IDL starts at zero not one.
; Convert input vector to string array
 n = N_elements(v)
 data = string(replicate(32b, ft_str.width[ipos], n ) )
 if nrow GT 1 then if (nrow NE n) then $
        message,'Number of specified rows must equal number of values'
 fmt = strupcase(strtrim(ft_str.tform[ipos],2))
 fmt1 = strmid(fmt,0,1)
 if (fmt1 EQ 'D') or (fmt1 EQ 'E') then begin  ;Need at least 6 chars for E fmt
        point = strpos(fmt,'.')
        wid = fix(strmid(fmt,1,point-1))
        decimal = fix(strmid(fmt,point+1,1000))
        if wid-decimal LT 6 then fmt = 'F' + strmid(fmt,1,1000)
 endif
 fmt = '(' + fmt + ')'
 data = string(v, FORMAT = fmt)
; insert null values
 if nullflag GT 5 then begin
        bad = where(nullvals, Nbad)
        if Nbad GT 0 then for i = 0L, Nbad-1 do data[bad[i]] = tnull
 end
;
; Do we need to increase the number of rows in the table?
;
if scalar then maxrow = row+n else maxrow = max(row) + 1
if maxrow GT allrows then begin         ;expand table size
    ;
    ;  Create a replacement table with the required number of rows.
    ;
    newtab = replicate(32b,allcols,maxrow)
    newtab[0,0] = tab
    ;
    ;  Move the new table into the old table.
    ;
    tab = newtab
end
 if maxrow GT nrows then sxaddpar,h,'naxis2',maxrow
;
;  Now insert into table.
;
  if scalar then tab[tbcol,row] = byte(data) $
  else for i = 0L,N_elements(row)-1 do tab[tbcol,row[i]] = byte(data[i])
;
;  Return to calling routine.
;
 return
 end
 |