OpenClonk
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros
C4StringTable.cpp
Go to the documentation of this file.
1 /*
2  * OpenClonk, http://www.openclonk.org
3  *
4  * Copyright (c) 2001-2009, RedWolf Design GmbH, http://www.clonk.de/
5  * Copyright (c) 2009-2016, The OpenClonk Team and contributors
6  *
7  * Distributed under the terms of the ISC license; see accompanying file
8  * "COPYING" for details.
9  *
10  * "Clonk" is a registered trademark of Matthes Bender, used with permission.
11  * See accompanying file "TRADEMARK" for details.
12  *
13  * To redistribute this file separately, substitute the full license texts
14  * for the above references.
15  */
16 /* string table: holds all strings used by script engine */
17 
18 #include "C4Include.h"
19 #include "script/C4StringTable.h"
20 
21 
22 // *** C4Set
23 template<> template<>
24 unsigned int C4Set<C4String *>::Hash<const char *>(const char * const & s)
25 {
26  // Fowler/Noll/Vo hash
27  unsigned int h = 2166136261u;
28  const char * p = s;
29  while (*p)
30  h = (h ^ *(p++)) * 16777619;
31  return h;
32 }
33 
34 template<> template<>
35 bool C4Set<C4String *>::Equals<const char *>(C4String * const & a, const char * const & b)
36 {
37  return a->GetData() == b;
38 }
39 
40 // *** C4String
41 
42 C4String::C4String(StdStrBuf strString)
43 {
44  // take string
45  Data.Take(std::move(strString));
46  Hash = Strings.Set.Hash(Data.getData());
47  // reg
48  Strings.Set.Add(this);
49 }
50 
51 C4String::C4String() = default;
52 
54 {
55  // unreg
56 #ifdef _DEBUG
57  static bool remove = false;
58  assert(!remove); (void)remove;
59  remove = true;
60 #endif
61  Strings.Set.Remove(this);
62 #ifdef _DEBUG
63  remove = false;
64 #endif
65 }
66 
67 void C4String::operator=(const char * s)
68 {
69  assert(!RefCnt);
70  assert(!Data);
71  // ref string
72  Data.Ref(s);
73  Hash = Strings.Set.Hash(Data.getData());
74  // reg
75  Strings.Set.Add(this);
76 }
77 
78 // *** C4StringTable
79 
81 {
82  P[P_Prototype] = "Prototype";
83  P[P_Name] = "Name";
84  P[P_Priority] = "Priority";
85  P[P_Interval] = "Interval";
86  P[P_CommandTarget] = "CommandTarget";
87  P[P_Time] = "Time";
88  P[P_Construction] = "Construction";
89  P[P_Destruction] = "Destruction";
90  P[P_Start] = "Start";
91  P[P_Stop] = "Stop";
92  P[P_Timer] = "Timer";
93  P[P_Effect] = "Effect";
94  P[P_Damage] = "Damage";
95  P[P_Collectible] = "Collectible";
96  P[P_Touchable] = "Touchable";
97  P[P_ActMap] = "ActMap";
98  P[P_Procedure] = "Procedure";
99  P[P_Speed] = "Speed";
100  P[P_Accel] = "Accel";
101  P[P_Decel] = "Decel";
102  P[P_Attach] = "Attach";
103  P[P_Directions] = "Directions";
104  P[P_FlipDir] = "FlipDir";
105  P[P_Length] = "Length";
106  P[P_Delay] = "Delay";
107  P[P_X] = "X";
108  P[P_Y] = "Y";
109  P[P_x] = "x";
110  P[P_y] = "y";
111  P[P_Wdt] = "Wdt";
112  P[P_Hgt] = "Hgt";
113  P[P_wdt] = "wdt";
114  P[P_hgt] = "hgt";
115  P[P_Vertices] = "Vertices";
116  P[P_Edges] = "Edges";
117  P[P_LineWidth] = "LineWidth";
118  P[P_OffX] = "OffX";
119  P[P_OffY] = "OffY";
120  P[P_Proplist] = "Proplist";
121  P[P_proplist] = "proplist";
122  P[P_FacetBase] = "FacetBase";
123  P[P_FacetTopFace] = "FacetTopFace";
124  P[P_FacetTargetStretch] = "FacetTargetStretch";
125  P[P_NextAction] = "NextAction";
126  P[P_Hold] = "Hold";
127  P[P_Idle] = "Idle";
128  P[P_NoOtherAction] = "NoOtherAction";
129  P[P_StartCall] = "StartCall";
130  P[P_EndCall] = "EndCall";
131  P[P_AbortCall] = "AbortCall";
132  P[P_PhaseCall] = "PhaseCall";
133  P[P_Sound] = "Sound";
134  P[P_ObjectDisabled] = "ObjectDisabled";
135  P[P_DigFree] = "DigFree";
136  P[P_InLiquidAction] = "InLiquidAction";
137  P[P_TurnAction] = "TurnAction";
138  P[P_Reverse] = "Reverse";
139  P[P_Step] = "Step";
140  P[P_Animation] = "Animation";
141  P[P_Action] = "Action";
142  P[P_Visibility] = "Visibility";
143  P[P_Parallaxity] = "Parallaxity";
144  P[P_LineColors] = "LineColors";
145  P[P_LineAttach] = "LineAttach";
146  P[P_MouseDrag] = "MouseDrag";
147  P[P_MouseDragImage] = "MouseDragImage";
148  P[P_PictureTransformation] = "PictureTransformation";
149  P[P_MeshTransformation] = "MeshTransformation";
150  P[P_BreatheWater] = "BreatheWater";
151  P[P_CorrosionResist] = "CorrosionResist";
152  P[P_MaxEnergy] = "MaxEnergy";
153  P[P_MaxBreath] = "MaxBreath";
154  P[P_ThrowSpeed] = "ThrowSpeed";
155  P[P_Mode] = "Mode";
156  P[P_CausedBy] = "CausedBy";
157  P[P_Blasted] = "Blasted";
158  P[P_IncineratingObj] = "IncineratingObj";
159  P[P_Plane] = "Plane";
160  P[P_BorderBound] = "BorderBound";
161  P[P_ContactCalls] = "ContactCalls";
162  P[P_SolidMaskPlane] = "SolidMaskPlane";
163  P[P_Tooltip] = "Tooltip";
164  P[P_Placement] = "Placement";
165  P[P_ContainBlast] = "ContainBlast";
166  P[P_BlastIncinerate] = "BlastIncinerate";
167  P[P_ContactIncinerate] = "ContactIncinerate";
168  P[P_Global] = "Global";
169  P[P_Scenario] = "Scenario";
170  P[P_JumpSpeed] = "JumpSpeed";
171  P[P_BackgroundColor] = "BackgroundColor";
172  P[P_Decoration] = "Decoration";
173  P[P_Symbol] = "Symbol";
174  P[P_Target] = "Target";
175  P[P_Std] = "Std";
176  P[P_Text] = "Text";
177  P[P_GraphicsName] = "GraphicsName";
178  P[P_OnClick] = "OnClick";
179  P[P_OnMouseIn] = "OnMouseIn";
180  P[P_OnMouseOut] = "OnMouseOut";
181  P[P_OnClose] = "OnClose";
182  P[P_ID] = "ID";
183  P[P_Style] = "Style";
184  P[P_Player] = "Player";
185  P[P_Margin] = "Margin";
186  P[P_Algo] = "Algo";
187  P[P_Layer] = "Layer";
188  P[P_Seed] = "Seed";
189  P[P_Ratio] = "Ratio";
190  P[P_FixedOffset] = "FixedOffset";
191  P[P_Op] = "Op";
192  P[P_R] = "R";
193  P[P_Scale] = "Scale";
194  P[P_Amplitude] = "Amplitude";
195  P[P_Iterations] = "Iterations";
196  P[P_Empty] = "Empty";
197  P[P_Open] = "Open";
198  P[P_Left] = "Left";
199  P[P_Top] = "Top";
200  P[P_Right] = "Right";
201  P[P_Bottom] = "Bottom";
202  P[P_Filter] = "Filter";
203  P[P_ForceX] = "ForceX";
204  P[P_ForceY] = "ForceY";
205  P[P_G] = "G";
206  P[P_B] = "B";
207  P[P_Alpha] = "Alpha";
208  P[P_DampingX] = "DampingX";
209  P[P_DampingY] = "DampingY";
210  P[P_Size] = "Size";
211  P[P_Rotation] = "Rotation";
212  P[P_BlitMode] = "BlitMode";
213  P[P_Phase] = "Phase";
214  P[P_Stretch] = "Stretch";
215  P[P_CollisionVertex] = "CollisionVertex";
216  P[P_CollisionDensity] = "CollisionDensity";
217  P[P_OnCollision] = "OnCollision";
218  P[P_Distance] = "Distance";
219  P[P_Smoke] = "Smoke";
220  P[P_Source] = "Source";
221  P[P_Color] = "Color";
222  P[P_EditCursorCommands] = "EditCursorCommands";
223  P[P_IsPointContained] = "IsPointContained";
224  P[P_GetRandomPoint] = "GetRandomPoint";
225  P[P_Type] = "Type";
226  P[P_Reverb_Density] = "Reverb_Density";
227  P[P_Reverb_Diffusion] = "Reverb_Diffusion";
228  P[P_Reverb_Gain] = "Reverb_Gain";
229  P[P_Reverb_GainHF] = "Reverb_GainHF";
230  P[P_Reverb_Decay_Time] = "Reverb_Decay_Time";
231  P[P_Reverb_Decay_HFRatio] = "Reverb_Decay_HFRatio";
232  P[P_Reverb_Reflections_Gain] = "Reverb_Reflections_Gain";
233  P[P_Reverb_Reflections_Delay] = "Reverb_Reflections_Delay";
234  P[P_Reverb_Late_Reverb_Gain] = "Reverb_Late_Reverb_Gain";
235  P[P_Reverb_Late_Reverb_Delay] = "Reverb_Late_Reverb_Delay";
236  P[P_Reverb_Air_Absorption_GainHF] = "Reverb_Air_Absorption_GainHF";
237  P[P_Reverb_Room_Rolloff_Factor] = "Reverb_Room_Rolloff_Factor";
238  P[P_Reverb_Decay_HFLimit] = "Reverb_Decay_HFLimit";
239  P[P_Echo_Delay] = "Echo_Delay";
240  P[P_Echo_LRDelay] = "Echo_LRDelay";
241  P[P_Echo_Damping] = "Echo_Damping";
242  P[P_Echo_Feedback] = "Echo_Feedback";
243  P[P_Echo_Spread] = "Echo_Spread";
244  P[P_Equalizer_Low_Gain] = "Equalizer_Low_Gain";
245  P[P_Equalizer_Low_Cutoff] = "Equalizer_Low_Cutoff";
246  P[P_Equalizer_Mid1_Gain] = "Equalizer_Mid1_Gain";
247  P[P_Equalizer_Mid1_Center] = "Equalizer_Mid1_Center";
248  P[P_Equalizer_Mid1_Width] = "Equalizer_Mid1_Width";
249  P[P_Equalizer_Mid2_Gain] = "Equalizer_Mid2_Gain";
250  P[P_Equalizer_Mid2_Center] = "Equalizer_Mid2_Center";
251  P[P_Equalizer_Mid2_Width] = "Equalizer_Mid2_Width";
252  P[P_Equalizer_High_Gain] = "Equalizer_High_Gain";
253  P[P_Equalizer_High_Cutoff] = "Equalizer_High_Cutoff";
254  P[P_LightOffset] = "LightOffset";
255  P[P_PlayList] = "PlayList";
256  P[P_MusicBreakMin] = "MusicBreakMin";
257  P[P_MusicBreakMax] = "MusicBreakMax";
258  P[P_MusicBreakChance] = "MusicBreakChance";
259  P[P_MusicMaxPositionMemory] = "MusicMaxPositionMemory";
260  P[P_InflameLandscape] = "InflameLandscape";
261  P[P_OptionKey] = "OptionKey";
262  P[P_ValueKey] = "ValueKey";
263  P[P_Value] = "Value";
264  P[P_DefaultValueFunction] = "DefaultValueFunction";
265  P[P_Delegate] = "Delegate";
266  P[P_VertexDelegate] = "VertexDelegate";
267  P[P_EdgeDelegate] = "EdgeDelegate";
268  P[P_HorizontalFix] = "HorizontalFix";
269  P[P_VerticalFix] = "VerticalFix";
270  P[P_StructureFix] = "StructureFix";
271  P[P_OnUpdate] = "OnUpdate";
272  P[P_EditorPropertyChanged] = "EditorPropertyChanged";
273  P[P_Min] = "Min";
274  P[P_Max] = "Max";
275  P[P_Set] = "Set";
276  P[P_SetGlobal] = "SetGlobal";
277  P[P_SetRoot] = "SetRoot";
278  P[P_Options] = "Options";
279  P[P_Key] = "Key";
280  P[P_AsyncGet] = "AsyncGet";
281  P[P_Get] = "Get";
282  P[P_Relative] = "Relative";
283  P[P_CanMoveCenter] = "CanMoveCenter";
284  P[P_StartFromObject] = "StartFromObject";
285  P[P_Storage] = "Storage";
286  P[P_Elements] = "Elements";
287  P[P_EditOnSelection] = "EditOnSelection";
288  P[P_EditorProps] = "EditorProps";
289  P[P_DefaultEditorProp] = "DefaultEditorProp";
290  P[P_EditorActions] = "EditorActions";
291  P[P_CopyDefault] = "CopyDefault";
292  P[P_Display] = "Display";
293  P[P_DefaultValue] = "DefaultValue";
294  P[P_DefinitionPriority] = "DefinitionPriority";
295  P[P_Group] = "Group";
296  P[P_Command] = "Command";
297  P[P_Select] = "Select";
298  P[P_DescendPath] = "DescendPath";
299  P[P_EmptyName] = "EmptyName";
300  P[P_ShortName] = "ShortName";
301  P[P_EditorHelp] = "EditorHelp";
302  P[P_Description] = "Description";
303  P[P_AllowEditing] = "AllowEditing";
304  P[P_EditorInitialize] = "EditorInitialize";
305  P[P_EditorPlacementLimit] = "EditorPlacementLimit";
306  P[P_EditorCollection] = "EditorCollection";
307  P[P_Sorted] = "Sorted";
308  P[P_Uniforms] = "Uniforms";
309  P[P_ForceSerialization] = "ForceSerialization";
310  P[P_DrawArrows] = "DrawArrows";
311  P[P_SCENPAR] = "SCENPAR";
312  P[P_Translatable] = "Translatable";
313  P[P_Function] = "Function";
314  P[P_Translate] = "Translate";
315  P[DFA_WALK] = "WALK";
316  P[DFA_FLIGHT] = "FLIGHT";
317  P[DFA_KNEEL] = "KNEEL";
318  P[DFA_SCALE] = "SCALE";
319  P[DFA_HANGLE] = "HANGLE";
320  P[DFA_DIG] = "DIG";
321  P[DFA_SWIM] = "SWIM";
322  P[DFA_THROW] = "THROW";
323  P[DFA_BRIDGE] = "BRIDGE";
324  P[DFA_PUSH] = "PUSH";
325  P[DFA_LIFT] = "LIFT";
326  P[DFA_FLOAT] = "FLOAT";
327  P[DFA_ATTACH] = "ATTACH";
328  P[DFA_CONNECT] = "CONNECT";
329  P[DFA_PULL] = "PULL";
330  // Prevent the individual strings from being deleted, they are not created with new
331  for (auto & i : P)
332  {
333  assert(i.GetCStr()); // all strings should be assigned
334  i.IncRef();
335  }
336 }
337 
339 {
340 #ifdef _DEBUG
341  if(Set.GetSize() != P_LAST)
342  {
343  for (C4String * const * s = Set.First(); s; s = Set.Next(s))
344  {
345  if (*s >= &Strings.P[0] && *s < &Strings.P[P_LAST])
346  {
347  if ((*s)->RefCnt != 1)
348 #ifdef _WIN32
349  OutputDebugString(FormatString(" \"%s\" %d\n", (*s)->GetCStr(), (*s)->RefCnt).GetWideChar());
350 #else
351  fprintf(stderr, " \"%s\" %d\n", (*s)->GetCStr(), (*s)->RefCnt);
352 #endif
353  }
354  else
355 #ifdef _WIN32
356  OutputDebugString(FormatString("\"%s\" %d\n", (*s)->GetCStr(), (*s)->RefCnt).GetWideChar());
357 #else
358  fprintf(stderr, "\"%s\" %d\n", (*s)->GetCStr(), (*s)->RefCnt);
359 #endif
360  }
361  }
362 #endif
363  assert(Set.GetSize() == P_LAST);
364 }
365 
367 {
368  C4String * s = FindString(String.getData());
369  if (s)
370  return s;
371  else
372  return new C4String(String);
373 }
374 
375 C4String *C4StringTable::FindString(const char *strString) const
376 {
377  return Set.Get(strString);
378 }
const char * getData() const
Definition: StdBuf.h:442
C4String P[P_LAST]
void IncRef()
Definition: C4StringTable.h:27
T * Add(T const &e)
C4String * String(const char *str)
Definition: C4AulDefFunc.h:30
#define b
C4String * FindString(const char *strString) const
StdStrBuf::wchar_t_holder GetWideChar(const char *utf8, bool double_null_terminate=false)
static unsigned int Hash(const H &)
friend class C4String
C4String * RegString(StdStrBuf String)
#define a
virtual ~C4StringTable()
T & Get(H e) const
T const * Next(T const *p) const
unsigned int GetSize() const
C4StringTable Strings
Definition: C4Globals.cpp:42
unsigned int RefCnt
Definition: C4StringTable.h:31
void Take(char *pnData)
Definition: StdBuf.h:457
unsigned int Hash
Definition: C4StringTable.h:37
void Remove(H e)
~C4String() override
void Ref(const char *pnData)
Definition: StdBuf.h:455
T const * First() const
#define s
StdStrBuf FormatString(const char *szFmt,...)
Definition: StdBuf.cpp:270