diff options
| author | Nicolas Noble <pixel@nobis-crew.org> | 2013-08-07 16:32:26 -0700 | 
|---|---|---|
| committer | Nicolas Noble <pixel@nobis-crew.org> | 2013-08-07 16:32:40 -0700 | 
| commit | df00882195da3fb970782f21d79a0a10e6b186b3 (patch) | |
| tree | f6626a204b464d02768a006a10d465620af59cb6 /src | |
| parent | 7f841bd54b8628420b4bec129fae86472b5dc565 (diff) | |
Adding readU16, readU32 and readU64. The Lua version of readU64 will need GMP support.
Diffstat (limited to 'src')
| -rw-r--r-- | src/Handle.cc | 39 | ||||
| -rw-r--r-- | src/LuaHandle.cc | 18 | 
2 files changed, 57 insertions, 0 deletions
| diff --git a/src/Handle.cc b/src/Handle.cc index 503787b..2a03f8c 100644 --- a/src/Handle.cc +++ b/src/Handle.cc @@ -104,6 +104,45 @@ Balau::Future<uint8_t> Balau::Handle::readU8() {      });  } +Balau::Future<uint16_t> Balau::Handle::readU16() { +    IO<Handle> t(this); +    std::shared_ptr<uint16_t> b(new uint16_t); +    int c = 0; +    return Future<uint16_t>([t, b, c]() mutable { +        do { +            int r = t->read(((uint8_t *) b.get()) + c, 2); +            c += r; +        } while (c < 2); +        return *b; +    }); +} + +Balau::Future<uint32_t> Balau::Handle::readU32() { +    IO<Handle> t(this); +    std::shared_ptr<uint32_t> b(new uint32_t); +    int c = 0; +    return Future<uint32_t>([t, b, c]() mutable { +        do { +            int r = t->read(((uint8_t *) b.get()) + c, 4); +            c += r; +        } while (c < 4); +        return *b; +    }); +} + +Balau::Future<uint64_t> Balau::Handle::readU64() { +    IO<Handle> t(this); +    std::shared_ptr<uint64_t> b(new uint64_t); +    int c = 0; +    return Future<uint64_t>([t, b, c]() mutable { +        do { +            int r = t->read(((uint8_t *) b.get()) + c, 8); +            c += r; +        } while (c < 8); +        return *b; +    }); +} +  void Balau::Handle::rseek(off_t offset, int whence) throw (GeneralException) {      if (canSeek())          throw GeneralException(String("Handle ") + getName() + " can seek, but rseek() not implemented (missing in class " + ClassName(this).c_str() + ")"); diff --git a/src/LuaHandle.cc b/src/LuaHandle.cc index 355b992..6b8bd18 100644 --- a/src/LuaHandle.cc +++ b/src/LuaHandle.cc @@ -9,11 +9,15 @@ typedef IOHandle IOInput;  enum IOHandle_methods_t {      IOHANDLE_CLOSE,      IOHANDLE_READU8, +    IOHANDLE_READU16, +    IOHANDLE_READU32,  };  struct Balau::lua_functypes_t IOHandle_methods[] = {      { IOHANDLE_CLOSE,           "close",          0, 0, { } },      { IOHANDLE_READU8,          "readU8",         0, 0, { } }, +    { IOHANDLE_READU16,         "readU16",        0, 0, { } }, +    { IOHANDLE_READU32,         "readU32",        0, 0, { } },      { -1, 0, 0, 0, 0 },  }; @@ -35,6 +39,18 @@ int sLua_IOHandle::IOHandle_proceed(Balau::Lua & L, int n, IOHandle * obj, int c              return L.yield(Balau::Future<int>([L, c]() mutable { L.push((lua_Number) c.get()); return 1; }));          }          break; +    case IOHANDLE_READU16: +        { +            Balau::Future<uint16_t> c = h->readU16(); +            return L.yield(Balau::Future<int>([L, c]() mutable { L.push((lua_Number) c.get()); return 1; })); +        } +        break; +    case IOHANDLE_READU32: +        { +            Balau::Future<uint32_t> c = h->readU32(); +            return L.yield(Balau::Future<int>([L, c]() mutable { L.push((lua_Number) c.get()); return 1; })); +        } +        break;      }      return r; @@ -51,6 +67,8 @@ void Balau::LuaHandleFactory::pushObjectAndMembers(Lua & L) {      PUSH_METHOD(IOHandle, IOHANDLE_CLOSE);      PUSH_METHOD(IOHandle, IOHANDLE_READU8); +    PUSH_METHOD(IOHandle, IOHANDLE_READU16); +    PUSH_METHOD(IOHandle, IOHANDLE_READU32);  } | 
