7 const unsigned PathMagic = 0x9A783A16;
\r
17 static PathBuffer **g_PathBuffers;
\r
18 static unsigned g_PathBufferSize;
\r
20 static char *AllocBuffer(unsigned Size)
\r
25 // Is a free buffer that is big enough?
\r
26 for (unsigned i = 0; i < g_PathBufferSize; ++i)
\r
28 PathBuffer *PB = g_PathBuffers[i];
\r
29 asserta(PB->Magic == PathMagic);
\r
32 if (PB->Size >= Size)
\r
37 if (PB->Buffer == 0)
\r
39 unsigned Size2 = Size + 1024;
\r
40 PB->Buffer = MYALLOC(char, Size2, Path);
\r
48 // No available buffer, must expand g_PathBuffers[]
\r
49 unsigned NewPathBufferSize = g_PathBufferSize + 1024;
\r
50 PathBuffer **NewPathBuffers = MYALLOC(PathBuffer *, NewPathBufferSize, Path);
\r
52 for (unsigned i = 0; i < g_PathBufferSize; ++i)
\r
53 NewPathBuffers[i] = g_PathBuffers[i];
\r
55 for (unsigned i = g_PathBufferSize; i < NewPathBufferSize; ++i)
\r
57 PathBuffer *PB = MYALLOC(PathBuffer, 1, Path);
\r
58 PB->Magic = PathMagic;
\r
62 NewPathBuffers[i] = PB;
\r
65 PathBuffer *PB = NewPathBuffers[g_PathBufferSize];
\r
67 MYFREE(g_PathBuffers, g_PathBufferSize, Path);
\r
68 g_PathBuffers = NewPathBuffers;
\r
69 g_PathBufferSize = NewPathBufferSize;
\r
71 asserta(!PB->InUse && PB->Buffer == 0);
\r
73 unsigned Size2 = Size + 1024;
\r
74 PB->Buffer = MYALLOC(char, Size2, Path);
\r
80 static void FreeBuffer(char *Buffer)
\r
85 for (unsigned i = 0; i < g_PathBufferSize; ++i)
\r
87 PathBuffer *PB = g_PathBuffers[i];
\r
88 if (PB->Buffer == Buffer)
\r
96 Die("FreeBuffer, not found");
\r
99 void PathData::Alloc(unsigned MaxLen)
\r
101 if (MaxLen < Bytes)
\r
104 StartTimer(PathAlloc);
\r
110 Bytes = MaxLen + 1;
\r
111 Front = AllocBuffer(Bytes);
\r
112 Back = Front + Bytes - 1;
\r
114 EndTimer(PathAlloc);
\r
117 void PathData::Free()
\r
125 void PathData::Copy(const PathData &rhs)
\r
128 strcpy(Front, rhs.Front);
\r
129 Start = Front + (rhs.Start - rhs.Front);
\r
132 void PathData::FromStr(const char *PathStr)
\r
134 asserta(PathStr != 0);
\r
135 unsigned NeededBytes = (unsigned) strlen(PathStr) + 1;
\r
136 Alloc(NeededBytes);
\r
137 strcpy(Front, PathStr);
\r
141 void LogPathStats()
\r
144 unsigned Bytes = 0;
\r
145 for (unsigned i = 0; i < g_PathBufferSize; ++i)
\r
147 const PathBuffer *PB = g_PathBuffers[i];
\r
150 Log("%u paths allocated, total memory %u bytes\n", g_PathBufferSize, Bytes);
\r