77c8d9953492f11a33653266c83cf3ea0029c227
[tpg/acess2.git] / Kernel / adt.c
1 /*
2  * Acess2 Kernel
3  * 
4  * adt.c
5  * - Complex data type code
6  */
7 #include <acess.h>
8 #include <adt.h>
9
10
11 // === CODE ===
12 // --- Ring Buffers ---
13 tRingBuffer *RingBuffer_Create(size_t Space)
14 {
15         tRingBuffer     *ret = malloc(sizeof(tRingBuffer)+Space);
16         ret->Start = 0;
17         ret->Length = 0;
18         ret->Space = Space;
19         return ret;
20 }
21
22 size_t RingBuffer_Read(void *Dest, tRingBuffer *Buffer, size_t Length)
23 {
24         if(Length > Buffer->Length)     Length = Buffer->Length;
25         
26         if( Buffer->Start + Length > Buffer->Space )
27         {
28                  int    endData = Buffer->Space - Buffer->Start;
29                 memcpy(Dest, &Buffer->Data[Buffer->Start], endData);
30                 memcpy((Uint8*)Dest + endData, &Buffer->Data, Length - endData);
31         }
32         else
33         {
34                 memcpy(Dest, &Buffer->Data[Buffer->Start], Length);
35         }
36         Buffer->Start += Length;
37         if( Buffer->Start > Buffer->Space )
38                 Buffer->Start -= Buffer->Space;
39         Buffer->Length -= Length;
40         return Length;
41 }
42
43 size_t RingBuffer_Write(tRingBuffer *Buffer, const void *Source, size_t Length)
44 {
45         size_t  bufEnd = Buffer->Start + Buffer->Length;
46         size_t  endSpace = Buffer->Space - bufEnd;
47         
48         // Force to bounds
49         if(Length > Buffer->Space - Buffer->Length)
50                 Length = Buffer->Space - Buffer->Length;
51         
52         if(endSpace < Length)
53         {
54                 memcpy( &Buffer->Data[bufEnd], Source, endSpace );
55                 memcpy( Buffer->Data, (Uint8*)Source + endSpace, Length - endSpace );
56                 Buffer->Length = Length - endSpace;
57         }
58         else
59         {
60                 memcpy( &Buffer->Data[bufEnd], Source, Length );
61                 Buffer->Length += Length;
62         }
63         
64         return Length;
65 }

UCC git Repository :: git.ucc.asn.au