Files
@ r20670:c15fc236f61a
Branch filter:
Location: cpp/openttd-patchpack/source/src/script/api/script_text.cpp - annotation
r20670:c15fc236f61a
5.2 KiB
text/x-c
(svn r25708) -Fix: don't return NULL as bool
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 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 | r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r20473:7d7140ae0710 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r20473:7d7140ae0710 r20473:7d7140ae0710 r18793:153ee1a0721f r18793:153ee1a0721f r18777:cf24fc430b51 r18793:153ee1a0721f r18793:153ee1a0721f r18793:153ee1a0721f r18793:153ee1a0721f r18793:153ee1a0721f r18793:153ee1a0721f r18793:153ee1a0721f r18793:153ee1a0721f r18793:153ee1a0721f r18793:153ee1a0721f r18793:153ee1a0721f r18793:153ee1a0721f r18793:153ee1a0721f r18793:153ee1a0721f r18793:153ee1a0721f r18793:153ee1a0721f r18793:153ee1a0721f r18793:153ee1a0721f r18793:153ee1a0721f r18793:153ee1a0721f r18793:153ee1a0721f r18793:153ee1a0721f r18793:153ee1a0721f r18793:153ee1a0721f r18793:153ee1a0721f r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r20531:6a7aeb0059d3 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r20531:6a7aeb0059d3 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r20025:983c2ed8d329 r20025:983c2ed8d329 r20025:983c2ed8d329 r18777:cf24fc430b51 r18777:cf24fc430b51 r20025:983c2ed8d329 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r20025:983c2ed8d329 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r20025:983c2ed8d329 r18777:cf24fc430b51 r18777:cf24fc430b51 r19952:fae8b96afc59 r20025:983c2ed8d329 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r18777:cf24fc430b51 r20473:7d7140ae0710 r20473:7d7140ae0710 r20473:7d7140ae0710 r20473:7d7140ae0710 r20473:7d7140ae0710 r20473:7d7140ae0710 r20473:7d7140ae0710 r20473:7d7140ae0710 r20474:5b60dd163564 r20474:5b60dd163564 r20473:7d7140ae0710 | /* $Id$ */
/*
* This file is part of OpenTTD.
* OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
* OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
*/
/** @file script_text.cpp Implementation of ScriptText. */
#include "../../stdafx.h"
#include "../../string_func.h"
#include "../../strings_func.h"
#include "script_text.hpp"
#include "../../table/control_codes.h"
#include "table/strings.h"
ScriptText::ScriptText(HSQUIRRELVM vm) :
ZeroedMemoryAllocator()
{
int nparam = sq_gettop(vm) - 1;
if (nparam < 1) {
throw sq_throwerror(vm, _SC("You need to pass at least a StringID to the constructor"));
}
/* First resolve the StringID. */
SQInteger sqstring;
if (SQ_FAILED(sq_getinteger(vm, 2, &sqstring))) {
throw sq_throwerror(vm, _SC("First argument must be a valid StringID"));
}
this->string = sqstring;
/* The rest of the parameters must be arguments. */
for (int i = 0; i < nparam - 1; i++) {
/* Push the parameter to the top of the stack. */
sq_push(vm, i + 3);
if (SQ_FAILED(this->_SetParam(i, vm))) {
this->~ScriptText();
throw sq_throwerror(vm, _SC("Invalid parameter"));
}
/* Pop the parameter again. */
sq_pop(vm, 1);
}
}
ScriptText::~ScriptText()
{
for (int i = 0; i < SCRIPT_TEXT_MAX_PARAMETERS; i++) {
free(this->params[i]);
if (this->paramt[i] != NULL) this->paramt[i]->Release();
}
}
SQInteger ScriptText::_SetParam(int parameter, HSQUIRRELVM vm)
{
if (parameter >= SCRIPT_TEXT_MAX_PARAMETERS) return SQ_ERROR;
free(this->params[parameter]);
if (this->paramt[parameter] != NULL) this->paramt[parameter]->Release();
this->parami[parameter] = 0;
this->params[parameter] = NULL;
this->paramt[parameter] = NULL;
switch (sq_gettype(vm, -1)) {
case OT_STRING: {
const SQChar *value;
sq_getstring(vm, -1, &value);
this->params[parameter] = strdup(SQ2OTTD(value));
ValidateString(this->params[parameter]);
break;
}
case OT_INTEGER: {
SQInteger value;
sq_getinteger(vm, -1, &value);
this->parami[parameter] = value;
break;
}
case OT_INSTANCE: {
SQUserPointer real_instance = NULL;
HSQOBJECT instance;
sq_getstackobj(vm, -1, &instance);
/* Validate if it is a GSText instance */
sq_pushroottable(vm);
sq_pushstring(vm, _SC("GSText"), -1);
sq_get(vm, -2);
sq_pushobject(vm, instance);
if (sq_instanceof(vm) != SQTrue) return SQ_ERROR;
sq_pop(vm, 3);
/* Get the 'real' instance of this class */
sq_getinstanceup(vm, -1, &real_instance, 0);
if (real_instance == NULL) return SQ_ERROR;
ScriptText *value = static_cast<ScriptText *>(real_instance);
value->AddRef();
this->paramt[parameter] = value;
break;
}
default: return SQ_ERROR;
}
if (this->paramc <= parameter) this->paramc = parameter + 1;
return 0;
}
SQInteger ScriptText::SetParam(HSQUIRRELVM vm)
{
if (sq_gettype(vm, 2) != OT_INTEGER) return SQ_ERROR;
SQInteger k;
sq_getinteger(vm, 2, &k);
if (k > SCRIPT_TEXT_MAX_PARAMETERS) return SQ_ERROR;
if (k < 1) return SQ_ERROR;
k--;
return this->_SetParam(k, vm);
}
SQInteger ScriptText::AddParam(HSQUIRRELVM vm)
{
SQInteger res;
res = this->_SetParam(this->paramc, vm);
if (res != 0) return res;
/* Push our own instance back on top of the stack */
sq_push(vm, 1);
return 1;
}
SQInteger ScriptText::_set(HSQUIRRELVM vm)
{
int32 k;
if (sq_gettype(vm, 2) == OT_STRING) {
const SQChar *key;
sq_getstring(vm, 2, &key);
const char *key_string = SQ2OTTD(key);
ValidateString(key_string);
if (strncmp(key_string, "param_", 6) != 0 || strlen(key_string) > 8) return SQ_ERROR;
k = atoi(key_string + 6);
} else if (sq_gettype(vm, 2) == OT_INTEGER) {
SQInteger key;
sq_getinteger(vm, 2, &key);
k = (int32)key;
} else {
return SQ_ERROR;
}
if (k > SCRIPT_TEXT_MAX_PARAMETERS) return SQ_ERROR;
if (k < 1) return SQ_ERROR;
k--;
return this->_SetParam(k, vm);
}
const char *ScriptText::GetEncodedText()
{
static char buf[1024];
int param_count = 0;
this->_GetEncodedText(buf, lastof(buf), param_count);
return (param_count > SCRIPT_TEXT_MAX_PARAMETERS) ? NULL : buf;
}
char *ScriptText::_GetEncodedText(char *p, char *lastofp, int ¶m_count)
{
p += Utf8Encode(p, SCC_ENCODED);
p += seprintf(p, lastofp, "%X", this->string);
for (int i = 0; i < this->paramc; i++) {
if (this->params[i] != NULL) {
p += seprintf(p, lastofp, ":\"%s\"", this->params[i]);
param_count++;
continue;
}
if (this->paramt[i] != NULL) {
p += seprintf(p, lastofp, ":");
p = this->paramt[i]->_GetEncodedText(p, lastofp, param_count);
continue;
}
p += seprintf(p, lastofp,":%X", (uint32)this->parami[i]);
param_count++;
}
return p;
}
const char *Text::GetDecodedText()
{
const char *encoded_text = this->GetEncodedText();
if (encoded_text == NULL) return NULL;
static char buf[1024];
::SetDParamStr(0, encoded_text);
::GetString(buf, STR_JUST_RAW_STRING, lastof(buf));
return buf;
}
|