1
0
Fork 0

(svn r22970) -Fix [FS#4769]: strip newlines from NewGRF strings that should not have newlines, e.g. the NewGRF's name

release/1.2
rubidium 2011-10-01 20:31:21 +00:00
parent 5c01ce91e6
commit 7de22e25da
3 changed files with 46 additions and 38 deletions

View File

@ -5153,15 +5153,15 @@ static void FeatureNewName(ByteReader *buf)
if (!generic) { if (!generic) {
Engine *e = GetNewEngine(_cur.grffile, (VehicleType)feature, id, HasBit(_cur.grfconfig->flags, GCF_STATIC)); Engine *e = GetNewEngine(_cur.grffile, (VehicleType)feature, id, HasBit(_cur.grfconfig->flags, GCF_STATIC));
if (e == NULL) break; if (e == NULL) break;
StringID string = AddGRFString(_cur.grffile->grfid, e->index, lang, new_scheme, name, e->info.string_id); StringID string = AddGRFString(_cur.grffile->grfid, e->index, lang, false, new_scheme, name, e->info.string_id);
e->info.string_id = string; e->info.string_id = string;
} else { } else {
AddGRFString(_cur.grffile->grfid, id, lang, new_scheme, name, STR_UNDEFINED); AddGRFString(_cur.grffile->grfid, id, lang, new_scheme, true, name, STR_UNDEFINED);
} }
break; break;
case GSF_INDUSTRIES: { case GSF_INDUSTRIES: {
AddGRFString(_cur.grffile->grfid, id, lang, new_scheme, name, STR_UNDEFINED); AddGRFString(_cur.grffile->grfid, id, lang, new_scheme, true, name, STR_UNDEFINED);
break; break;
} }
@ -5173,7 +5173,7 @@ static void FeatureNewName(ByteReader *buf)
grfmsg(1, "FeatureNewName: Attempt to name undefined station 0x%X, ignoring", GB(id, 0, 8)); grfmsg(1, "FeatureNewName: Attempt to name undefined station 0x%X, ignoring", GB(id, 0, 8));
} else { } else {
StationClassID cls_id = _cur.grffile->stations[GB(id, 0, 8)]->cls_id; StationClassID cls_id = _cur.grffile->stations[GB(id, 0, 8)]->cls_id;
StationClass::SetName(cls_id, AddGRFString(_cur.grffile->grfid, id, lang, new_scheme, name, STR_UNDEFINED)); StationClass::SetName(cls_id, AddGRFString(_cur.grffile->grfid, id, lang, new_scheme, false, name, STR_UNDEFINED));
} }
break; break;
@ -5181,7 +5181,7 @@ static void FeatureNewName(ByteReader *buf)
if (_cur.grffile->stations == NULL || _cur.grffile->stations[GB(id, 0, 8)] == NULL) { if (_cur.grffile->stations == NULL || _cur.grffile->stations[GB(id, 0, 8)] == NULL) {
grfmsg(1, "FeatureNewName: Attempt to name undefined station 0x%X, ignoring", GB(id, 0, 8)); grfmsg(1, "FeatureNewName: Attempt to name undefined station 0x%X, ignoring", GB(id, 0, 8));
} else { } else {
_cur.grffile->stations[GB(id, 0, 8)]->name = AddGRFString(_cur.grffile->grfid, id, lang, new_scheme, name, STR_UNDEFINED); _cur.grffile->stations[GB(id, 0, 8)]->name = AddGRFString(_cur.grffile->grfid, id, lang, new_scheme, false, name, STR_UNDEFINED);
} }
break; break;
@ -5189,7 +5189,7 @@ static void FeatureNewName(ByteReader *buf)
if (_cur.grffile->airtspec == NULL || _cur.grffile->airtspec[GB(id, 0, 8)] == NULL) { if (_cur.grffile->airtspec == NULL || _cur.grffile->airtspec[GB(id, 0, 8)] == NULL) {
grfmsg(1, "FeatureNewName: Attempt to name undefined airport tile 0x%X, ignoring", GB(id, 0, 8)); grfmsg(1, "FeatureNewName: Attempt to name undefined airport tile 0x%X, ignoring", GB(id, 0, 8));
} else { } else {
_cur.grffile->airtspec[GB(id, 0, 8)]->name = AddGRFString(_cur.grffile->grfid, id, lang, new_scheme, name, STR_UNDEFINED); _cur.grffile->airtspec[GB(id, 0, 8)]->name = AddGRFString(_cur.grffile->grfid, id, lang, new_scheme, false, name, STR_UNDEFINED);
} }
break; break;
@ -5197,7 +5197,7 @@ static void FeatureNewName(ByteReader *buf)
if (_cur.grffile->housespec == NULL || _cur.grffile->housespec[GB(id, 0, 8)] == NULL) { if (_cur.grffile->housespec == NULL || _cur.grffile->housespec[GB(id, 0, 8)] == NULL) {
grfmsg(1, "FeatureNewName: Attempt to name undefined house 0x%X, ignoring.", GB(id, 0, 8)); grfmsg(1, "FeatureNewName: Attempt to name undefined house 0x%X, ignoring.", GB(id, 0, 8));
} else { } else {
_cur.grffile->housespec[GB(id, 0, 8)]->building_name = AddGRFString(_cur.grffile->grfid, id, lang, new_scheme, name, STR_UNDEFINED); _cur.grffile->housespec[GB(id, 0, 8)]->building_name = AddGRFString(_cur.grffile->grfid, id, lang, new_scheme, false, name, STR_UNDEFINED);
} }
break; break;
@ -5206,7 +5206,7 @@ static void FeatureNewName(ByteReader *buf)
case 0xD2: case 0xD2:
case 0xD3: case 0xD3:
case 0xDC: case 0xDC:
AddGRFString(_cur.grffile->grfid, id, lang, new_scheme, name, STR_UNDEFINED); AddGRFString(_cur.grffile->grfid, id, lang, new_scheme, true, name, STR_UNDEFINED);
break; break;
default: default:
@ -5875,11 +5875,11 @@ static void ScanInfo(ByteReader *buf)
/* GRF IDs starting with 0xFF are reserved for internal TTDPatch use */ /* GRF IDs starting with 0xFF are reserved for internal TTDPatch use */
if (GB(grfid, 24, 8) == 0xFF) SetBit(_cur.grfconfig->flags, GCF_SYSTEM); if (GB(grfid, 24, 8) == 0xFF) SetBit(_cur.grfconfig->flags, GCF_SYSTEM);
AddGRFTextToList(&_cur.grfconfig->name->text, 0x7F, grfid, name); AddGRFTextToList(&_cur.grfconfig->name->text, 0x7F, grfid, false, name);
if (buf->HasData()) { if (buf->HasData()) {
const char *info = buf->ReadString(); const char *info = buf->ReadString();
AddGRFTextToList(&_cur.grfconfig->info->text, 0x7F, grfid, info); AddGRFTextToList(&_cur.grfconfig->info->text, 0x7F, grfid, true, info);
} }
/* GLS_INFOSCAN only looks for the action 8, so we can skip the rest of the file */ /* GLS_INFOSCAN only looks for the action 8, so we can skip the rest of the file */
@ -6046,7 +6046,7 @@ static void GRFLoadError(ByteReader *buf)
if (buf->HasData()) { if (buf->HasData()) {
const char *message = buf->ReadString(); const char *message = buf->ReadString();
error->custom_message = TranslateTTDPatchCodes(_cur.grffile->grfid, lang, message); error->custom_message = TranslateTTDPatchCodes(_cur.grffile->grfid, lang, true, message);
} else { } else {
grfmsg(7, "GRFLoadError: No custom message supplied."); grfmsg(7, "GRFLoadError: No custom message supplied.");
error->custom_message = strdup(""); error->custom_message = strdup("");
@ -6058,7 +6058,7 @@ static void GRFLoadError(ByteReader *buf)
if (buf->HasData()) { if (buf->HasData()) {
const char *data = buf->ReadString(); const char *data = buf->ReadString();
error->data = TranslateTTDPatchCodes(_cur.grffile->grfid, lang, data); error->data = TranslateTTDPatchCodes(_cur.grffile->grfid, lang, true, data);
} else { } else {
grfmsg(7, "GRFLoadError: No message data supplied."); grfmsg(7, "GRFLoadError: No message data supplied.");
error->data = strdup(""); error->data = strdup("");
@ -6596,11 +6596,11 @@ static void FeatureTownName(ByteReader *buf)
const char *name = buf->ReadString(); const char *name = buf->ReadString();
char *lang_name = TranslateTTDPatchCodes(grfid, lang, name); char *lang_name = TranslateTTDPatchCodes(grfid, lang, false, name);
grfmsg(6, "FeatureTownName: lang 0x%X -> '%s'", lang, lang_name); grfmsg(6, "FeatureTownName: lang 0x%X -> '%s'", lang, lang_name);
free(lang_name); free(lang_name);
townname->name[nb_gen] = AddGRFString(grfid, id, lang, new_scheme, name, STR_UNDEFINED); townname->name[nb_gen] = AddGRFString(grfid, id, lang, new_scheme, false, name, STR_UNDEFINED);
lang = buf->ReadByte(); lang = buf->ReadByte();
} while (lang != 0); } while (lang != 0);
@ -6640,7 +6640,7 @@ static void FeatureTownName(ByteReader *buf)
townname->partlist[id][i].parts[j].data.id = ref_id; townname->partlist[id][i].parts[j].data.id = ref_id;
} else { } else {
const char *text = buf->ReadString(); const char *text = buf->ReadString();
townname->partlist[id][i].parts[j].data.text = TranslateTTDPatchCodes(grfid, 0, text); townname->partlist[id][i].parts[j].data.text = TranslateTTDPatchCodes(grfid, 0, false, text);
grfmsg(6, "FeatureTownName: part %d, text %d, '%s' (with probability %d)", i, j, townname->partlist[id][i].parts[j].data.text, prob); grfmsg(6, "FeatureTownName: part %d, text %d, '%s' (with probability %d)", i, j, townname->partlist[id][i].parts[j].data.text, prob);
} }
townname->partlist[id][i].parts[j].prob = prob; townname->partlist[id][i].parts[j].prob = prob;
@ -6937,21 +6937,21 @@ static void TranslateGRFStrings(ByteReader *buf)
* new_scheme has to be true as well. A language id of 0x7F will be * new_scheme has to be true as well. A language id of 0x7F will be
* overridden by a non-generic id, so this will not change anything if * overridden by a non-generic id, so this will not change anything if
* a string has been provided specifically for this language. */ * a string has been provided specifically for this language. */
AddGRFString(grfid, first_id + i, 0x7F, true, string, STR_UNDEFINED); AddGRFString(grfid, first_id + i, 0x7F, true, true, string, STR_UNDEFINED);
} }
} }
/** Callback function for 'INFO'->'NAME' to add a translation to the newgrf name. */ /** Callback function for 'INFO'->'NAME' to add a translation to the newgrf name. */
static bool ChangeGRFName(byte langid, const char *str) static bool ChangeGRFName(byte langid, const char *str)
{ {
AddGRFTextToList(&_cur.grfconfig->name->text, langid, _cur.grfconfig->ident.grfid, str); AddGRFTextToList(&_cur.grfconfig->name->text, langid, _cur.grfconfig->ident.grfid, false, str);
return true; return true;
} }
/** Callback function for 'INFO'->'DESC' to add a translation to the newgrf description. */ /** Callback function for 'INFO'->'DESC' to add a translation to the newgrf description. */
static bool ChangeGRFDescription(byte langid, const char *str) static bool ChangeGRFDescription(byte langid, const char *str)
{ {
AddGRFTextToList(&_cur.grfconfig->info->text, langid, _cur.grfconfig->ident.grfid, str); AddGRFTextToList(&_cur.grfconfig->info->text, langid, _cur.grfconfig->ident.grfid, true, str);
return true; return true;
} }
@ -7031,14 +7031,14 @@ static GRFParameterInfo *_cur_parameter; ///< The parameter which info is curren
/** Callback function for 'INFO'->'PARAM'->param_num->'NAME' to set the name of a parameter. */ /** Callback function for 'INFO'->'PARAM'->param_num->'NAME' to set the name of a parameter. */
static bool ChangeGRFParamName(byte langid, const char *str) static bool ChangeGRFParamName(byte langid, const char *str)
{ {
AddGRFTextToList(&_cur_parameter->name, langid, _cur.grfconfig->ident.grfid, str); AddGRFTextToList(&_cur_parameter->name, langid, _cur.grfconfig->ident.grfid, false, str);
return true; return true;
} }
/** Callback function for 'INFO'->'PARAM'->param_num->'DESC' to set the description of a parameter. */ /** Callback function for 'INFO'->'PARAM'->param_num->'DESC' to set the description of a parameter. */
static bool ChangeGRFParamDescription(byte langid, const char *str) static bool ChangeGRFParamDescription(byte langid, const char *str)
{ {
AddGRFTextToList(&_cur_parameter->desc, langid, _cur.grfconfig->ident.grfid, str); AddGRFTextToList(&_cur_parameter->desc, langid, _cur.grfconfig->ident.grfid, true, str);
return true; return true;
} }
@ -7218,10 +7218,10 @@ static bool ChangeGRFParamValueNames(ByteReader *buf)
SmallPair<uint32, GRFText *> *val_name = _cur_parameter->value_names.Find(id); SmallPair<uint32, GRFText *> *val_name = _cur_parameter->value_names.Find(id);
if (val_name != _cur_parameter->value_names.End()) { if (val_name != _cur_parameter->value_names.End()) {
AddGRFTextToList(&val_name->second, langid, _cur.grfconfig->ident.grfid, name_string); AddGRFTextToList(&val_name->second, langid, _cur.grfconfig->ident.grfid, false, name_string);
} else { } else {
GRFText *list = NULL; GRFText *list = NULL;
AddGRFTextToList(&list, langid, _cur.grfconfig->ident.grfid, name_string); AddGRFTextToList(&list, langid, _cur.grfconfig->ident.grfid, false, name_string);
_cur_parameter->value_names.Insert(id, list); _cur_parameter->value_names.Insert(id, list);
} }

View File

@ -391,11 +391,12 @@ struct UnmappedChoiceList : ZeroedMemoryAllocator {
* Translate TTDPatch string codes into something OpenTTD can handle (better). * Translate TTDPatch string codes into something OpenTTD can handle (better).
* @param grfid The (NewGRF) ID associated with this string * @param grfid The (NewGRF) ID associated with this string
* @param language_id The (NewGRF) language ID associated with this string. * @param language_id The (NewGRF) language ID associated with this string.
* @param allow_newlines Whether newlines are allowed in the string or not.
* @param str The string to translate. * @param str The string to translate.
* @param [out] olen The length of the final string. * @param [out] olen The length of the final string.
* @return The translated string. * @return The translated string.
*/ */
char *TranslateTTDPatchCodes(uint32 grfid, uint8 language_id, const char *str, int *olen) char *TranslateTTDPatchCodes(uint32 grfid, uint8 language_id, bool allow_newlines, const char *str, int *olen)
{ {
char *tmp = MallocT<char>(strlen(str) * 10 + 1); // Allocate space to allow for expansion char *tmp = MallocT<char>(strlen(str) * 10 + 1); // Allocate space to allow for expansion
char *d = tmp; char *d = tmp;
@ -434,7 +435,13 @@ char *TranslateTTDPatchCodes(uint32 grfid, uint8 language_id, const char *str, i
*d++ = *str++; *d++ = *str++;
break; break;
case 0x0A: break; case 0x0A: break;
case 0x0D: *d++ = 0x0A; break; case 0x0D:
if (allow_newlines) {
*d++ = 0x0A;
} else {
grfmsg(1, "Detected newline in string that does not allow one");
}
break;
case 0x0E: d += Utf8Encode(d, SCC_TINYFONT); break; case 0x0E: d += Utf8Encode(d, SCC_TINYFONT); break;
case 0x0F: d += Utf8Encode(d, SCC_BIGFONT); break; case 0x0F: d += Utf8Encode(d, SCC_BIGFONT); break;
case 0x1F: case 0x1F:
@ -647,13 +654,14 @@ void AddGRFTextToList(GRFText **list, GRFText *text_to_add)
* @param list The list where the text should be added to. * @param list The list where the text should be added to.
* @param langid The language of the new text. * @param langid The language of the new text.
* @param grfid The grfid where this string is defined. * @param grfid The grfid where this string is defined.
* @param allow_newlines Whether newlines are allowed in this string.
* @param text_to_add The text to add to the list. * @param text_to_add The text to add to the list.
* @note All text-codes will be translated. * @note All text-codes will be translated.
*/ */
void AddGRFTextToList(struct GRFText **list, byte langid, uint32 grfid, const char *text_to_add) void AddGRFTextToList(struct GRFText **list, byte langid, uint32 grfid, bool allow_newlines, const char *text_to_add)
{ {
int len; int len;
char *translatedtext = TranslateTTDPatchCodes(grfid, langid, text_to_add, &len); char *translatedtext = TranslateTTDPatchCodes(grfid, langid, allow_newlines, text_to_add, &len);
GRFText *newtext = GRFText::New(langid, translatedtext, len); GRFText *newtext = GRFText::New(langid, translatedtext, len);
free(translatedtext); free(translatedtext);
@ -690,7 +698,7 @@ GRFText *DuplicateGRFText(GRFText *orig)
/** /**
* Add the new read string into our structure. * Add the new read string into our structure.
*/ */
StringID AddGRFString(uint32 grfid, uint16 stringid, byte langid_to_add, bool new_scheme, const char *text_to_add, StringID def_string) StringID AddGRFString(uint32 grfid, uint16 stringid, byte langid_to_add, bool new_scheme, bool allow_newlines, const char *text_to_add, StringID def_string)
{ {
char *translatedtext; char *translatedtext;
uint id; uint id;
@ -706,9 +714,9 @@ StringID AddGRFString(uint32 grfid, uint16 stringid, byte langid_to_add, bool ne
langid_to_add = GRFLX_ENGLISH; langid_to_add = GRFLX_ENGLISH;
} else { } else {
StringID ret = STR_EMPTY; StringID ret = STR_EMPTY;
if (langid_to_add & GRFLB_GERMAN) ret = AddGRFString(grfid, stringid, GRFLX_GERMAN, true, text_to_add, def_string); if (langid_to_add & GRFLB_GERMAN) ret = AddGRFString(grfid, stringid, GRFLX_GERMAN, true, allow_newlines, text_to_add, def_string);
if (langid_to_add & GRFLB_FRENCH) ret = AddGRFString(grfid, stringid, GRFLX_FRENCH, true, text_to_add, def_string); if (langid_to_add & GRFLB_FRENCH) ret = AddGRFString(grfid, stringid, GRFLX_FRENCH, true, allow_newlines, text_to_add, def_string);
if (langid_to_add & GRFLB_SPANISH) ret = AddGRFString(grfid, stringid, GRFLX_SPANISH, true, text_to_add, def_string); if (langid_to_add & GRFLB_SPANISH) ret = AddGRFString(grfid, stringid, GRFLX_SPANISH, true, allow_newlines, text_to_add, def_string);
return ret; return ret;
} }
} }
@ -723,7 +731,7 @@ StringID AddGRFString(uint32 grfid, uint16 stringid, byte langid_to_add, bool ne
if (id == lengthof(_grf_text)) return STR_EMPTY; if (id == lengthof(_grf_text)) return STR_EMPTY;
int len; int len;
translatedtext = TranslateTTDPatchCodes(grfid, langid_to_add, text_to_add, &len); translatedtext = TranslateTTDPatchCodes(grfid, langid_to_add, allow_newlines, text_to_add, &len);
GRFText *newtext = GRFText::New(langid_to_add, translatedtext, len); GRFText *newtext = GRFText::New(langid_to_add, translatedtext, len);

View File

@ -19,16 +19,16 @@
/** This character, the thorn ('þ'), indicates a unicode string to NFO. */ /** This character, the thorn ('þ'), indicates a unicode string to NFO. */
static const WChar NFO_UTF8_IDENTIFIER = 0x00DE; static const WChar NFO_UTF8_IDENTIFIER = 0x00DE;
StringID AddGRFString(uint32 grfid, uint16 stringid, byte langid, bool new_scheme, const char *text_to_add, StringID def_string); StringID AddGRFString(uint32 grfid, uint16 stringid, byte langid, bool new_scheme, bool allow_newlines, const char *text_to_add, StringID def_string);
StringID GetGRFStringID(uint32 grfid, uint16 stringid); StringID GetGRFStringID(uint32 grfid, uint16 stringid);
const char *GetGRFStringFromGRFText(const struct GRFText *text); const char *GetGRFStringFromGRFText(const struct GRFText *text);
const char *GetGRFStringPtr(uint16 stringid); const char *GetGRFStringPtr(uint16 stringid);
void CleanUpStrings(); void CleanUpStrings();
void SetCurrentGrfLangID(byte language_id); void SetCurrentGrfLangID(byte language_id);
char *TranslateTTDPatchCodes(uint32 grfid, uint8 language_id, const char *str, int *olen = NULL); char *TranslateTTDPatchCodes(uint32 grfid, uint8 language_id, bool allow_newlines, const char *str, int *olen = NULL);
struct GRFText *DuplicateGRFText(struct GRFText *orig); struct GRFText *DuplicateGRFText(struct GRFText *orig);
void AddGRFTextToList(struct GRFText **list, struct GRFText *text_to_add); void AddGRFTextToList(struct GRFText **list, struct GRFText *text_to_add);
void AddGRFTextToList(struct GRFText **list, byte langid, uint32 grfid, const char *text_to_add); void AddGRFTextToList(struct GRFText **list, byte langid, uint32 grfid, bool allow_newlines, const char *text_to_add);
void AddGRFTextToList(struct GRFText **list, const char *text_to_add); void AddGRFTextToList(struct GRFText **list, const char *text_to_add);
void CleanUpGRFText(struct GRFText *grftext); void CleanUpGRFText(struct GRFText *grftext);