UFO: Alien Invasion
Loading...
Searching...
No Matches
stringhunk.cpp
Go to the documentation of this file.
1
5
6/*
7Copyright (C) 2002-2025 UFO: Alien Invasion.
8
9This program is free software; you can redistribute it and/or
10modify it under the terms of the GNU General Public License
11as published by the Free Software Foundation; either version 2
12of the License, or (at your option) any later version.
13
14This program is distributed in the hope that it will be useful,
15but WITHOUT ANY WARRANTY; without even the implied warranty of
16MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17
18See the GNU General Public License for more details.
19
20You should have received a copy of the GNU General Public License
21along with this program; if not, write to the Free Software
22Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
23
24*/
25
26#include "stringhunk.h"
27#include "../common/common.h"
28
32bool STRHUNK_Add (stringHunk_t* hunk, const char* string)
33{
34 const ptrdiff_t filled = hunk->pos - hunk->hunk;
35 const size_t remaining = hunk->size - filled;
36 const size_t strLength = strlen(string);
37 const bool overflow = remaining <= strLength;
38
39 if (remaining < 1)
40 return false;
41
42 /* add delimiter char. */
43 if (hunk->pos != hunk->hunk) {
44 if (remaining == 1)
45 return false;
46 *hunk->pos++ = '\xFF';
47 }
48
49 Q_strncpyz(hunk->pos, string, remaining - 1);
50 hunk->pos += overflow ? remaining - 1: strLength + 1;
51 hunk->entries++;
52 return !overflow;
53}
54
56{
57 hunk->pos = hunk->hunk;
58 hunk->entries = 0;
59 hunk->hunk[0] = '\0';
60}
61
63{
64 const char* string = hunk->hunk;
65
66 if (hunk->entries == 0)
67 return;
68
69 for (;;) {
70 visitor(string);
71 string += strlen(string) + 1;
72 if (*string != '\xFF')
73 break;
74 string++;
75 }
76}
77
78int STRHUNK_Size (const stringHunk_t* hunk)
79{
80 return hunk->entries;
81}
82
84{
85 return hunk->size - (ptrdiff_t)(hunk->pos - hunk->hunk);
86}
87
89{
91 strHunk->size = size;
92 strHunk->hunk = Mem_AllocTypeN(char, size);
93 strHunk->pos = strHunk->hunk;
94 return strHunk;
95}
96
98{
99 Mem_Free(*hunk);
100 *hunk = nullptr;
101}
definitions common between client and server, but not game lib
voidpf void uLong size
Definition ioapi.h:42
#define Mem_Free(ptr)
Definition mem.h:35
#define Mem_AllocTypeN(type, n)
Definition mem.h:38
#define Mem_AllocType(type)
Definition mem.h:39
void Q_strncpyz(char *dest, const char *src, size_t destsize)
Safe strncpy that ensures a trailing zero.
Definition shared.cpp:457
bool STRHUNK_Add(stringHunk_t *hunk, const char *string)
stringHunk_t * STRHUNK_Create(size_t size)
void STRHUNK_Delete(stringHunk_t **hunk)
void STRHUNK_Visit(stringHunk_t *hunk, stringHunkVisitor_t visitor)
size_t STRHUNK_GetFreeSpace(const stringHunk_t *hunk)
int STRHUNK_Size(const stringHunk_t *hunk)
void STRHUNK_Reset(stringHunk_t *hunk)
Header for string hunk management.
void(* stringHunkVisitor_t)(const char *string)
Definition stringhunk.h:36
size_t size
Definition stringhunk.h:30
char * hunk
Definition stringhunk.h:32