File diff r22548:e350bbe3b5af → r22549:21c2f1153122
src/strings.cpp
Show inline comments
 
@@ -187,20 +187,20 @@ struct LanguagePack : public LanguagePac
 

	
 
static char **_langpack_offs;
 
static LanguagePack *_langpack;
 
static uint _langtab_num[TAB_COUNT];   ///< Offset into langpack offs
 
static uint _langtab_start[TAB_COUNT]; ///< Offset into langpack offs
 
static uint _langtab_num[TEXT_TAB_END];   ///< Offset into langpack offs
 
static uint _langtab_start[TEXT_TAB_END]; ///< Offset into langpack offs
 
static bool _scan_for_gender_data = false;  ///< Are we scanning for the gender of the current string? (instead of formatting it)
 

	
 

	
 
const char *GetStringPtr(StringID string)
 
{
 
	switch (GetStringTab(string)) {
 
		case GAME_TEXT_TAB: return GetGameStringPtr(GetStringIndex(string));
 
		case TEXT_TAB_GAMESCRIPT: return GetGameStringPtr(GetStringIndex(string));
 
		/* 0xD0xx and 0xD4xx IDs have been converted earlier. */
 
		case 26: NOT_REACHED();
 
		case 28: return GetGRFStringPtr(GetStringIndex(string));
 
		case 29: return GetGRFStringPtr(GetStringIndex(string) + 0x0800);
 
		case 30: return GetGRFStringPtr(GetStringIndex(string) + 0x1000);
 
		case TEXT_TAB_OLD_NEWGRF: NOT_REACHED();
 
		case TEXT_TAB_NEWGRF1: return GetGRFStringPtr(GetStringIndex(string));
 
		case TEXT_TAB_NEWGRF2: return GetGRFStringPtr(GetStringIndex(string) + 0x0800);
 
		case TEXT_TAB_NEWGRF3: return GetGRFStringPtr(GetStringIndex(string) + 0x1000);
 
		default: return _langpack_offs[_langtab_start[GetStringTab(string)] + GetStringIndex(string)];
 
	}
 
}
 
@@ -220,42 +220,45 @@ char *GetStringWithArgs(char *buffr, Str
 
	if (string == 0) return GetStringWithArgs(buffr, STR_UNDEFINED, args, last);
 

	
 
	uint index = GetStringIndex(string);
 
	uint tab = GetStringTab(string);
 
	StringTab tab = GetStringTab(string);
 

	
 
	switch (tab) {
 
		case 4:
 
		case TEXT_TAB_TOWN:
 
			if (index >= 0xC0 && !game_script) {
 
				return GetSpecialTownNameString(buffr, index - 0xC0, args->GetInt32(), last);
 
			}
 
			break;
 

	
 
		case 14:
 
		case TEXT_TAB_SPECIAL:
 
			if (index >= 0xE4 && !game_script) {
 
				return GetSpecialNameString(buffr, index - 0xE4, args, last);
 
			}
 
			break;
 

	
 
		case 15:
 
		case TEXT_TAB_OLD_CUSTOM:
 
			/* Old table for custom names. This is no longer used */
 
			if (!game_script) {
 
				error("Incorrect conversion of custom name string.");
 
			}
 
			break;
 

	
 
		case GAME_TEXT_TAB:
 
		case TEXT_TAB_GAMESCRIPT:
 
			return FormatString(buffr, GetGameStringPtr(index), args, last, case_index, true);
 

	
 
		case 26:
 
		case TEXT_TAB_OLD_NEWGRF:
 
			NOT_REACHED();
 

	
 
		case 28:
 
		case TEXT_TAB_NEWGRF1:
 
			return FormatString(buffr, GetGRFStringPtr(index), args, last, case_index);
 

	
 
		case 29:
 
		case TEXT_TAB_NEWGRF2:
 
			return FormatString(buffr, GetGRFStringPtr(index + 0x0800), args, last, case_index);
 

	
 
		case 30:
 
		case TEXT_TAB_NEWGRF3:
 
			return FormatString(buffr, GetGRFStringPtr(index + 0x1000), args, last, case_index);
 

	
 
		default:
 
			break;
 
	}
 

	
 
	if (index >= _langtab_num[tab]) {
 
@@ -886,7 +889,7 @@ static char *FormatString(char *buff, co
 
								buff = strecat(buff, "(invalid sub-StringID)", last);
 
								break;
 
							}
 
							param = MakeStringID(GAME_TEXT_TAB, param);
 
							param = MakeStringID(TEXT_TAB_GAMESCRIPT, param);
 
						}
 

	
 
						sub_args.SetParam(i++, param);
 
@@ -901,7 +904,7 @@ static char *FormatString(char *buff, co
 
				/* If we didn't error out, we can actually print the string. */
 
				if (*str != '\0') {
 
					str = p;
 
					buff = GetStringWithArgs(buff, MakeStringID(GAME_TEXT_TAB, stringid), &sub_args, last, true);
 
					buff = GetStringWithArgs(buff, MakeStringID(TEXT_TAB_GAMESCRIPT, stringid), &sub_args, last, true);
 
				}
 

	
 
				for (int i = 0; i < 20; i++) {
 
@@ -1017,7 +1020,7 @@ static char *FormatString(char *buff, co
 

	
 
			case SCC_STRING: {// {STRING}
 
				StringID str = args->GetInt32(SCC_STRING);
 
				if (game_script && GetStringTab(str) != GAME_TEXT_TAB) break;
 
				if (game_script && GetStringTab(str) != TEXT_TAB_GAMESCRIPT) break;
 
				/* WARNING. It's prohibited for the included string to consume any arguments.
 
				 * For included strings that consume argument, you should use STRING1, STRING2 etc.
 
				 * To debug stuff you can set argv to NULL and it will tell you */
 
@@ -1036,7 +1039,7 @@ static char *FormatString(char *buff, co
 
			case SCC_STRING7: { // {STRING1..7}
 
				/* Strings that consume arguments */
 
				StringID str = args->GetInt32(b);
 
				if (game_script && GetStringTab(str) != GAME_TEXT_TAB) break;
 
				if (game_script && GetStringTab(str) != TEXT_TAB_GAMESCRIPT) break;
 
				uint size = b - SCC_STRING1 + 1;
 
				if (game_script && size > args->GetDataLeft()) {
 
					buff = strecat(buff, "(too many parameters)", last);
 
@@ -1736,13 +1739,13 @@ bool ReadLanguagePack(const LanguageMeta
 
	}
 

	
 
#if TTD_ENDIAN == TTD_BIG_ENDIAN
 
	for (uint i = 0; i < TAB_COUNT; i++) {
 
	for (uint i = 0; i < TEXT_TAB_END; i++) {
 
		lang_pack->offsets[i] = ReadLE16Aligned(&lang_pack->offsets[i]);
 
	}
 
#endif /* TTD_ENDIAN == TTD_BIG_ENDIAN */
 

	
 
	uint count = 0;
 
	for (uint i = 0; i < TAB_COUNT; i++) {
 
	for (uint i = 0; i < TEXT_TAB_END; i++) {
 
		uint16 num = lang_pack->offsets[i];
 
		if (num > TAB_SIZE) {
 
			free(lang_pack);
 
@@ -2051,12 +2054,12 @@ class LanguagePackGlyphSearcher : public
 

	
 
	/* virtual */ const char *NextString()
 
	{
 
		if (this->i >= TAB_COUNT) return NULL;
 
		if (this->i >= TEXT_TAB_END) return NULL;
 

	
 
		const char *ret = _langpack_offs[_langtab_start[this->i] + this->j];
 

	
 
		this->j++;
 
		while (this->i < TAB_COUNT && this->j >= _langtab_num[this->i]) {
 
		while (this->i < TEXT_TAB_END && this->j >= _langtab_num[this->i]) {
 
			this->i++;
 
			this->j = 0;
 
		}