github.com/astrogo/cfitsio@v0.1.0/utils.go (about)

     1  package cfitsio
     2  
     3  // #include "go-cfitsio.h"
     4  // #include "go-cfitsio-utils.h"
     5  import "C"
     6  import (
     7  	"fmt"
     8  	"reflect"
     9  	"strings"
    10  	"unsafe"
    11  )
    12  
    13  // strIsContinued checks whether the last non-whitespace char in the string
    14  // is an ampersand, which indicates the value string is to be continued on the
    15  // next line
    16  func strIsContinued(v string) bool {
    17  	vv := strings.Trim(v, " \n\t'")
    18  	if len(vv) == 0 {
    19  		return false
    20  	}
    21  	return vv[len(vv)-1] == '&'
    22  }
    23  
    24  func getLongValueString(f *File, key string) (string, error) {
    25  	c_key := C.CString(key)
    26  	defer C.free(unsafe.Pointer(c_key))
    27  	c_status := C.int(0)
    28  	var c_value *C.char = nil
    29  	defer C.free(unsafe.Pointer(c_value))
    30  	C.fits_read_key_longstr(f.c, c_key, &c_value, nil, &c_status)
    31  	if c_status > 0 {
    32  		return "", to_err(c_status)
    33  	}
    34  	return C.GoString(c_value), nil
    35  }
    36  
    37  // gotype2FITS returns the FITS format corresponding to a Go type
    38  // it returns "" if there is no corresponding FITS format.
    39  func gotype2FITS(v interface{}, hdu HDUType) string {
    40  	rt := reflect.TypeOf(v)
    41  	hdr := ""
    42  	switch rt.Kind() {
    43  	case reflect.Slice:
    44  		hdr = "Q"
    45  		rt = rt.Elem()
    46  	case reflect.Array:
    47  		hdr = fmt.Sprintf("%d", rt.Len())
    48  		rt = rt.Elem()
    49  	default:
    50  		// no-op
    51  	}
    52  
    53  	t, ok := g_gotype2FITS[rt.Kind()]
    54  	if !ok {
    55  		return ""
    56  	}
    57  	fitsfmt, ok := t[hdu]
    58  	if !ok {
    59  		return ""
    60  	}
    61  
    62  	return hdr + fitsfmt
    63  }
    64  
    65  var g_gotype2FITS = map[reflect.Kind]map[HDUType]string{
    66  
    67  	reflect.Bool: {
    68  		ASCII_TBL:  "",
    69  		BINARY_TBL: "L",
    70  	},
    71  
    72  	reflect.Int: {
    73  		ASCII_TBL:  "I4",
    74  		BINARY_TBL: "K",
    75  	},
    76  
    77  	reflect.Int8: {
    78  		ASCII_TBL:  "I4",
    79  		BINARY_TBL: "S",
    80  	},
    81  
    82  	reflect.Int16: {
    83  		ASCII_TBL:  "I4",
    84  		BINARY_TBL: "I",
    85  	},
    86  
    87  	reflect.Int32: {
    88  		ASCII_TBL:  "I4",
    89  		BINARY_TBL: "J",
    90  	},
    91  
    92  	reflect.Int64: {
    93  		ASCII_TBL:  "I4",
    94  		BINARY_TBL: "K",
    95  	},
    96  
    97  	reflect.Uint: {
    98  		ASCII_TBL:  "I4",
    99  		BINARY_TBL: "V",
   100  	},
   101  
   102  	reflect.Uint8: {
   103  		ASCII_TBL:  "I4",
   104  		BINARY_TBL: "B",
   105  	},
   106  
   107  	reflect.Uint16: {
   108  		ASCII_TBL:  "I4",
   109  		BINARY_TBL: "U",
   110  	},
   111  
   112  	reflect.Uint32: {
   113  		ASCII_TBL:  "I4",
   114  		BINARY_TBL: "V",
   115  	},
   116  
   117  	reflect.Uint64: {
   118  		ASCII_TBL:  "I4",
   119  		BINARY_TBL: "V",
   120  	},
   121  
   122  	reflect.Uintptr: {
   123  		ASCII_TBL:  "",
   124  		BINARY_TBL: "",
   125  	},
   126  
   127  	reflect.Float32: {
   128  		ASCII_TBL:  "E26.17", // must write as float64 since we can only read as such
   129  		BINARY_TBL: "E",
   130  	},
   131  
   132  	reflect.Float64: {
   133  		ASCII_TBL:  "E26.17",
   134  		BINARY_TBL: "D",
   135  	},
   136  
   137  	reflect.Complex64: {
   138  		ASCII_TBL:  "",
   139  		BINARY_TBL: "C",
   140  	},
   141  
   142  	reflect.Complex128: {
   143  		ASCII_TBL:  "",
   144  		BINARY_TBL: "M",
   145  	},
   146  
   147  	reflect.Array: {
   148  		ASCII_TBL:  "",
   149  		BINARY_TBL: "",
   150  	},
   151  
   152  	reflect.Chan: {
   153  		ASCII_TBL:  "",
   154  		BINARY_TBL: "",
   155  	},
   156  
   157  	reflect.Func: {
   158  		ASCII_TBL:  "",
   159  		BINARY_TBL: "",
   160  	},
   161  
   162  	reflect.Interface: {
   163  		ASCII_TBL:  "",
   164  		BINARY_TBL: "",
   165  	},
   166  
   167  	reflect.Map: {
   168  		ASCII_TBL:  "",
   169  		BINARY_TBL: "",
   170  	},
   171  
   172  	reflect.Ptr: {
   173  		ASCII_TBL:  "",
   174  		BINARY_TBL: "",
   175  	},
   176  
   177  	reflect.Slice: {
   178  		ASCII_TBL:  "",
   179  		BINARY_TBL: "",
   180  	},
   181  
   182  	reflect.String: {
   183  		ASCII_TBL:  "A80",
   184  		BINARY_TBL: "80A",
   185  	},
   186  
   187  	reflect.Struct: {
   188  		ASCII_TBL:  "",
   189  		BINARY_TBL: "",
   190  	},
   191  }
   192  
   193  // EOF