]> mj.ucw.cz Git - libucw.git/blob - lib/ff-binary.c
Merge with git+ssh://git.ucw.cz/projects/sherlock/GIT/sherlock.git#v3.10.1
[libucw.git] / lib / ff-binary.c
1 /*
2  *      UCW Library -- Fast Buffered I/O: Binary Numbers
3  *
4  *      (c) 1997--2006 Martin Mares <mj@ucw.cz>
5  *
6  *      This software may be freely distributed and used according to the terms
7  *      of the GNU Lesser General Public License.
8  */
9
10 #include "lib/lib.h"
11 #include "lib/fastbuf.h"
12
13 int bgetw_slow(struct fastbuf *f)
14 {
15   int w1, w2;
16   w1 = bgetc_slow(f);
17   if (w1 < 0)
18     return w1;
19   w2 = bgetc_slow(f);
20   if (w2 < 0)
21     return w2;
22 #ifdef CPU_BIG_ENDIAN
23   return (w1 << 8) | w2;
24 #else
25   return w1 | (w2 << 8);
26 #endif
27 }
28
29 u32 bgetl_slow(struct fastbuf *f)
30 {
31   u32 l = bgetc_slow(f);
32 #ifdef CPU_BIG_ENDIAN
33   l = (l << 8) | bgetc_slow(f);
34   l = (l << 8) | bgetc_slow(f);
35   return (l << 8) | bgetc_slow(f);
36 #else
37   l = (bgetc_slow(f) << 8) | l;
38   l = (bgetc_slow(f) << 16) | l;
39   return (bgetc_slow(f) << 24) | l;
40 #endif
41 }
42
43 u64 bgetq_slow(struct fastbuf *f)
44 {
45   u32 l, h;
46 #ifdef CPU_BIG_ENDIAN
47   h = bgetl_slow(f);
48   l = bgetl_slow(f);
49 #else
50   l = bgetl_slow(f);
51   h = bgetl_slow(f);
52 #endif
53   return ((u64) h << 32) | l;
54 }
55
56 u64 bget5_slow(struct fastbuf *f)
57 {
58   u32 l, h;
59 #ifdef CPU_BIG_ENDIAN
60   h = bgetc_slow(f);
61   l = bgetl_slow(f);
62 #else
63   l = bgetl_slow(f);
64   h = bgetc_slow(f);
65 #endif
66   return ((u64) h << 32) | l;
67 }
68
69 void bputw_slow(struct fastbuf *f, uns w)
70 {
71 #ifdef CPU_BIG_ENDIAN
72   bputc_slow(f, w >> 8);
73   bputc_slow(f, w);
74 #else
75   bputc_slow(f, w);
76   bputc_slow(f, w >> 8);
77 #endif
78 }
79
80 void bputl_slow(struct fastbuf *f, u32 l)
81 {
82 #ifdef CPU_BIG_ENDIAN
83   bputc_slow(f, l >> 24);
84   bputc_slow(f, l >> 16);
85   bputc_slow(f, l >> 8);
86   bputc_slow(f, l);
87 #else
88   bputc_slow(f, l);
89   bputc_slow(f, l >> 8);
90   bputc_slow(f, l >> 16);
91   bputc_slow(f, l >> 24);
92 #endif
93 }
94
95 void bputq_slow(struct fastbuf *f, u64 q)
96 {
97 #ifdef CPU_BIG_ENDIAN
98   bputl_slow(f, q >> 32);
99   bputl_slow(f, q);
100 #else
101   bputl_slow(f, q);
102   bputl_slow(f, q >> 32);
103 #endif
104 }
105
106 void bput5_slow(struct fastbuf *f, u64 o)
107 {
108   u32 hi = o >> 32;
109   u32 low = o;
110 #ifdef CPU_BIG_ENDIAN
111   bputc_slow(f, hi);
112   bputl_slow(f, low);
113 #else
114   bputl_slow(f, low);
115   bputc_slow(f, hi);
116 #endif
117 }