summaryrefslogtreecommitdiff
path: root/include/AEEBufBound.h
blob: 4146ba6edc98fd0663fe0ac48ee245806c5e7a07 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
/*
* Copyright (c) 2017, The Linux Foundation. All rights reserved.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors
* may be used to endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef AEEBUFBOUND_H
#define AEEBUFBOUND_H
/*==============================================================================

FILE:  AEEBufBound.h

SERVICES:
        BufBound APIs

GENERAL DESCRIPTION:
        BufBound provides a "bounded buffer" API that facilitates
          measuring strings or character output.  It's design accomodates
          the implementation of functions that can have the same exact logic
          for measuring and outputting char buffer content.

REVISION HISTORY:
        Fri Aug 08 17:38:29 2003: Created

==============================================================================*/

typedef struct BufBound
{
	char *pcBuf;   /* original buffer */
	char *pcWrite; /* write pointer */
	char *pcEnd;   /* first illegal write pointer */
} BufBound;

#ifdef __cplusplus
extern "C" {
#endif /* #ifdef __cplusplus */

extern void BufBound_Init(BufBound *me, char *pBuf, int nLen);
extern void BufBound_Write(BufBound *me, const char *pc, int nLen);
extern void BufBound_Putc(BufBound *me, char c);
extern void BufBound_Putnc(BufBound *me, char c, int nCount);
extern void BufBound_ForceNullTerm(BufBound *me);
extern void BufBound_Puts(BufBound *me, const char *cpsz);
extern void BufBound_Advance(BufBound *me, int nLen);
extern void BufBound_WriteLE(BufBound *me,
                             const void *pvSrc, int nSrcSize,
                             const char *pszFields);
extern void BufBound_WriteBE(BufBound *me,
                             const void *pvSrc, int nSrcSize,
                             const char *pszFields);
extern int BufBound_BufSize(BufBound *me);
extern int BufBound_Left(BufBound *me);
extern int BufBound_ReallyWrote(BufBound *me);
extern int BufBound_Wrote(BufBound *me);

static __inline int BufBound_IsFull(BufBound *me)
{
	return (BufBound_Left(me) <= 0);
}

// Deprecated:
static __inline int BufBound_IsCounter(BufBound *me)
{
	return BufBound_BufSize(me) == 0;
}

#ifdef __cplusplus
}
#endif /* #ifdef __cplusplus */


/*=====================================================================
=======================================================================
DATA STRUCTURE DOCUMENTATION
=======================================================================

BufBound

Description:
   An BufBound keeps track of whether appending to a bounded buffer
    has overflowed.

Definition:
   typedef struct BufBound
   {
      char* pcBuf;
      char* pcWrite;
      char* pcEnd;
   } BufBound;

Members:
      pcBuf: original start pointer
      pcWrite: current write location
      pcEnd: first illegal write position

See Also:
      BufBound Interface

=======================================================================
INTERFACE DOCUMENTATION
=======================================================================
BufBound Interface

  BufBound is a statically-linked interface.

  BufBound provides functions for safely appending to a character buffer.  On
  initialization, the buffer start address and size are provided.  Subsequent
  write operations are checked against the buffer bounds.

  Once the buffer bounds are exceeded, no bytes will be written but the
  BufBound will continue to increment its internal "write pointer" to reflect
  the number of bytes that would have been written (had the bounds not been
  exceeded).

  When initialized with a buffer size of zero, a BufBound simply counts the
  number of bytes that would be required to contain the result.  This design
  accommodates implementations that use the same logic for generating output
  and measuring the space required for generated output.

  BufBound protects clients from numerical overflow by limiting the write
  pointer to a maximum offset of INT_MAX from the start of the buffer.
  Functions that write data into the buffer safely ignore negative size inputs
  (Write and Putnc).

=======================================================================
BufBound_Init()

Description:
   initialize a BufBound for appending to a buffer

Prototype:

   void BufBound_Init(BufBound *me, char *pBuf, int nLen);

Parameters:
   me: the BufBound
   pBuf: the bounded buffer
   nLen: size of pBuf, in bytes

Return Value:
   None

Comments:
   None

Side Effects:
   None

See Also:
   None

=======================================================================

BufBound_Write()

Description:
   Appends some number of bytes to a BufBound, if possible.

   When a negative size is passed, it is safely treated as zero.

Prototype:

   void BufBound_Write(BufBound *me, const char *pc, int nLen);

Parameters:
   me: the BufBound
   pc: pointer to bytes to append
   int nLen: number of bytes to write

Return Value:
   None

Comments:
   If the BufBound has overflowed, no bytes are written, but pcWrite is
      *always* advanced by nLen.

Side Effects:
   None

See Also:
   None

=======================================================================

BufBound_Advance()

Description:

   Moves the write pointer.  Advance is like a relative seek operation.  It
   does not change the contents of the buffer, so when using a forward seek
   (positive advance) be careful of advancing over uninitialized data.

   Negative numbers will decrease the write pointer down to 0 (the start of
   the buffer) and not below.  Positive numbers will increase the write
   pointer up to offset INT_MAX and not beyond.

Prototype:

   void BufBound_Advance(BufBound *me, int nDelta);

Parameters:
   me: the BufBound
   int nLen: number of bytes to advance

Return Value:
   None

Comments:
   None

Side Effects:
   None

See Also:
   None

=======================================================================

BufBound_Putc()

Description:
   Appends one byte to a BufBound, if possible.

Prototype:

   void BufBound_Putc(BufBound *me, char c);

Parameters:
   me: the BufBound
   c: the byte

Return Value:
   None

Comments:
   If the BufBound has overflowed, no byte is written, but pcWrite is
      *always* advanced by 1.

Side Effects:
   None

See Also:
   None


=======================================================================

BufBound_Putnc()

Description:
   Appends a byte to a BufBound repeatedly.

   When a negative size is passed, it is safely treated as zero.

Prototype:

   void BufBound_Putnc(BufBound *me, char c, int nCount);

Parameters:
   me: the BufBound
   c: the byte
   nCount: number of times to append c

Return Value:
   None

Comments:
   If the BufBound has overflowed, no byte is written, but pcWrite is
      *always* advanced by nCount.

Side Effects:
   None

See Also:
   None


=======================================================================

BufBound_ForceNullTerm()

Description:
   Appends a null terminating character to a BufBound, if possible.
     If the BufBound has overflowed, the last legal location is
     set to '\0'.

Prototype:
   void BufBound_ForceNullTerm(BufBound *me);

Parameters:
   me: the BufBound

Return Value:
   None

Comments:
   pcWrite is *always* advanced by 1.

Side Effects:
   None

See Also:
   None


=======================================================================

BufBound_Puts()

Description:
   Appends a null-terminated string to a BufBound, if possible

Prototype:

   void BufBound_Puts(BufBound *me, const char* cpsz);

Parameters:
   me: the BufBound
   cpsz: the string to append

Return Value:

Comments:
   If the BufBound has overflowed, no bytes are written, but pcWrite is
      *always* advanced by strlen(cpsz).

Side Effects:
   None

See Also:
   None


=======================================================================

BufBound_BufSize()

Description:
   Returns the size of the buffer owned by the BufBound.  This is
   the same as the number passed to BufBound_Init (MAXed with zero).

Prototype:

   int BufBound_IsCounter(BufBound* me);

Parameters:
   me: the BufBound

Return Value:
   1 if the BufBound is a counter, 0 otherwise

Comments:
   None

Side Effects:
   None

See Also:
   None


=======================================================================

BufBound_Left()

Description:
   Returns the number of bytes the BufBound can still accomodate,
   without overflowing.  If overflow has occurred, it will return
   a negative number.

Prototype:

   int BufBound_Left(BufBound* me);

Parameters:
    me: the BufBound

Return Value:
   The number of bytes the BufBound can still accomodate,
     without overflowing.

Comments:
   The return value may be negative, if overflow has already occurred.

Side Effects:
   None

See Also:
   None


=======================================================================

BufBound_ReallyWrote()

Description:
   Returns the number of bytes actually written to the BufBound,
     not including any overflow.

Prototype:

   int BufBound_ReallyWrote(BufBound* me);

Parameters:
    me: the BufBound

Return Value:
   The number of bytes actually written to the BufBound,
     not including any overflow.

Comments:
   None

Side Effects:
   None

See Also:
   None


=======================================================================

BufBound_Wrote()

Description:

   Returns the number of bytes written to the BufBound, including any
   overflow, up to INT_MAX.

Prototype:

   int BufBound_Wrote(BufBound* me);

Parameters:
    me: the BufBound

Return Value:

   The number of bytes written to the BufBound, including any overflow.

Comments:
   None

Side Effects:
   None

See Also:
   None


=======================================================================

BufBound_IsFull()

Description:
   Tests whether an AEEBuffBound has overflowed.

Prototype:

   int BufBound_IsFull(BufBound* me);

Parameters:
    me: the BufBound

Return Value:
   1 if the BufBound has overflowed, 0 otherwise

Comments:
   None

Side Effects:
   None

See Also:
   None

=======================================================================

BufBound_WriteLE()

Description:

   Writes data while translating numeric values between host byte ordering and
   "little endian" byte ordering.

   The input buffer is treated as an array of structures.  The 'abySizes'
   parameter describes the sizes of fields in the structure.

   When the host byte ordering matches the target byte ordering (little
   endian) this operation is equivalent to BufBound_Write().

Prototype:

   void BufBound_WriteLE(BufBound* me,
                         const void *pvSrc, int nSrcSize,
                         const unsigned char *pszFields);

Parameters:
   me:        the BufBound
   pvSrc:     the source buffer
   nSrcSize:  number of bytes to copy from the source buffer
   pszFields: Description of the fields that comprise the source data,
              as defined in std_CopyLE.

Return Value:
   None

See Also:
   BufBound_WriteBE, std_CopyLE

=======================================================================

BufBound_WriteBE()

Description:

   BufBounf_WriteBE() has the same semantics as BufBound_WriteLE() except it
   copies between host byte ordering and big-endian ("network") byte order.

   See BufBound_WriteLE() for more details.


Prototype:

   void BufBound_WriteBE(BufBound* me,
                         const void *pvSrc, int nSrcSize,
                         const unsigned char *pszFields);

Parameters:
   me:        the BufBound
   pvSrc:     the source buffer
   nSrcSize:  number of bytes to copy from the source buffer
   pszFields: Description of the fields that comprise the source data,
              as defined in std_CopyLE.

Return Value:
   None

See Also:
   BufBound_WriteLE, std_CopyBE

======================================================================= */
#endif /* #ifndef AEEBUFBOUND_H */