00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #ifndef _ABLE_CLIB_ABLE_DATABUFFER_H
00030 #define _ABLE_CLIB_ABLE_DATABUFFER_H __FILE__
00031
00032 typedef struct buffer buffer_t;
00033
00034 struct buffer {
00035 unsigned char *buffer;
00036 int size;
00037 int read, write;
00038 };
00039
00040 static inline void buffer_init(buffer_t *buff, unsigned char *data, int size)
00041 {
00042 buff->buffer = data;
00043 buff->size = size;
00044 buff->read = buff->write = 0;
00045 }
00046
00047 static inline unsigned char *buffer_getdata(buffer_t *buff)
00048 {
00049 return buff->buffer;
00050 }
00051
00052 static inline void buffer_setdata(buffer_t *buff, unsigned char *data, int sz)
00053 {
00054
00055
00056 buff->buffer = data;
00057 buff->size = sz;
00058
00059
00060 }
00061
00062 static inline void buffer_flush(buffer_t *buff)
00063 {
00064 buff->read = buff->write = 0;
00065 }
00066
00067 static inline int buffer_next(buffer_t *buff, int pos)
00068 {
00069 return ((pos+1) % buff->size);
00070 }
00071
00072 static inline int buffer_prev(buffer_t *buff, int pos)
00073 {
00074
00075
00076
00077
00078 if (pos == 0)
00079 return buff->size - 1;
00080
00081 return ((pos-1) % buff->size);
00082 }
00083
00084 static inline int buffer_isempty(buffer_t *buff)
00085 {
00086 return (buff->read == buff->write);
00087 }
00088
00089 static inline int buffer_isfull(buffer_t *buff)
00090 {
00091 return (buffer_next(buff, buff->write) == buff->read);
00092 }
00093
00094 static inline int buffer_insert(buffer_t *buff, unsigned char val)
00095 {
00096 if (buffer_isfull(buff)) {
00097 return 1;
00098 }
00099
00100 buff->buffer[buff->write] = val;
00101 buff->write = buffer_next(buff, buff->write);
00102
00103 return 0;
00104 }
00105
00106 static inline int buffer_insert_atread(buffer_t *buff, unsigned char val)
00107 {
00108
00109
00110
00111
00112 if (buffer_isfull(buff))
00113 return 1;
00114
00115
00116 buff->read = buffer_prev(buff, buff->read);
00117 buff->buffer[buff->read] = val;
00118
00119 return 0;
00120 }
00121
00122 static inline int buffer_remove(buffer_t *buff, unsigned char *res)
00123 {
00124 if (buffer_isempty(buff))
00125 return 1;
00126
00127 *res = buff->buffer[buff->read];
00128 buff->read = buffer_next(buff, buff->read);
00129
00130 return 0;
00131 }
00132
00133 static inline int buffer_get(buffer_t *buff)
00134 {
00135 unsigned char tmp;
00136
00137 if (buffer_remove(buff, &tmp) == 1) {
00138 return -1;
00139 }
00140
00141 return (int)tmp;
00142 }
00143
00144 #endif