(file) Return to buf.h CVS log (file) (dir) Up to [OMI] / omi / base

  1 mike  1.1 /*
  2           **==============================================================================
  3           **
  4           ** Open Management Infrastructure (OMI)
  5           **
  6           ** Copyright (c) Microsoft Corporation
  7           ** 
  8           ** Licensed under the Apache License, Version 2.0 (the "License"); you may not 
  9           ** use this file except in compliance with the License. You may obtain a copy 
 10           ** of the License at 
 11           **
 12           **     http://www.apache.org/licenses/LICENSE-2.0 
 13           **
 14           ** THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 15           ** KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED 
 16           ** WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, 
 17           ** MERCHANTABLITY OR NON-INFRINGEMENT. 
 18           **
 19           ** See the Apache 2 License for the specific language governing permissions 
 20           ** and limitations under the License.
 21           **
 22 mike  1.1 **==============================================================================
 23           */
 24           
 25           #ifndef _omi_buf_h
 26           #define _omi_buf_h
 27           
 28           #include "config.h"
 29           #include <string.h>
 30           #include <common.h>
 31           #include "batch.h"
 32           
 33           BEGIN_EXTERNC
 34           
 35           /*
 36           **==============================================================================
 37           **
 38           ** Buf
 39           **
 40           **==============================================================================
 41           */
 42           #define BUF_INITIALIZER { NULL, 0, 0, 0 }
 43 mike  1.1 
 44           typedef struct _Buf
 45           {
 46               /* The buffer memory (preceded by Page object) */
 47               void* data;
 48           
 49               /* The current size of the buffer */
 50               MI_Uint32 size;
 51           
 52               /* The current capacity of the buffer */
 53               MI_Uint32 capacity;
 54           
 55               /* The current unpacking offset of ths buffer */
 56               MI_Uint32 offset;
 57           }
 58           Buf;
 59           
 60           MI_Result Buf_Init(
 61               Buf* self,
 62               MI_Uint32 capacity);
 63           
 64 mike  1.1 void Buf_Destroy(
 65               Buf* self);
 66           
 67           MI_Result Buf_Reserve(
 68               Buf* self, 
 69               MI_Uint32 capacity);
 70           
 71           /* Steal the memory page (can be passed to Batch_Attach) */
 72           Page* Buf_StealPage(
 73               Buf* self);
 74           
 75           MI_Result Buf_App(
 76               Buf* self, 
 77               const void* data, 
 78               MI_Uint32 size);
 79           
 80           /* Pad buffer out to the next 2-byte boundary */
 81           MI_INLINE MI_Result Buf_Pad16(
 82               Buf* self)
 83           {
 84               MI_Uint32 offset = (self->size + 1) & ~1;
 85 mike  1.1 
 86               if (offset > self->capacity)
 87               {
 88                   if (Buf_Reserve(self, offset) != MI_RESULT_OK)
 89                       return MI_RESULT_FAILED;
 90               }
 91           
 92               self->size = offset;
 93               return MI_RESULT_OK;
 94           }
 95           
 96           /* Pad buffer out to the next 4-byte boundary */
 97           MI_INLINE MI_Result Buf_Pad32(
 98               Buf* self)
 99           {
100               MI_Uint32 offset = (self->size + 3) & ~3;
101           
102               if (offset > self->capacity)
103               {
104                   if (Buf_Reserve(self, offset) != MI_RESULT_OK)
105                       return MI_RESULT_FAILED;
106 mike  1.1     }
107           
108               self->size = offset;
109               return MI_RESULT_OK;
110           }
111           
112           /* Pad buffer out to the next 8-byte boundary */
113           MI_INLINE MI_Result Buf_Pad64(
114               Buf* self)
115           {
116               MI_Uint32 offset = (self->size + 7) & ~7;
117           
118               if (offset > self->capacity)
119               {
120                   if (Buf_Reserve(self, offset) != MI_RESULT_OK)
121                       return MI_RESULT_FAILED;
122               }
123           
124               self->size = offset;
125               return MI_RESULT_OK;
126           }
127 mike  1.1 
128           /* Align buffer on the next 2 byte boundary */
129           MI_INLINE MI_Result Buf_Align16(
130               Buf* self)
131           {
132               MI_Uint32 offset = (self->offset + 1) & ~1;
133           
134               if (offset > self->size)
135                   return MI_RESULT_FAILED;
136           
137               self->offset = offset;
138               return MI_RESULT_OK;
139           }
140           
141           /* Align buffer on the next 4 byte boundary */
142           MI_INLINE MI_Result Buf_Align32(
143               Buf* self)
144           {
145               MI_Uint32 offset = (self->offset + 3) & ~3;
146           
147               if (offset > self->size)
148 mike  1.1         return MI_RESULT_FAILED;
149           
150               self->offset = offset;
151               return MI_RESULT_OK;
152           }
153           
154           /* Align buffer on the next 8 byte boundary */
155           MI_INLINE MI_Result Buf_Align64(
156               Buf* self)
157           {
158               MI_Uint32 offset = (self->offset + 7) & ~7;
159           
160               if (offset > self->size)
161                   return MI_RESULT_FAILED;
162           
163               self->offset = offset;
164               return MI_RESULT_OK;
165           }
166           
167           MI_INLINE MI_Result Buf_PackU8(
168               Buf* self,
169 mike  1.1     MI_Uint8 x)
170           {
171               MI_Uint32 offset = self->size;
172           
173               if (offset + sizeof(x) > self->capacity)
174               {
175                   if (Buf_Reserve(self, offset + sizeof(x)) != MI_RESULT_OK)
176                       return MI_RESULT_FAILED;
177               }
178           
179               *((MI_Uint8*)((char*)self->data + offset)) = x;
180               self->size = offset + sizeof(x);
181               return MI_RESULT_OK;
182           }
183           
184           MI_INLINE MI_Result Buf_PackU16(
185               Buf* self,
186               MI_Uint16 x)
187           {
188               MI_Uint32 offset = (self->size + 1) & ~1;
189           
190 mike  1.1     if (offset + sizeof(x) > self->capacity)
191               {
192                   if (Buf_Reserve(self, offset + sizeof(x)) != MI_RESULT_OK)
193                       return MI_RESULT_FAILED;
194               }
195           
196               *((MI_Uint16*)((char*)self->data + offset)) = x;
197               self->size = offset + sizeof(x);
198               return MI_RESULT_OK;
199           }
200           
201           MI_INLINE MI_Result Buf_PackU32(
202               Buf* self,
203               MI_Uint32 x)
204           {
205               MI_Uint32 offset = (self->size + 3) & ~3;
206           
207               if (offset + sizeof(x) > self->capacity)
208               {
209                   if (Buf_Reserve(self, offset + sizeof(x)) != MI_RESULT_OK)
210                       return MI_RESULT_FAILED;
211 mike  1.1     }
212           
213               *((MI_Uint32*)((char*)self->data + offset)) = x;
214               self->size = offset + sizeof(x);
215               return MI_RESULT_OK;
216           }
217           
218           MI_INLINE MI_Result Buf_PackU64(
219               Buf* self,
220               MI_Uint64 x)
221           {
222               MI_Uint32 offset = (self->size + 7) & ~7;
223           
224               if (offset + sizeof(x) > self->capacity)
225               {
226                   if (Buf_Reserve(self, offset + sizeof(x)) != MI_RESULT_OK)
227                       return MI_RESULT_FAILED;
228               }
229           
230               *((MI_Uint64*)((char*)self->data + offset)) = x;
231               self->size = offset + sizeof(x);
232 mike  1.1     return MI_RESULT_OK;
233           }
234           
235           MI_Result Buf_PackStr(
236               Buf* self,
237               const MI_Char* x);
238           
239           MI_INLINE MI_Result Buf_PackU8A(
240               Buf* self,
241               MI_Uint8* data,
242               MI_Uint32 size)
243           {
244               MI_RETURN_ERR(Buf_PackU32(self, size));
245           
246               if (size)
247                   MI_RETURN_ERR(Buf_App(self, data, size * sizeof(MI_Uint8)));
248           
249               return MI_RESULT_OK;
250           }
251           
252           MI_INLINE MI_Result Buf_PackU16A(
253 mike  1.1     Buf* self,
254               MI_Uint16* data,
255               MI_Uint32 size)
256           {
257               MI_RETURN_ERR(Buf_PackU32(self, size));
258           
259               if (size)
260                   MI_RETURN_ERR(Buf_App(self, data, size * sizeof(MI_Uint16)));
261           
262               return MI_RESULT_OK;
263           }
264           
265           MI_INLINE MI_Result Buf_PackU32A(
266               Buf* self,
267               MI_Uint32* data,
268               MI_Uint32 size)
269           {
270               MI_RETURN_ERR(Buf_PackU32(self, size));
271           
272               if (size)
273                   MI_RETURN_ERR(Buf_App(self, data, size * sizeof(MI_Uint32)));
274 mike  1.1 
275               return MI_RESULT_OK;
276           }
277           
278           MI_INLINE MI_Result Buf_PackU64A(
279               Buf* self,
280               MI_Uint64* data,
281               MI_Uint32 size)
282           {
283               MI_RETURN_ERR(Buf_PackU32(self, size));
284           
285               if (size)
286               {
287                   MI_RETURN_ERR(Buf_Pad64(self));
288                   MI_RETURN_ERR(Buf_App(self, data, size * sizeof(MI_Uint64)));
289               }
290           
291               return MI_RESULT_OK;
292           }
293           
294           MI_INLINE MI_Result Buf_UnpackU8(
295 mike  1.1     Buf* self,
296               MI_Uint8* x)
297           {
298               MI_Uint32 offset = self->offset;
299           
300               if (offset + sizeof(*x) > self->size)
301                   return MI_RESULT_FAILED;
302           
303               *x = *((MI_Uint8*)((char*)self->data + offset));
304               self->offset = offset + sizeof(*x);
305               return MI_RESULT_OK;
306           }
307           
308           MI_INLINE MI_Result Buf_UnpackU16(
309               Buf* self,
310               MI_Uint16* x)
311           {
312               MI_Uint32 offset = (self->offset + 1) & ~1;
313           
314               if (offset + sizeof(*x) > self->size)
315                   return MI_RESULT_FAILED;
316 mike  1.1 
317               *x = *((MI_Uint16*)((char*)self->data + offset));
318               self->offset = offset + sizeof(*x);
319               return MI_RESULT_OK;
320           }
321           
322           MI_INLINE MI_Result Buf_UnpackU32(
323               Buf* self,
324               MI_Uint32* x)
325           {
326               MI_Uint32 offset = (self->offset + 3) & ~3;
327           
328               if (offset + sizeof(*x) > self->size)
329                   return MI_RESULT_FAILED;
330           
331               *x = *((MI_Uint32*)((char*)self->data + offset));
332               self->offset = offset + sizeof(*x);
333               return MI_RESULT_OK;
334           }
335           
336           MI_INLINE MI_Result Buf_UnpackU64(
337 mike  1.1     Buf* self,
338               MI_Uint64* x)
339           {
340               MI_Uint32 offset = (self->offset + 7) & ~7;
341           
342               if (offset + sizeof(*x) > self->size)
343                   return MI_RESULT_FAILED;
344           
345               *x = *((MI_Uint64*)((char*)self->data + offset));
346               self->offset = offset + sizeof(*x);
347               return MI_RESULT_OK;
348           }
349           
350           MI_Result Buf_UnpackU8A(
351               Buf* self,
352               const MI_Uint8** data,
353               MI_Uint32* size);
354           
355           MI_Result Buf_UnpackU16A(
356               Buf* self,
357               const MI_Uint16** data,
358 mike  1.1     MI_Uint32* size);
359           
360           MI_Result Buf_UnpackU32A(
361               Buf* self,
362               const MI_Uint32** data,
363               MI_Uint32* size);
364           
365           MI_Result Buf_UnpackU64A(
366               Buf* self,
367               const MI_Uint64** data,
368               MI_Uint32* size);
369           
370           MI_Result Buf_UnpackStr(
371               Buf* self,
372               const MI_Char** x);
373           
374           MI_Result Buf_PackStrA(
375               Buf* self,
376               const MI_Char** data,
377               MI_Uint32 size);
378           
379 mike  1.1 MI_Result Buf_UnpackStrA(
380               Buf* self,
381               const MI_Char*** data,
382               MI_Uint32* size);
383           
384           MI_Result Buf_PackDT(
385               Buf* self,
386               const MI_Datetime* x);
387           
388           MI_Result Buf_UnpackDT(
389               Buf* self,
390               MI_Datetime* x);
391           
392           MI_Result Buf_PackDTA(
393               Buf* self,
394               const MI_Datetime* data,
395               MI_Uint32 size);
396           
397           MI_Result Buf_UnpackDTA(
398               Buf* self,
399               const MI_Datetime** dataPtr,
400 mike  1.1     MI_Uint32* sizePtr);
401           
402           END_EXTERNC
403           
404           #endif /* _omi_buf_h */

ViewCVS 0.9.2