blob: add168307bf03c737341c4bf7d9221e7afe65fe8 (
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
|
#include "quark.hpp"
#include "angband.h"
#include <cassert>
/*
* The number of quarks
*/
static s16b quark__num = 0;
/*
* The pointers to the quarks [QUARK_MAX]
*/
static cptr *quark__str = NULL;
/*
* Initialize the quark subsystem
*/
void quark_init()
{
quark__num = 0;
quark__str = new cptr[QUARK_MAX];
for (int i = 0; i < QUARK_MAX; i++) {
quark__str[i] = nullptr;
}
}
/*
* We use a global array for all inscriptions to reduce the memory
* spent maintaining inscriptions. Of course, it is still possible
* to run out of inscription memory, especially if too many different
* inscriptions are used, but hopefully this will be rare.
*
* We use dynamic string allocation because otherwise it is necessary
* to pre-guess the amount of quark activity. We limit the total
* number of quarks, but this is much easier to "expand" as needed.
*
* Any two items with the same inscription will have the same "quark"
* index, which should greatly reduce the need for inscription space.
*
* Note that "quark zero" is NULL and should not be "dereferenced".
*/
/*
* Add a new "quark" to the set of quarks.
*/
s16b quark_add(cptr str)
{
assert(str != nullptr);
int i;
/* Look for an existing quark */
for (i = 1; i < quark__num; i++)
{
/* Check for equality */
if (streq(quark__str[i], str)) return (i);
}
/* Paranoia -- Require room */
if (quark__num == QUARK_MAX) return (0);
/* New maximal quark */
quark__num = i + 1;
/* Add a new quark */
quark__str[i] = strdup(str);
/* Return the index */
return (i);
}
/*
* This function looks up a quark
*/
cptr quark_str(s16b i)
{
cptr q;
/* Verify */
if ((i < 0) || (i >= quark__num)) i = 0;
/* Access the quark */
q = quark__str[i];
/* Return the quark */
return (q);
}
|