mirror of https://github.com/OpenTTD/OpenTTD
(svn r16059) [0.7] -Backport from trunk:
- Fix: Inconsistency between using NETWORK_NAME_LENGTH and NETWORK_CLIENT_NAME_LENGTH for the length of client names (r15988) - Fix: [NewGRF] Abort production callback after 0x10000 iterations and show a messagebox blaming the NewGRF [FS#2787] (r15958) - Fix: [NewGRF] Set callback_param1 (var 10) to 1 only when requested (r15957) - Fix: Tooltip of detailed ratings window button showed wrong tip (r15943) - Change: Harden string copying on places where it is possible (r16024) - Change: Use recent Czech language for plural form (r15965)release/0.7
parent
2fbd7ff6cc
commit
9f5e690118
|
@ -153,7 +153,7 @@ AIScanner::AIScanner() :
|
||||||
|
|
||||||
/* Create the dummy AI */
|
/* Create the dummy AI */
|
||||||
this->engine->ResetCrashed();
|
this->engine->ResetCrashed();
|
||||||
strcpy(this->main_script, "%_dummy");
|
strecpy(this->main_script, "%_dummy", lastof(this->main_script));
|
||||||
extern void AI_CreateAIInfoDummy(HSQUIRRELVM vm);
|
extern void AI_CreateAIInfoDummy(HSQUIRRELVM vm);
|
||||||
AI_CreateAIInfoDummy(this->engine->GetVM());
|
AI_CreateAIInfoDummy(this->engine->GetVM());
|
||||||
}
|
}
|
||||||
|
|
|
@ -363,7 +363,7 @@ FILE *FioFOpenFile(const char *filename, const char *mode, Subdirectory subdir,
|
||||||
char resolved_name[MAX_RESOLVED_LENGTH];
|
char resolved_name[MAX_RESOLVED_LENGTH];
|
||||||
|
|
||||||
/* Filenames in tars are always forced to be lowercase */
|
/* Filenames in tars are always forced to be lowercase */
|
||||||
strcpy(resolved_name, filename);
|
strecpy(resolved_name, filename, lastof(resolved_name));
|
||||||
strtolower(resolved_name);
|
strtolower(resolved_name);
|
||||||
|
|
||||||
size_t resolved_len = strlen(resolved_name);
|
size_t resolved_len = strlen(resolved_name);
|
||||||
|
@ -376,9 +376,9 @@ FILE *FioFOpenFile(const char *filename, const char *mode, Subdirectory subdir,
|
||||||
/* Apply link */
|
/* Apply link */
|
||||||
char resolved_name2[MAX_RESOLVED_LENGTH];
|
char resolved_name2[MAX_RESOLVED_LENGTH];
|
||||||
const std::string &dest = link->second;
|
const std::string &dest = link->second;
|
||||||
strcpy(resolved_name2, &(resolved_name[len]));
|
strecpy(resolved_name2, &(resolved_name[len]), lastof(resolved_name2));
|
||||||
strcpy(resolved_name, dest.c_str());
|
strecpy(resolved_name, dest.c_str(), lastof(resolved_name));
|
||||||
strcpy(&(resolved_name[dest.length()]), resolved_name2);
|
strecpy(&(resolved_name[dest.length()]), resolved_name2, lastof(resolved_name));
|
||||||
break; // Only resolve one level
|
break; // Only resolve one level
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -640,7 +640,7 @@ bool TarListAddFile(const char *filename)
|
||||||
|
|
||||||
/* Process relative path.
|
/* Process relative path.
|
||||||
* Note: The destination of links must not contain any directory-links. */
|
* Note: The destination of links must not contain any directory-links. */
|
||||||
strcpy(dest, name);
|
strecpy(dest, name, lastof(dest));
|
||||||
char *destpos = strrchr(dest, PATHSEPCHAR);
|
char *destpos = strrchr(dest, PATHSEPCHAR);
|
||||||
if (destpos == NULL) destpos = dest;
|
if (destpos == NULL) destpos = dest;
|
||||||
*destpos = '\0';
|
*destpos = '\0';
|
||||||
|
|
|
@ -554,7 +554,7 @@ static const Widget _performance_history_widgets[] = {
|
||||||
{ WWT_CLOSEBOX, RESIZE_NONE, COLOUR_GREY, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW},
|
{ WWT_CLOSEBOX, RESIZE_NONE, COLOUR_GREY, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW},
|
||||||
{ WWT_CAPTION, RESIZE_NONE, COLOUR_GREY, 11, 475, 0, 13, STR_7051_COMPANY_PERFORMANCE_RATINGS, STR_018C_WINDOW_TITLE_DRAG_THIS},
|
{ WWT_CAPTION, RESIZE_NONE, COLOUR_GREY, 11, 475, 0, 13, STR_7051_COMPANY_PERFORMANCE_RATINGS, STR_018C_WINDOW_TITLE_DRAG_THIS},
|
||||||
{ WWT_PUSHTXTBTN, RESIZE_NONE, COLOUR_GREY, 526, 575, 0, 13, STR_704C_KEY, STR_704D_SHOW_KEY_TO_GRAPHS},
|
{ WWT_PUSHTXTBTN, RESIZE_NONE, COLOUR_GREY, 526, 575, 0, 13, STR_704C_KEY, STR_704D_SHOW_KEY_TO_GRAPHS},
|
||||||
{ WWT_PUSHTXTBTN, RESIZE_NONE, COLOUR_GREY, 476, 525, 0, 13, STR_PERFORMANCE_DETAIL_KEY, STR_704D_SHOW_KEY_TO_GRAPHS},
|
{ WWT_PUSHTXTBTN, RESIZE_NONE, COLOUR_GREY, 476, 525, 0, 13, STR_PERFORMANCE_DETAIL_KEY, STR_SHOW_DETAILED_PERFORMANCE_RATINGS},
|
||||||
{ WWT_PANEL, RESIZE_NONE, COLOUR_GREY, 0, 575, 14, 237, 0x0, STR_NULL},
|
{ WWT_PANEL, RESIZE_NONE, COLOUR_GREY, 0, 575, 14, 237, 0x0, STR_NULL},
|
||||||
{ WIDGETS_END},
|
{ WIDGETS_END},
|
||||||
};
|
};
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
##isocode cs_CZ
|
##isocode cs_CZ
|
||||||
##winlangid 0x0405
|
##winlangid 0x0405
|
||||||
##grflangid 0x15
|
##grflangid 0x15
|
||||||
##plural 6
|
##plural 10
|
||||||
##case nom gen dat acc voc loc ins big small
|
##case nom gen dat acc voc loc ins big small
|
||||||
##gender m f n
|
##gender m f n
|
||||||
|
|
||||||
|
|
|
@ -2241,6 +2241,7 @@ STR_704A_SELECT_FEMALE_FACES :{BLACK}Select f
|
||||||
STR_704B_GENERATE_RANDOM_NEW_FACE :{BLACK}Generate random new face
|
STR_704B_GENERATE_RANDOM_NEW_FACE :{BLACK}Generate random new face
|
||||||
STR_704C_KEY :{BLACK}Key
|
STR_704C_KEY :{BLACK}Key
|
||||||
STR_704D_SHOW_KEY_TO_GRAPHS :{BLACK}Show key to graphs
|
STR_704D_SHOW_KEY_TO_GRAPHS :{BLACK}Show key to graphs
|
||||||
|
STR_SHOW_DETAILED_PERFORMANCE_RATINGS :{BLACK}Show detailed performance ratings
|
||||||
STR_704E_KEY_TO_COMPANY_GRAPHS :{WHITE}Key to company graphs
|
STR_704E_KEY_TO_COMPANY_GRAPHS :{WHITE}Key to company graphs
|
||||||
STR_704F_CLICK_HERE_TO_TOGGLE_COMPANY :{BLACK}Click here to toggle company's entry on graph on/off
|
STR_704F_CLICK_HERE_TO_TOGGLE_COMPANY :{BLACK}Click here to toggle company's entry on graph on/off
|
||||||
STR_7050_UNITS_OF_CARGO_DELIVERED :{WHITE}Units of cargo delivered
|
STR_7050_UNITS_OF_CARGO_DELIVERED :{WHITE}Units of cargo delivered
|
||||||
|
@ -3172,6 +3173,7 @@ STR_BROKEN_VEHICLE_LENGTH :{WHITE}Train '{
|
||||||
|
|
||||||
STR_NEWGRF_BUGGY :{WHITE}NewGRF '{0:RAW_STRING}' provides incorrect information.
|
STR_NEWGRF_BUGGY :{WHITE}NewGRF '{0:RAW_STRING}' provides incorrect information.
|
||||||
STR_NEWGRF_BUGGY_ARTICULATED_CARGO :{WHITE}Cargo/refit information for '{1:ENGINE}' differs from purchase list after construction. This might cause autorenew/-replace to fail refitting correctly.
|
STR_NEWGRF_BUGGY_ARTICULATED_CARGO :{WHITE}Cargo/refit information for '{1:ENGINE}' differs from purchase list after construction. This might cause autorenew/-replace to fail refitting correctly.
|
||||||
|
STR_NEWGRF_BUGGY_ENDLESS_PRODUCTION_CALLBACK :{WHITE}'{1:STRING}' caused an endless loop in the production callback.
|
||||||
|
|
||||||
STR_LOADGAME_REMOVED_TRAMS :{WHITE}Game was saved in version without tram support. All trams have been removed.
|
STR_LOADGAME_REMOVED_TRAMS :{WHITE}Game was saved in version without tram support. All trams have been removed.
|
||||||
|
|
||||||
|
|
|
@ -1490,7 +1490,7 @@ public:
|
||||||
this->vscroll.cap--;
|
this->vscroll.cap--;
|
||||||
|
|
||||||
case SLD_SAVE_GAME: this->GenerateFileName(); break;
|
case SLD_SAVE_GAME: this->GenerateFileName(); break;
|
||||||
case SLD_SAVE_SCENARIO: strcpy(this->edit_str_buf, "UNNAMED"); break;
|
case SLD_SAVE_SCENARIO: strecpy(this->edit_str_buf, "UNNAMED", &this->edit_str_buf[edit_str_size - 1]); break;
|
||||||
default: break;
|
default: break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -23,7 +23,7 @@ static FMusicDriver_Win32 iFMusicDriver_Win32;
|
||||||
void MusicDriver_Win32::PlaySong(const char *filename)
|
void MusicDriver_Win32::PlaySong(const char *filename)
|
||||||
{
|
{
|
||||||
assert(filename != NULL);
|
assert(filename != NULL);
|
||||||
strcpy(_midi.start_song, filename);
|
strecpy(_midi.start_song, filename, lastof(_midi.start_song));
|
||||||
_midi.playing = true;
|
_midi.playing = true;
|
||||||
_midi.stop_song = false;
|
_midi.stop_song = false;
|
||||||
SetEvent(_midi.wait_obj);
|
SetEvent(_midi.wait_obj);
|
||||||
|
|
|
@ -305,7 +305,7 @@ protected:
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
NetworkGameWindow(const WindowDesc *desc) : QueryStringBaseWindow(NETWORK_NAME_LENGTH, desc)
|
NetworkGameWindow(const WindowDesc *desc) : QueryStringBaseWindow(NETWORK_CLIENT_NAME_LENGTH, desc)
|
||||||
{
|
{
|
||||||
ttd_strlcpy(this->edit_str_buf, _settings_client.network.client_name, this->edit_str_size);
|
ttd_strlcpy(this->edit_str_buf, _settings_client.network.client_name, this->edit_str_size);
|
||||||
this->afilter = CS_ALPHANUMERAL;
|
this->afilter = CS_ALPHANUMERAL;
|
||||||
|
|
|
@ -17,6 +17,8 @@
|
||||||
#include "town.h"
|
#include "town.h"
|
||||||
#include "company_base.h"
|
#include "company_base.h"
|
||||||
#include "command_func.h"
|
#include "command_func.h"
|
||||||
|
#include "gui.h"
|
||||||
|
#include "strings_func.h"
|
||||||
|
|
||||||
#include "table/strings.h"
|
#include "table/strings.h"
|
||||||
|
|
||||||
|
@ -570,6 +572,18 @@ void IndustryProductionCallback(Industry *ind, int reason)
|
||||||
object.callback_param2 = reason;
|
object.callback_param2 = reason;
|
||||||
|
|
||||||
for (uint loop = 0;; loop++) {
|
for (uint loop = 0;; loop++) {
|
||||||
|
/* limit the number of calls to break infinite loops.
|
||||||
|
* 'loop' is provided as 16 bits to the newgrf, so abort when those are exceeded. */
|
||||||
|
if (loop >= 0x10000) {
|
||||||
|
/* display error message */
|
||||||
|
SetDParamStr(0, spec->grf_prop.grffile->filename);
|
||||||
|
SetDParam(1, spec->name);
|
||||||
|
ShowErrorMessage(STR_NEWGRF_BUGGY_ENDLESS_PRODUCTION_CALLBACK, STR_NEWGRF_BUGGY, 0, 0);
|
||||||
|
|
||||||
|
/* abort the function early, this error isn't critical and will allow the game to continue to run */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
SB(object.callback_param2, 8, 16, loop);
|
SB(object.callback_param2, 8, 16, loop);
|
||||||
const SpriteGroup *group = Resolve(spec->grf_prop.spritegroup, &object);
|
const SpriteGroup *group = Resolve(spec->grf_prop.spritegroup, &object);
|
||||||
if (group == NULL || group->type != SGT_INDUSTRY_PRODUCTION) break;
|
if (group == NULL || group->type != SGT_INDUSTRY_PRODUCTION) break;
|
||||||
|
|
|
@ -558,7 +558,7 @@ static const SpriteGroup *StationResolveReal(const ResolverObject *object, const
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (HasBit(statspec->flags, 1)) cargo /= (st->trainst_w + st->trainst_h);
|
if (HasBit(statspec->flags, SSF_DIV_BY_STATION_SIZE)) cargo /= (st->trainst_w + st->trainst_h);
|
||||||
cargo = min(0xfff, cargo);
|
cargo = min(0xfff, cargo);
|
||||||
|
|
||||||
if (cargo > statspec->cargo_threshold) {
|
if (cargo > statspec->cargo_threshold) {
|
||||||
|
@ -655,7 +655,9 @@ SpriteID GetCustomStationGroundRelocation(const StationSpec *statspec, const Sta
|
||||||
ResolverObject object;
|
ResolverObject object;
|
||||||
|
|
||||||
NewStationResolver(&object, statspec, st, tile);
|
NewStationResolver(&object, statspec, st, tile);
|
||||||
object.callback_param1 = 1; // Indicate we are resolving the ground sprite
|
if (HasBit(statspec->flags, SSF_SEPARATE_GROUND)) {
|
||||||
|
object.callback_param1 = 1; // Indicate we are resolving the ground sprite
|
||||||
|
}
|
||||||
|
|
||||||
group = ResolveStation(&object);
|
group = ResolveStation(&object);
|
||||||
if (group == NULL || group->type != SGT_RESULT) return 0;
|
if (group == NULL || group->type != SGT_RESULT) return 0;
|
||||||
|
@ -904,7 +906,7 @@ void AnimateStationTile(TileIndex tile)
|
||||||
bool frame_set_by_callback = false;
|
bool frame_set_by_callback = false;
|
||||||
|
|
||||||
if (HasBit(ss->callbackmask, CBM_STATION_ANIMATION_NEXT_FRAME)) {
|
if (HasBit(ss->callbackmask, CBM_STATION_ANIMATION_NEXT_FRAME)) {
|
||||||
uint32 param = HasBit(ss->flags, 2) ? Random() : 0;
|
uint32 param = HasBit(ss->flags, SSF_CB141_RANDOM_BITS) ? Random() : 0;
|
||||||
uint16 callback = GetStationCallback(CBID_STATION_ANIM_NEXT_FRAME, param, 0, ss, st, tile);
|
uint16 callback = GetStationCallback(CBID_STATION_ANIM_NEXT_FRAME, param, 0, ss, st, tile);
|
||||||
|
|
||||||
if (callback != CALLBACK_FAILED) {
|
if (callback != CALLBACK_FAILED) {
|
||||||
|
|
|
@ -29,6 +29,14 @@ typedef TinyEnumT<StationClassID> StationClassIDByte;
|
||||||
/** Allow incrementing of StationClassID variables */
|
/** Allow incrementing of StationClassID variables */
|
||||||
DECLARE_POSTFIX_INCREMENT(StationClassID);
|
DECLARE_POSTFIX_INCREMENT(StationClassID);
|
||||||
|
|
||||||
|
enum StationSpecFlags {
|
||||||
|
SSF_SEPARATE_GROUND, ///< Use different sprite set for ground sprites.
|
||||||
|
SSF_DIV_BY_STATION_SIZE, ///< Divide cargo amount by station size.
|
||||||
|
SSF_CB141_RANDOM_BITS, ///< Callback 141 needs random bits.
|
||||||
|
SSF_CUSTOM_FOUNDATIONS, ///< Draw custom foundations.
|
||||||
|
SSF_EXTENDED_FOUNDATIONS, ///< Extended foundation block instead of simple.
|
||||||
|
};
|
||||||
|
|
||||||
/* Station layout for given dimensions - it is a two-dimensional array
|
/* Station layout for given dimensions - it is a two-dimensional array
|
||||||
* where index is computed as (x * platforms) + platform. */
|
* where index is computed as (x * platforms) + platform. */
|
||||||
typedef byte *StationLayout;
|
typedef byte *StationLayout;
|
||||||
|
|
|
@ -456,7 +456,7 @@ const char *GetScreenshotFormatDesc(int i)
|
||||||
void SetScreenshotFormat(int i)
|
void SetScreenshotFormat(int i)
|
||||||
{
|
{
|
||||||
_cur_screenshot_format = i;
|
_cur_screenshot_format = i;
|
||||||
strcpy(_screenshot_format_name, _screenshot_formats[i].extension);
|
strecpy(_screenshot_format_name, _screenshot_formats[i].extension, lastof(_screenshot_format_name));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* screenshot generator that dumps the current video buffer */
|
/* screenshot generator that dumps the current video buffer */
|
||||||
|
|
|
@ -556,7 +556,7 @@ static void ini_save_settings(IniFile *ini, const SettingDesc *sd, const char *g
|
||||||
uint32 i = (uint32)ReadValue(ptr, sld->conv);
|
uint32 i = (uint32)ReadValue(ptr, sld->conv);
|
||||||
|
|
||||||
switch (sdb->cmd) {
|
switch (sdb->cmd) {
|
||||||
case SDT_BOOLX: strcpy(buf, (i != 0) ? "true" : "false"); break;
|
case SDT_BOOLX: strecpy(buf, (i != 0) ? "true" : "false", lastof(buf)); break;
|
||||||
case SDT_NUMX: seprintf(buf, lastof(buf), IsSignedVarMemType(sld->conv) ? "%d" : "%u", i); break;
|
case SDT_NUMX: seprintf(buf, lastof(buf), IsSignedVarMemType(sld->conv) ? "%d" : "%u", i); break;
|
||||||
case SDT_ONEOFMANY: make_oneofmany(buf, lastof(buf), sdb->many, i); break;
|
case SDT_ONEOFMANY: make_oneofmany(buf, lastof(buf), sdb->many, i); break;
|
||||||
case SDT_MANYOFMANY: make_manyofmany(buf, lastof(buf), sdb->many, i); break;
|
case SDT_MANYOFMANY: make_manyofmany(buf, lastof(buf), sdb->many, i); break;
|
||||||
|
@ -566,9 +566,9 @@ static void ini_save_settings(IniFile *ini, const SettingDesc *sd, const char *g
|
||||||
|
|
||||||
case SDT_STRING:
|
case SDT_STRING:
|
||||||
switch (GetVarMemType(sld->conv)) {
|
switch (GetVarMemType(sld->conv)) {
|
||||||
case SLE_VAR_STRB: strcpy(buf, (char*)ptr); break;
|
case SLE_VAR_STRB: strecpy(buf, (char*)ptr, lastof(buf)); break;
|
||||||
case SLE_VAR_STRBQ:seprintf(buf, lastof(buf), "\"%s\"", (char*)ptr); break;
|
case SLE_VAR_STRBQ:seprintf(buf, lastof(buf), "\"%s\"", (char*)ptr); break;
|
||||||
case SLE_VAR_STR: strcpy(buf, *(char**)ptr); break;
|
case SLE_VAR_STR: strecpy(buf, *(char**)ptr, lastof(buf)); break;
|
||||||
case SLE_VAR_STRQ:
|
case SLE_VAR_STRQ:
|
||||||
if (*(char**)ptr == NULL) {
|
if (*(char**)ptr == NULL) {
|
||||||
buf[0] = '\0';
|
buf[0] = '\0';
|
||||||
|
|
|
@ -119,7 +119,7 @@ struct NetworkSettings {
|
||||||
char rcon_password[NETWORK_PASSWORD_LENGTH]; ///< passowrd for rconsole (server side)
|
char rcon_password[NETWORK_PASSWORD_LENGTH]; ///< passowrd for rconsole (server side)
|
||||||
bool server_advertise; ///< advertise the server to the masterserver
|
bool server_advertise; ///< advertise the server to the masterserver
|
||||||
uint8 lan_internet; ///< search on the LAN or internet for servers
|
uint8 lan_internet; ///< search on the LAN or internet for servers
|
||||||
char client_name[NETWORK_NAME_LENGTH]; ///< name of the player (as client)
|
char client_name[NETWORK_CLIENT_NAME_LENGTH]; ///< name of the player (as client)
|
||||||
char default_company_pass[NETWORK_PASSWORD_LENGTH]; ///< default password for new companies in encrypted form
|
char default_company_pass[NETWORK_PASSWORD_LENGTH]; ///< default password for new companies in encrypted form
|
||||||
char connect_to_ip[NETWORK_HOSTNAME_LENGTH]; ///< default for the "Add server" query
|
char connect_to_ip[NETWORK_HOSTNAME_LENGTH]; ///< default for the "Add server" query
|
||||||
char network_id[NETWORK_UNIQUE_ID_LENGTH]; ///< semi-unique ID of the client
|
char network_id[NETWORK_UNIQUE_ID_LENGTH]; ///< semi-unique ID of the client
|
||||||
|
|
|
@ -99,7 +99,7 @@ static char _cases[MAX_NUM_CASES][16];
|
||||||
static uint _numcases;
|
static uint _numcases;
|
||||||
|
|
||||||
/* for each plural value, this is the number of plural forms. */
|
/* for each plural value, this is the number of plural forms. */
|
||||||
static const byte _plural_form_counts[] = { 2, 1, 2, 3, 3, 3, 3, 3, 4, 2 };
|
static const byte _plural_form_counts[] = { 2, 1, 2, 3, 3, 3, 3, 3, 4, 2, 3 };
|
||||||
|
|
||||||
static const char *_cur_ident;
|
static const char *_cur_ident;
|
||||||
|
|
||||||
|
@ -1193,9 +1193,9 @@ static void WriteLangfile(const char *filename)
|
||||||
hdr.text_dir = _lang_textdir;
|
hdr.text_dir = _lang_textdir;
|
||||||
hdr.winlangid = TO_LE16(_lang_winlangid);
|
hdr.winlangid = TO_LE16(_lang_winlangid);
|
||||||
hdr.newgrflangid = _lang_newgrflangid;
|
hdr.newgrflangid = _lang_newgrflangid;
|
||||||
strcpy(hdr.name, _lang_name);
|
strecpy(hdr.name, _lang_name, lastof(hdr.name));
|
||||||
strcpy(hdr.own_name, _lang_ownname);
|
strecpy(hdr.own_name, _lang_ownname, lastof(hdr.own_name));
|
||||||
strcpy(hdr.isocode, _lang_isocode);
|
strecpy(hdr.isocode, _lang_isocode, lastof(hdr.isocode));
|
||||||
|
|
||||||
fwrite(&hdr, sizeof(hdr), 1, f);
|
fwrite(&hdr, sizeof(hdr), 1, f);
|
||||||
|
|
||||||
|
|
|
@ -439,7 +439,7 @@ static int DeterminePluralForm(int64 count)
|
||||||
|
|
||||||
/* Three forms, special cases for numbers ending in 1 and 2, 3, 4, except those ending in 1[1-4]
|
/* Three forms, special cases for numbers ending in 1 and 2, 3, 4, except those ending in 1[1-4]
|
||||||
* Used in:
|
* Used in:
|
||||||
* Croatian, Czech, Russian, Slovak, Ukrainian */
|
* Croatian, Russian, Slovak, Ukrainian */
|
||||||
case 6:
|
case 6:
|
||||||
return n % 10 == 1 && n % 100 != 11 ? 0 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2;
|
return n % 10 == 1 && n % 100 != 11 ? 0 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2;
|
||||||
|
|
||||||
|
@ -460,6 +460,12 @@ static int DeterminePluralForm(int64 count)
|
||||||
* Icelandic */
|
* Icelandic */
|
||||||
case 9:
|
case 9:
|
||||||
return n % 10 == 1 && n % 100 != 11 ? 0 : 1;
|
return n % 10 == 1 && n % 100 != 11 ? 0 : 1;
|
||||||
|
|
||||||
|
/* Three forms, special cases for one and 2, 3, or 4
|
||||||
|
* Used in:
|
||||||
|
* Czech */
|
||||||
|
case 10:
|
||||||
|
return n == 1 ? 0 : n >= 2 && n <= 4 ? 1 : 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -222,7 +222,7 @@ static void DedicatedHandleKeyInput()
|
||||||
#else
|
#else
|
||||||
/* Handle console input, and singal console thread, it can accept input again */
|
/* Handle console input, and singal console thread, it can accept input again */
|
||||||
assert_compile(lengthof(_win_console_thread_buffer) <= lengthof(input_line));
|
assert_compile(lengthof(_win_console_thread_buffer) <= lengthof(input_line));
|
||||||
strcpy(input_line, _win_console_thread_buffer);
|
strecpy(input_line, _win_console_thread_buffer, lastof(input_line));
|
||||||
SetEvent(_hWaitForInputHandling);
|
SetEvent(_hWaitForInputHandling);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue