xref: /nrf52832-nimble/rt-thread/components/dfs/filesystems/jffs2/src/pushpull.h (revision 104654410c56c573564690304ae786df310c91fc)
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