1*10465441SEvalZero /*
2*10465441SEvalZero * JFFS2 -- Journalling Flash File System, Version 2.
3*10465441SEvalZero *
4*10465441SEvalZero * Copyright (C) 2001, 2002 Red Hat, Inc.
5*10465441SEvalZero *
6*10465441SEvalZero * Created by David Woodhouse <[email protected]>
7*10465441SEvalZero *
8*10465441SEvalZero * For licensing information, see the file 'LICENCE' in this directory.
9*10465441SEvalZero *
10*10465441SEvalZero * $Id: pushpull.h,v 1.10 2004/11/16 20:36:11 dwmw2 Exp $
11*10465441SEvalZero *
12*10465441SEvalZero */
13*10465441SEvalZero
14*10465441SEvalZero #ifndef __PUSHPULL_H__
15*10465441SEvalZero #define __PUSHPULL_H__
16*10465441SEvalZero
17*10465441SEvalZero #include <linux/errno.h>
18*10465441SEvalZero
19*10465441SEvalZero struct pushpull {
20*10465441SEvalZero unsigned char *buf;
21*10465441SEvalZero unsigned int buflen;
22*10465441SEvalZero unsigned int ofs;
23*10465441SEvalZero unsigned int reserve;
24*10465441SEvalZero };
25*10465441SEvalZero
26*10465441SEvalZero
init_pushpull(struct pushpull * pp,char * buf,unsigned buflen,unsigned ofs,unsigned reserve)27*10465441SEvalZero static inline void init_pushpull(struct pushpull *pp, char *buf, unsigned buflen, unsigned ofs, unsigned reserve)
28*10465441SEvalZero {
29*10465441SEvalZero pp->buf = (unsigned char *)buf;
30*10465441SEvalZero pp->buflen = buflen;
31*10465441SEvalZero pp->ofs = ofs;
32*10465441SEvalZero pp->reserve = reserve;
33*10465441SEvalZero }
34*10465441SEvalZero
pushbit(struct pushpull * pp,int bit,int use_reserved)35*10465441SEvalZero static inline int pushbit(struct pushpull *pp, int bit, int use_reserved)
36*10465441SEvalZero {
37*10465441SEvalZero if (pp->ofs >= pp->buflen - (use_reserved?0:pp->reserve)) {
38*10465441SEvalZero return -ENOSPC;
39*10465441SEvalZero }
40*10465441SEvalZero
41*10465441SEvalZero if (bit) {
42*10465441SEvalZero pp->buf[pp->ofs >> 3] |= (1<<(7-(pp->ofs &7)));
43*10465441SEvalZero }
44*10465441SEvalZero else {
45*10465441SEvalZero pp->buf[pp->ofs >> 3] &= ~(1<<(7-(pp->ofs &7)));
46*10465441SEvalZero }
47*10465441SEvalZero pp->ofs++;
48*10465441SEvalZero
49*10465441SEvalZero return 0;
50*10465441SEvalZero }
51*10465441SEvalZero
pushedbits(struct pushpull * pp)52*10465441SEvalZero static inline int pushedbits(struct pushpull *pp)
53*10465441SEvalZero {
54*10465441SEvalZero return pp->ofs;
55*10465441SEvalZero }
56*10465441SEvalZero
pullbit(struct pushpull * pp)57*10465441SEvalZero static inline int pullbit(struct pushpull *pp)
58*10465441SEvalZero {
59*10465441SEvalZero int bit;
60*10465441SEvalZero
61*10465441SEvalZero bit = (pp->buf[pp->ofs >> 3] >> (7-(pp->ofs & 7))) & 1;
62*10465441SEvalZero
63*10465441SEvalZero pp->ofs++;
64*10465441SEvalZero return bit;
65*10465441SEvalZero }
66*10465441SEvalZero
pulledbits(struct pushpull * pp)67*10465441SEvalZero static inline int pulledbits(struct pushpull *pp)
68*10465441SEvalZero {
69*10465441SEvalZero return pp->ofs;
70*10465441SEvalZero }
71*10465441SEvalZero
72*10465441SEvalZero #endif /* __PUSHPULL_H__ */
73