1 //uchime by Robert C. Edgar http://drive5.com/uchime This code is donated to the public domain.
\r
9 const unsigned PathMagic = 0x9A783A16;
\r
19 static PathBuffer **g_PathBuffers;
\r
20 static unsigned g_PathBufferSize;
\r
22 static char *AllocBuffer(unsigned Size)
\r
27 // Is a free buffer that is big enough?
\r
28 for (unsigned i = 0; i < g_PathBufferSize; ++i)
\r
30 PathBuffer *PB = g_PathBuffers[i];
\r
31 asserta(PB->Magic == PathMagic);
\r
34 if (PB->Size >= Size)
\r
39 if (PB->Buffer == 0)
\r
41 unsigned Size2 = Size + 1024;
\r
42 PB->Buffer = MYALLOC(char, Size2, Path);
\r
50 // No available buffer, must expand g_PathBuffers[]
\r
51 unsigned NewPathBufferSize = g_PathBufferSize + 1024;
\r
52 PathBuffer **NewPathBuffers = MYALLOC(PathBuffer *, NewPathBufferSize, Path);
\r
54 for (unsigned i = 0; i < g_PathBufferSize; ++i)
\r
55 NewPathBuffers[i] = g_PathBuffers[i];
\r
57 for (unsigned i = g_PathBufferSize; i < NewPathBufferSize; ++i)
\r
59 PathBuffer *PB = MYALLOC(PathBuffer, 1, Path);
\r
60 PB->Magic = PathMagic;
\r
64 NewPathBuffers[i] = PB;
\r
67 PathBuffer *PB = NewPathBuffers[g_PathBufferSize];
\r
69 MYFREE(g_PathBuffers, g_PathBufferSize, Path);
\r
70 g_PathBuffers = NewPathBuffers;
\r
71 g_PathBufferSize = NewPathBufferSize;
\r
73 asserta(!PB->InUse && PB->Buffer == 0);
\r
75 unsigned Size2 = Size + 1024;
\r
76 PB->Buffer = MYALLOC(char, Size2, Path);
\r
82 static void FreeBuffer(char *Buffer)
\r
87 for (unsigned i = 0; i < g_PathBufferSize; ++i)
\r
89 PathBuffer *PB = g_PathBuffers[i];
\r
90 if (PB->Buffer == Buffer)
\r
98 Die("FreeBuffer, not found");
\r
101 void PathData::Alloc(unsigned MaxLen)
\r
103 if (MaxLen < Bytes)
\r
106 StartTimer(PathAlloc);
\r
112 Bytes = MaxLen + 1;
\r
113 Front = AllocBuffer(Bytes);
\r
114 Back = Front + Bytes - 1;
\r
116 EndTimer(PathAlloc);
\r
119 void PathData::Free()
\r
127 void PathData::Copy(const PathData &rhs)
\r
130 strcpy(Front, rhs.Front);
\r
131 Start = Front + (rhs.Start - rhs.Front);
\r
134 void PathData::FromStr(const char *PathStr)
\r
136 asserta(PathStr != 0);
\r
137 unsigned NeededBytes = (unsigned) strlen(PathStr) + 1;
\r
138 Alloc(NeededBytes);
\r
139 strcpy(Front, PathStr);
\r
143 void LogPathStats()
\r
146 unsigned Bytes = 0;
\r
147 for (unsigned i = 0; i < g_PathBufferSize; ++i)
\r
149 const PathBuffer *PB = g_PathBuffers[i];
\r
152 Log("%u paths allocated, total memory %u bytes\n", g_PathBufferSize, Bytes);
\r