X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=lib%2Fff-binary.c;h=5729722aa721a84695305fb1927126d2c648ccd9;hb=4adf195fb2f36dfbd054745469fa1c580de2f61b;hp=2d088ccf84a63e67d6ebdb32f0a712ccd5e9c765;hpb=35ec1bb7d7bbab61494b654ec0433c38bad0a2ff;p=libucw.git diff --git a/lib/ff-binary.c b/lib/ff-binary.c index 2d088ccf..5729722a 100644 --- a/lib/ff-binary.c +++ b/lib/ff-binary.c @@ -9,109 +9,26 @@ #include "lib/lib.h" #include "lib/fastbuf.h" - -int bgetw_slow(struct fastbuf *f) -{ - int w1, w2; - w1 = bgetc_slow(f); - if (w1 < 0) - return w1; - w2 = bgetc_slow(f); - if (w2 < 0) - return w2; -#ifdef CPU_BIG_ENDIAN - return (w1 << 8) | w2; -#else - return w1 | (w2 << 8); -#endif -} - -u32 bgetl_slow(struct fastbuf *f) -{ - u32 l = bgetc_slow(f); -#ifdef CPU_BIG_ENDIAN - l = (l << 8) | bgetc_slow(f); - l = (l << 8) | bgetc_slow(f); - return (l << 8) | bgetc_slow(f); -#else - l = (bgetc_slow(f) << 8) | l; - l = (bgetc_slow(f) << 16) | l; - return (bgetc_slow(f) << 24) | l; -#endif -} - -u64 bgetq_slow(struct fastbuf *f) -{ - u32 l, h; -#ifdef CPU_BIG_ENDIAN - h = bgetl_slow(f); - l = bgetl_slow(f); -#else - l = bgetl_slow(f); - h = bgetl_slow(f); -#endif - return ((u64) h << 32) | l; -} - -u64 bget5_slow(struct fastbuf *f) -{ - u32 l, h; -#ifdef CPU_BIG_ENDIAN - h = bgetc_slow(f); - l = bgetl_slow(f); -#else - l = bgetl_slow(f); - h = bgetc_slow(f); -#endif - return ((u64) h << 32) | l; -} - -void bputw_slow(struct fastbuf *f, uns w) -{ -#ifdef CPU_BIG_ENDIAN - bputc_slow(f, w >> 8); - bputc_slow(f, w); -#else - bputc_slow(f, w); - bputc_slow(f, w >> 8); -#endif -} - -void bputl_slow(struct fastbuf *f, u32 l) -{ -#ifdef CPU_BIG_ENDIAN - bputc_slow(f, l >> 24); - bputc_slow(f, l >> 16); - bputc_slow(f, l >> 8); - bputc_slow(f, l); -#else - bputc_slow(f, l); - bputc_slow(f, l >> 8); - bputc_slow(f, l >> 16); - bputc_slow(f, l >> 24); -#endif -} - -void bputq_slow(struct fastbuf *f, u64 q) -{ -#ifdef CPU_BIG_ENDIAN - bputl_slow(f, q >> 32); - bputl_slow(f, q); -#else - bputl_slow(f, q); - bputl_slow(f, q >> 32); -#endif -} - -void bput5_slow(struct fastbuf *f, u64 o) -{ - u32 hi = o >> 32; - u32 low = o; -#ifdef CPU_BIG_ENDIAN - bputc_slow(f, hi); - bputl_slow(f, low); -#else - bputl_slow(f, low); - bputc_slow(f, hi); -#endif -} +#include "lib/ff-binary.h" + +#define GEN(type, name, size, endian) \ +type bget##name##_##endian##_slow(struct fastbuf *f) \ +{ \ + byte buf[size/8]; \ + if (bread(f, buf, sizeof(buf)) != sizeof(buf)) \ + return ~(type)0; \ + return get_u##size##_##endian(buf); \ +} \ +void bput##name##_##endian##_##slow(struct fastbuf *f, type x) \ +{ \ + byte buf[size/8]; \ + put_u##size##_##endian(buf, x); \ + bwrite_slow(f, buf, sizeof(buf)); \ +} + +#define FF_ALL(type, name, size) GEN(type,name,size,be) GEN(type,name,size,le) + +FF_ALL(int, w, 16) +FF_ALL(u32, l, 32) +FF_ALL(u64, q, 64) +FF_ALL(u64, 5, 40)