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