github.com/iDigitalFlame/xmt@v0.5.1/data/data_reader.go (about) 1 // Copyright (C) 2020 - 2023 iDigitalFlame 2 // 3 // This program is free software: you can redistribute it and/or modify 4 // it under the terms of the GNU General Public License as published by 5 // the Free Software Foundation, either version 3 of the License, or 6 // any later version. 7 // 8 // This program is distributed in the hope that it will be useful, 9 // but WITHOUT ANY WARRANTY; without even the implied warranty of 10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 // GNU General Public License for more details. 12 // 13 // You should have received a copy of the GNU General Public License 14 // along with this program. If not, see <https://www.gnu.org/licenses/>. 15 // 16 17 package data 18 19 import "io" 20 21 type reader struct { 22 _ [0]func() 23 r io.Reader 24 buf [8]byte 25 } 26 27 func (r *reader) Close() error { 28 if c, ok := r.r.(io.Closer); ok { 29 return c.Close() 30 } 31 return nil 32 } 33 34 // NewReader creates a simple Reader struct from the base io.Reader provided. 35 func NewReader(r io.Reader) Reader { 36 return &reader{r: r} 37 } 38 func (r *reader) Int() (int, error) { 39 v, err := r.Uint64() 40 if err != nil { 41 return 0, err 42 } 43 return int(v), nil 44 } 45 func (r *reader) Uint() (uint, error) { 46 v, err := r.Uint64() 47 if err != nil { 48 return 0, err 49 } 50 return uint(v), nil 51 } 52 func (r *reader) Bool() (bool, error) { 53 v, err := r.Uint8() 54 if err != nil { 55 return false, err 56 } 57 return v == 1, nil 58 } 59 func (r *reader) Int8() (int8, error) { 60 v, err := r.Uint8() 61 if err != nil { 62 return 0, err 63 } 64 return int8(v), nil 65 } 66 func (r *reader) ReadInt(p *int) error { 67 v, err := r.Int() 68 if err != nil { 69 return err 70 } 71 *p = v 72 return nil 73 } 74 func (r *reader) Int16() (int16, error) { 75 v, err := r.Uint16() 76 if err != nil { 77 return 0, err 78 } 79 return int16(v), nil 80 } 81 func (r *reader) Int32() (int32, error) { 82 v, err := r.Uint32() 83 if err != nil { 84 return 0, err 85 } 86 return int32(v), nil 87 } 88 func (r *reader) Int64() (int64, error) { 89 v, err := r.Uint64() 90 if err != nil { 91 return 0, err 92 } 93 return int64(v), nil 94 } 95 func (r *reader) Uint8() (uint8, error) { 96 n, err := r.r.Read(r.buf[0:1]) 97 if err != nil { 98 return 0, err 99 } 100 if n < 1 { 101 return 0, io.EOF 102 } 103 return r.buf[0], nil 104 } 105 func (r *reader) Bytes() ([]byte, error) { 106 t, err := r.Uint8() 107 if err != nil { 108 return nil, err 109 } 110 var l uint64 111 switch t { 112 case 0: 113 return nil, nil 114 case 1, 2: 115 n, err2 := r.Uint8() 116 if err2 != nil { 117 return nil, err2 118 } 119 l = uint64(n) 120 case 3, 4: 121 n, err2 := r.Uint16() 122 if err2 != nil { 123 return nil, err2 124 } 125 l = uint64(n) 126 case 5, 6: 127 n, err2 := r.Uint32() 128 if err2 != nil { 129 return nil, err2 130 } 131 l = uint64(n) 132 case 7, 8: 133 n, err2 := r.Uint64() 134 if err2 != nil { 135 return nil, err2 136 } 137 l = n 138 default: 139 return nil, ErrInvalidType 140 } 141 if l == 0 { 142 // NOTE(dij): Technically we should return (nil, nil) 143 // But! Our spec states that 0 size should be ID:0 144 // NOT ID:0,SIZE:0. So something made a fucky wucky here. 145 return nil, io.ErrUnexpectedEOF 146 } 147 if l > MaxSlice { 148 return nil, ErrTooLarge 149 } 150 var ( 151 b = make([]byte, l) 152 n int 153 ) 154 if n, err = io.ReadFull(r.r, b); err != nil { 155 switch { 156 case err == io.EOF: 157 case err == ErrLimit: 158 default: 159 return nil, err 160 } 161 } 162 if uint64(n) != l { 163 return b[:n], io.EOF 164 } 165 return b, nil 166 } 167 func (r *reader) ReadUint(p *uint) error { 168 v, err := r.Uint() 169 if err != nil { 170 return err 171 } 172 *p = v 173 return nil 174 } 175 func (r *reader) ReadInt8(p *int8) error { 176 v, err := r.Int8() 177 if err != nil { 178 return err 179 } 180 *p = v 181 return nil 182 } 183 func (r *reader) ReadBool(p *bool) error { 184 v, err := r.Bool() 185 if err != nil { 186 return err 187 } 188 *p = v 189 return nil 190 } 191 func (r *reader) Uint16() (uint16, error) { 192 _ = r.buf[1] 193 n, err := io.ReadFull(r.r, r.buf[0:2]) 194 if err != nil { 195 return 0, err 196 } 197 if n < 2 { 198 return 0, io.EOF 199 } 200 return uint16(r.buf[1]) | uint16(r.buf[0])<<8, nil 201 } 202 func (r *reader) Uint32() (uint32, error) { 203 _ = r.buf[3] 204 n, err := io.ReadFull(r.r, r.buf[0:4]) 205 if err != nil { 206 return 0, err 207 } 208 if n < 4 { 209 return 0, io.EOF 210 } 211 return uint32(r.buf[3]) | uint32(r.buf[2])<<8 | uint32(r.buf[1])<<16 | uint32(r.buf[0])<<24, nil 212 } 213 func (r *reader) Uint64() (uint64, error) { 214 _ = r.buf[7] 215 n, err := io.ReadFull(r.r, r.buf[:]) 216 if err != nil { 217 return 0, err 218 } 219 if n < 8 { 220 return 0, io.EOF 221 } 222 return uint64(r.buf[7]) | uint64(r.buf[6])<<8 | uint64(r.buf[5])<<16 | uint64(r.buf[4])<<24 | 223 uint64(r.buf[3])<<32 | uint64(r.buf[2])<<40 | uint64(r.buf[1])<<48 | uint64(r.buf[0])<<56, nil 224 } 225 func (r *reader) ReadInt16(p *int16) error { 226 v, err := r.Int16() 227 if err != nil { 228 return err 229 } 230 *p = v 231 return nil 232 } 233 func (r *reader) ReadInt32(p *int32) error { 234 v, err := r.Int32() 235 if err != nil { 236 return err 237 } 238 *p = v 239 return nil 240 } 241 func (r *reader) ReadInt64(p *int64) error { 242 v, err := r.Int64() 243 if err != nil { 244 return err 245 } 246 *p = v 247 return nil 248 } 249 func (r *reader) ReadUint8(p *uint8) error { 250 v, err := r.Uint8() 251 if err != nil { 252 return err 253 } 254 *p = v 255 return nil 256 } 257 func (r *reader) Float32() (float32, error) { 258 v, err := r.Uint32() 259 if err != nil { 260 return 0, nil 261 } 262 return float32FromInt(v), nil 263 } 264 func (r *reader) Float64() (float64, error) { 265 v, err := r.Uint64() 266 if err != nil { 267 return 0, nil 268 } 269 return float64FromInt(v), nil 270 } 271 func (r *reader) ReadBytes(p *[]byte) error { 272 v, err := r.Bytes() 273 if err != nil { 274 return err 275 } 276 *p = v 277 return nil 278 } 279 func (r *reader) Read(b []byte) (int, error) { 280 return r.r.Read(b) 281 } 282 func (r *reader) ReadUint16(p *uint16) error { 283 v, err := r.Uint16() 284 if err != nil { 285 return err 286 } 287 *p = v 288 return nil 289 } 290 func (r *reader) ReadUint32(p *uint32) error { 291 v, err := r.Uint32() 292 if err != nil { 293 return err 294 } 295 *p = v 296 return nil 297 } 298 func (r *reader) ReadUint64(p *uint64) error { 299 v, err := r.Uint64() 300 if err != nil { 301 return err 302 } 303 *p = v 304 return nil 305 } 306 func (r *reader) ReadString(p *string) error { 307 v, err := r.StringVal() 308 if err != nil { 309 return err 310 } 311 *p = v 312 return nil 313 } 314 func (r *reader) StringVal() (string, error) { 315 b, err := r.Bytes() 316 if err != nil { 317 return "", err 318 } 319 return string(b), nil 320 } 321 func (r *reader) ReadFloat32(p *float32) error { 322 v, err := r.Float32() 323 if err != nil { 324 return err 325 } 326 *p = v 327 return nil 328 } 329 func (r *reader) ReadFloat64(p *float64) error { 330 v, err := r.Float64() 331 if err != nil { 332 return err 333 } 334 *p = v 335 return nil 336 }