src/strings.cpp
author rubidium
Sat, 19 Apr 2008 13:04:29 +0000
changeset 10254 14e7c7ada607
parent 10250 e64ee7484b43
child 10261 b3e7149e3d81
permissions -rw-r--r--
(svn r12786) -Change: remove more function from functions.h.
2186
461a2aff3486 (svn r2701) Insert Id tags into all source files
tron
parents: 2163
diff changeset
     1
/* $Id$ */
461a2aff3486 (svn r2701) Insert Id tags into all source files
tron
parents: 2163
diff changeset
     2
6916
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6685
diff changeset
     3
/** @file strings.cpp */
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6685
diff changeset
     4
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
     5
#include "stdafx.h"
1891
92a3b0aa0946 (svn r2397) - CodeChange: rename all "ttd" files to "openttd" files.
Darkvater
parents: 1853
diff changeset
     6
#include "openttd.h"
2291
2b064aa97f91 (svn r2815) Store the currency information in one central place instead of scattering it in several unrelated files
tron
parents: 2257
diff changeset
     7
#include "currency.h"
9260
fc088947405b (svn r12460) -Change: rename src/namegen.h to src/namegen_func.h so MSVC can have both files in it's treelist.
rubidium
parents: 9259
diff changeset
     8
#include "namegen_func.h"
9281
d8cd9ac52a68 (svn r12489) -Codechange: split station.h into station_base.h and station_func.h.
rubidium
parents: 9260
diff changeset
     9
#include "station_base.h"
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    10
#include "town.h"
430
75820dedf4f1 (svn r631) Merge r440, r444, r485, r630 to trunk:
tron
parents: 425
diff changeset
    11
#include "screenshot.h"
1542
2ca6d1624e6d (svn r2046) -Codechange: moved all waypoint code to waypoint.c/waypoint.h
truelight
parents: 1376
diff changeset
    12
#include "waypoint.h"
2070
26c657906f25 (svn r2580) Change: Added {INDUSTRY} command for printing industry names instead of the old {TOWN} {STRING} way.
ludde
parents: 2063
diff changeset
    13
#include "industry.h"
2159
3b634157c3b2 (svn r2669) Shuffle some more stuff around to reduce dependencies
tron
parents: 2150
diff changeset
    14
#include "variables.h"
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3489
diff changeset
    15
#include "newgrf_text.h"
4120
90e678fd7d8d (svn r5464) [Behaviour Fix] : When starting the game, the system will now verify the presence of music files in gm forlder.
belugas
parents: 3833
diff changeset
    16
#include "music.h"
4942
f990abfa4438 (svn r6930) -Codechange: Move industry name into IndustrySpec
belugas
parents: 4920
diff changeset
    17
#include "industry.h"
7425
350b9265b7a2 (svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents: 7394
diff changeset
    18
#include "fileio.h"
6417
26acff62d001 (svn r8826) -Codechange: Replace _cargoc's separate arrays with a regular struct array (with accessor) and implement new initialization method using cargo labels.
peter1138
parents: 6414
diff changeset
    19
#include "cargotype.h"
7139
4ae3ab180d05 (svn r9874) -Feature: advanced vehicle lists a.k.a. group interface. Now you can make groups of vehicles and perform all kinds of tasks on that given group. Original code by nycom and graphics by skidd13.
rubidium
parents: 6988
diff changeset
    20
#include "group.h"
4ae3ab180d05 (svn r9874) -Feature: advanced vehicle lists a.k.a. group interface. Now you can make groups of vehicles and perform all kinds of tasks on that given group. Original code by nycom and graphics by skidd13.
rubidium
parents: 6988
diff changeset
    21
#include "debug.h"
7452
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7425
diff changeset
    22
#include "newgrf_townname.h"
9286
d446bf9f4a68 (svn r12501) -Codechange: split signs.h.
rubidium
parents: 9282
diff changeset
    23
#include "signs_base.h"
7555
e20900912fa2 (svn r10324) -Codechange: reference engine names by index
peter1138
parents: 7554
diff changeset
    24
#include "newgrf_engine.h"
8582
9d7754037bde (svn r11647) -Fix (r11646): it did not compile without freetype...
rubidium
parents: 8581
diff changeset
    25
#include "spritecache.h"
8581
8e4e36a205fe (svn r11646) -Codechange: check whether (some) characters are missing in the current 'font' for the 'currently' chosen language and give a warning when that does happen.
rubidium
parents: 8450
diff changeset
    26
#include "fontcache.h"
8e4e36a205fe (svn r11646) -Codechange: check whether (some) characters are missing in the current 'font' for the 'currently' chosen language and give a warning when that does happen.
rubidium
parents: 8450
diff changeset
    27
#include "gui.h"
8610
17cc343a23dd (svn r11675) -Codechange: split the string types from the string functions.
rubidium
parents: 8583
diff changeset
    28
#include "strings_func.h"
8627
448ebf3a8291 (svn r11692) -Codechange: move some functions from 'functions.h' to a more logical place and remove about 50% of the includes of 'functions.h'
rubidium
parents: 8626
diff changeset
    29
#include "functions.h"
8616
0c0b4b5a67ce (svn r11681) -Fix (r11674): hopefully fix the compile error on big endian machines.
rubidium
parents: 8610
diff changeset
    30
#include "core/endian_func.hpp"
8636
2b158acb649c (svn r11702) -Codechange: move all date related stuff to date*.
rubidium
parents: 8628
diff changeset
    31
#include "date_func.h"
8640
1e93b81e96d2 (svn r11706) -Codechange: split vehicle.h and remove another bunch of useless includes.
rubidium
parents: 8636
diff changeset
    32
#include "vehicle_base.h"
8710
52015340050c (svn r11777) -Codechange: split the string header and make do not include it when it's not necessary.
rubidium
parents: 8698
diff changeset
    33
#include "string_func.h"
8750
fdd6054e7bae (svn r11818) -Codechange: split player.h into smaller pieces.
rubidium
parents: 8733
diff changeset
    34
#include "player_func.h"
fdd6054e7bae (svn r11818) -Codechange: split player.h into smaller pieces.
rubidium
parents: 8733
diff changeset
    35
#include "player_base.h"
8760
ce0891c412ce (svn r11828) -Codechange: include table/* as the last includes and remove an unneeded include from openttd.h.
rubidium
parents: 8754
diff changeset
    36
#include "fios.h"
8766
c86cfa3a7580 (svn r11834) -Codechange: only include settings_type.h if needed.
rubidium
parents: 8760
diff changeset
    37
#include "settings_type.h"
8771
f7ad4dba14bf (svn r11839) -Codechange: move some variables from variables.h to a more logical location.
rubidium
parents: 8766
diff changeset
    38
#include "video/video_driver.hpp"
9282
2bb9703aeb39 (svn r12490) -Codechange: rename engine.h to engine_func.h and remove unneeded inclusions of engine.h and/or replace them with engine_type.h.
rubidium
parents: 9281
diff changeset
    39
#include "engine_func.h"
10250
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
    40
#include "saveload.h"
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    41
8760
ce0891c412ce (svn r11828) -Codechange: include table/* as the last includes and remove an unneeded include from openttd.h.
rubidium
parents: 8754
diff changeset
    42
#include "table/strings.h"
ce0891c412ce (svn r11828) -Codechange: include table/* as the last includes and remove an unneeded include from openttd.h.
rubidium
parents: 8754
diff changeset
    43
#include "table/control_codes.h"
4219
4211284f29ec (svn r5763) - Cleanup: Move the now unified GetLanguageList and comparator function to strings.c where it belongs.
Darkvater
parents: 4120
diff changeset
    44
6646
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
    45
DynamicLanguages _dynlang;
2201
3300b6ce8bce (svn r2717) Move _userstring to strings.[ch]
tron
parents: 2186
diff changeset
    46
char _userstring[128];
7762
03721db0ac1c (svn r10587) -Codechange: move the string/dparam related stuff from variables.h to strings.h
rubidium
parents: 7555
diff changeset
    47
uint64 _decode_parameters[20];
2201
3300b6ce8bce (svn r2717) Move _userstring to strings.[ch]
tron
parents: 2186
diff changeset
    48
4912
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
    49
static char *StationGetSpecialString(char *buff, int x, const char* last);
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
    50
static char *GetSpecialTownNameString(char *buff, int ind, uint32 seed, const char* last);
7498
ce6588257e8d (svn r10258) -Codechange: as we are now using int64 all over the place, it's better to use int64 variables in the string generating too instead of packing them into two int32s.
rubidium
parents: 7492
diff changeset
    51
static char *GetSpecialPlayerNameString(char *buff, int ind, const int64 *argv, const char* last);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    52
7498
ce6588257e8d (svn r10258) -Codechange: as we are now using int64 all over the place, it's better to use int64 variables in the string generating too instead of packing them into two int32s.
rubidium
parents: 7492
diff changeset
    53
static char *FormatString(char *buff, const char *str, const int64 *argv, uint casei, const char* last);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    54
6574
e1d1a12faaf7 (svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents: 6573
diff changeset
    55
struct LanguagePack {
6916
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6685
diff changeset
    56
	uint32 ident;       // 32-bits identifier
4434
4175805666a5 (svn r6204) -Cleanup: replace non-indentation with spaces; like '}<TAB>else {' -> '} else {', tabs between code and comment, etc.
rubidium
parents: 4416
diff changeset
    57
	uint32 version;     // 32-bits of auto generated version info which is basically a hash of strings.h
4175805666a5 (svn r6204) -Cleanup: replace non-indentation with spaces; like '}<TAB>else {' -> '} else {', tabs between code and comment, etc.
rubidium
parents: 4416
diff changeset
    58
	char name[32];      // the international name of this language
4175805666a5 (svn r6204) -Cleanup: replace non-indentation with spaces; like '}<TAB>else {' -> '} else {', tabs between code and comment, etc.
rubidium
parents: 4416
diff changeset
    59
	char own_name[32];  // the localized name of this language
4175805666a5 (svn r6204) -Cleanup: replace non-indentation with spaces; like '}<TAB>else {' -> '} else {', tabs between code and comment, etc.
rubidium
parents: 4416
diff changeset
    60
	char isocode[16];   // the ISO code for the language (not country code)
4175805666a5 (svn r6204) -Cleanup: replace non-indentation with spaces; like '}<TAB>else {' -> '} else {', tabs between code and comment, etc.
rubidium
parents: 4416
diff changeset
    61
	uint16 offsets[32]; // the offsets
4175805666a5 (svn r6204) -Cleanup: replace non-indentation with spaces; like '}<TAB>else {' -> '} else {', tabs between code and comment, etc.
rubidium
parents: 4416
diff changeset
    62
	byte plural_form;   // how to compute plural forms
4175805666a5 (svn r6204) -Cleanup: replace non-indentation with spaces; like '}<TAB>else {' -> '} else {', tabs between code and comment, etc.
rubidium
parents: 4416
diff changeset
    63
	byte pad[3];        // pad header to be a multiple of 4
6916
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6685
diff changeset
    64
	char data[VARARRAY_SIZE]; // list of strings
6574
e1d1a12faaf7 (svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents: 6573
diff changeset
    65
};
1319
cd302ee91e27 (svn r1823) Get rid of some ugly cast magic concerning language packs
tron
parents: 1318
diff changeset
    66
cd302ee91e27 (svn r1823) Get rid of some ugly cast magic concerning language packs
tron
parents: 1318
diff changeset
    67
static char **_langpack_offs;
cd302ee91e27 (svn r1823) Get rid of some ugly cast magic concerning language packs
tron
parents: 1318
diff changeset
    68
static LanguagePack *_langpack;
6916
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6685
diff changeset
    69
static uint _langtab_num[32];   // Offset into langpack offs
1319
cd302ee91e27 (svn r1823) Get rid of some ugly cast magic concerning language packs
tron
parents: 1318
diff changeset
    70
static uint _langtab_start[32]; // Offset into langpack offs
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    71
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    72
6916
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6685
diff changeset
    73
/** Read an int64 from the argv array. */
7498
ce6588257e8d (svn r10258) -Codechange: as we are now using int64 all over the place, it's better to use int64 variables in the string generating too instead of packing them into two int32s.
rubidium
parents: 7492
diff changeset
    74
static inline int64 GetInt64(const int64 **argv)
2063
95259a31ceb5 (svn r2572) - Codechange: [string] Changed string system so it's not as dependent on decode_parameters
ludde
parents: 2057
diff changeset
    75
{
95259a31ceb5 (svn r2572) - Codechange: [string] Changed string system so it's not as dependent on decode_parameters
ludde
parents: 2057
diff changeset
    76
	assert(argv);
95259a31ceb5 (svn r2572) - Codechange: [string] Changed string system so it's not as dependent on decode_parameters
ludde
parents: 2057
diff changeset
    77
	return *(*argv)++;
95259a31ceb5 (svn r2572) - Codechange: [string] Changed string system so it's not as dependent on decode_parameters
ludde
parents: 2057
diff changeset
    78
}
95259a31ceb5 (svn r2572) - Codechange: [string] Changed string system so it's not as dependent on decode_parameters
ludde
parents: 2057
diff changeset
    79
7498
ce6588257e8d (svn r10258) -Codechange: as we are now using int64 all over the place, it's better to use int64 variables in the string generating too instead of packing them into two int32s.
rubidium
parents: 7492
diff changeset
    80
/** Read an int32 from the argv array. */
ce6588257e8d (svn r10258) -Codechange: as we are now using int64 all over the place, it's better to use int64 variables in the string generating too instead of packing them into two int32s.
rubidium
parents: 7492
diff changeset
    81
static inline int32 GetInt32(const int64 **argv)
ce6588257e8d (svn r10258) -Codechange: as we are now using int64 all over the place, it's better to use int64 variables in the string generating too instead of packing them into two int32s.
rubidium
parents: 7492
diff changeset
    82
{
ce6588257e8d (svn r10258) -Codechange: as we are now using int64 all over the place, it's better to use int64 variables in the string generating too instead of packing them into two int32s.
rubidium
parents: 7492
diff changeset
    83
	return (int32)GetInt64(argv);
ce6588257e8d (svn r10258) -Codechange: as we are now using int64 all over the place, it's better to use int64 variables in the string generating too instead of packing them into two int32s.
rubidium
parents: 7492
diff changeset
    84
}
ce6588257e8d (svn r10258) -Codechange: as we are now using int64 all over the place, it's better to use int64 variables in the string generating too instead of packing them into two int32s.
rubidium
parents: 7492
diff changeset
    85
6916
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6685
diff changeset
    86
/** Read an array from the argv array. */
7498
ce6588257e8d (svn r10258) -Codechange: as we are now using int64 all over the place, it's better to use int64 variables in the string generating too instead of packing them into two int32s.
rubidium
parents: 7492
diff changeset
    87
static inline const int64 *GetArgvPtr(const int64 **argv, int n)
2063
95259a31ceb5 (svn r2572) - Codechange: [string] Changed string system so it's not as dependent on decode_parameters
ludde
parents: 2057
diff changeset
    88
{
7498
ce6588257e8d (svn r10258) -Codechange: as we are now using int64 all over the place, it's better to use int64 variables in the string generating too instead of packing them into two int32s.
rubidium
parents: 7492
diff changeset
    89
	const int64 *result;
2063
95259a31ceb5 (svn r2572) - Codechange: [string] Changed string system so it's not as dependent on decode_parameters
ludde
parents: 2057
diff changeset
    90
	assert(*argv);
95259a31ceb5 (svn r2572) - Codechange: [string] Changed string system so it's not as dependent on decode_parameters
ludde
parents: 2057
diff changeset
    91
	result = *argv;
95259a31ceb5 (svn r2572) - Codechange: [string] Changed string system so it's not as dependent on decode_parameters
ludde
parents: 2057
diff changeset
    92
	(*argv) += n;
95259a31ceb5 (svn r2572) - Codechange: [string] Changed string system so it's not as dependent on decode_parameters
ludde
parents: 2057
diff changeset
    93
	return result;
95259a31ceb5 (svn r2572) - Codechange: [string] Changed string system so it's not as dependent on decode_parameters
ludde
parents: 2057
diff changeset
    94
}
95259a31ceb5 (svn r2572) - Codechange: [string] Changed string system so it's not as dependent on decode_parameters
ludde
parents: 2057
diff changeset
    95
95259a31ceb5 (svn r2572) - Codechange: [string] Changed string system so it's not as dependent on decode_parameters
ludde
parents: 2057
diff changeset
    96
2055
9361b56db8ba (svn r2564) Fix: Fixed conceptual issue in network_gui.c. AllocateName is not meant to be used by GUI-code, because it modifies the "game-state".
ludde
parents: 2053
diff changeset
    97
#define NUM_BOUND_STRINGS 8
9361b56db8ba (svn r2564) Fix: Fixed conceptual issue in network_gui.c. AllocateName is not meant to be used by GUI-code, because it modifies the "game-state".
ludde
parents: 2053
diff changeset
    98
6916
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6685
diff changeset
    99
/* Array to hold the bound strings. */
2055
9361b56db8ba (svn r2564) Fix: Fixed conceptual issue in network_gui.c. AllocateName is not meant to be used by GUI-code, because it modifies the "game-state".
ludde
parents: 2053
diff changeset
   100
static const char *_bound_strings[NUM_BOUND_STRINGS];
9361b56db8ba (svn r2564) Fix: Fixed conceptual issue in network_gui.c. AllocateName is not meant to be used by GUI-code, because it modifies the "game-state".
ludde
parents: 2053
diff changeset
   101
6916
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6685
diff changeset
   102
/* This index is used to implement a "round-robin" allocating of
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6685
diff changeset
   103
 * slots for BindCString. NUM_BOUND_STRINGS slots are reserved.
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6685
diff changeset
   104
 * Which means that after NUM_BOUND_STRINGS calls to BindCString,
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6685
diff changeset
   105
 * the indices will be reused. */
2055
9361b56db8ba (svn r2564) Fix: Fixed conceptual issue in network_gui.c. AllocateName is not meant to be used by GUI-code, because it modifies the "game-state".
ludde
parents: 2053
diff changeset
   106
static int _bind_index;
9361b56db8ba (svn r2564) Fix: Fixed conceptual issue in network_gui.c. AllocateName is not meant to be used by GUI-code, because it modifies the "game-state".
ludde
parents: 2053
diff changeset
   107
8941
f93c669d3ca6 (svn r12015) -Fix [FS#1716] (Revert r11422): Patch in FS#1430 avoided instead of fixed the problem. GetStringWithArgs() discards information that SCC_GENDER_LIST needs to work. Now use pointers to retrieve GRF strings, so that GetStringPtr() will work correctly. This is advantageous as now no buffer copy is made when using all GRF strings.
peter1138
parents: 8819
diff changeset
   108
const char *GetStringPtr(StringID string)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   109
{
8941
f93c669d3ca6 (svn r12015) -Fix [FS#1716] (Revert r11422): Patch in FS#1430 avoided instead of fixed the problem. GetStringWithArgs() discards information that SCC_GENDER_LIST needs to work. Now use pointers to retrieve GRF strings, so that GetStringPtr() will work correctly. This is advantageous as now no buffer copy is made when using all GRF strings.
peter1138
parents: 8819
diff changeset
   110
	switch (GB(string, 11, 5)) {
f93c669d3ca6 (svn r12015) -Fix [FS#1716] (Revert r11422): Patch in FS#1430 avoided instead of fixed the problem. GetStringWithArgs() discards information that SCC_GENDER_LIST needs to work. Now use pointers to retrieve GRF strings, so that GetStringPtr() will work correctly. This is advantageous as now no buffer copy is made when using all GRF strings.
peter1138
parents: 8819
diff changeset
   111
		case 28: return GetGRFStringPtr(GB(string, 0, 11));
f93c669d3ca6 (svn r12015) -Fix [FS#1716] (Revert r11422): Patch in FS#1430 avoided instead of fixed the problem. GetStringWithArgs() discards information that SCC_GENDER_LIST needs to work. Now use pointers to retrieve GRF strings, so that GetStringPtr() will work correctly. This is advantageous as now no buffer copy is made when using all GRF strings.
peter1138
parents: 8819
diff changeset
   112
		case 29: return GetGRFStringPtr(GB(string, 0, 11) + 0x0800);
f93c669d3ca6 (svn r12015) -Fix [FS#1716] (Revert r11422): Patch in FS#1430 avoided instead of fixed the problem. GetStringWithArgs() discards information that SCC_GENDER_LIST needs to work. Now use pointers to retrieve GRF strings, so that GetStringPtr() will work correctly. This is advantageous as now no buffer copy is made when using all GRF strings.
peter1138
parents: 8819
diff changeset
   113
		case 30: return GetGRFStringPtr(GB(string, 0, 11) + 0x1000);
f93c669d3ca6 (svn r12015) -Fix [FS#1716] (Revert r11422): Patch in FS#1430 avoided instead of fixed the problem. GetStringWithArgs() discards information that SCC_GENDER_LIST needs to work. Now use pointers to retrieve GRF strings, so that GetStringPtr() will work correctly. This is advantageous as now no buffer copy is made when using all GRF strings.
peter1138
parents: 8819
diff changeset
   114
		default: return _langpack_offs[_langtab_start[string >> 11] + (string & 0x7FF)];
f93c669d3ca6 (svn r12015) -Fix [FS#1716] (Revert r11422): Patch in FS#1430 avoided instead of fixed the problem. GetStringWithArgs() discards information that SCC_GENDER_LIST needs to work. Now use pointers to retrieve GRF strings, so that GetStringPtr() will work correctly. This is advantageous as now no buffer copy is made when using all GRF strings.
peter1138
parents: 8819
diff changeset
   115
	}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   116
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   117
6916
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6685
diff changeset
   118
/** The highest 8 bits of string contain the "case index".
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6685
diff changeset
   119
 * These 8 bits will only be set when FormatString wants to print
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6685
diff changeset
   120
 * the string in a different case. No one else except FormatString
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6685
diff changeset
   121
 * should set those bits, therefore string CANNOT be StringID, but uint32.
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6685
diff changeset
   122
 * @param buffr
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6685
diff changeset
   123
 * @param string
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6685
diff changeset
   124
 * @param argv
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6685
diff changeset
   125
 * @param last
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6685
diff changeset
   126
 * @return a formatted string of char
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6685
diff changeset
   127
 */
7498
ce6588257e8d (svn r10258) -Codechange: as we are now using int64 all over the place, it's better to use int64 variables in the string generating too instead of packing them into two int32s.
rubidium
parents: 7492
diff changeset
   128
static char *GetStringWithArgs(char *buffr, uint string, const int64 *argv, const char* last)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   129
{
8306
e3f8ee5113ed (svn r11360) -Fix [FS#1375]: do not crash when trying to "draw" an invalid string, just draw a message saying it is invalid.
rubidium
parents: 8259
diff changeset
   130
	if (GB(string, 0, 16) == 0) return GetStringWithArgs(buffr, STR_UNDEFINED, argv, last);
e3f8ee5113ed (svn r11360) -Fix [FS#1375]: do not crash when trying to "draw" an invalid string, just draw a message saying it is invalid.
rubidium
parents: 8259
diff changeset
   131
2140
d708eb80ab8b (svn r2650) Convert many explicit shifts+ands to extract bits to invocations of GB - should be a bit nicer to read
tron
parents: 2131
diff changeset
   132
	uint index = GB(string,  0, 11);
d708eb80ab8b (svn r2650) Convert many explicit shifts+ands to extract bits to invocations of GB - should be a bit nicer to read
tron
parents: 2131
diff changeset
   133
	uint tab   = GB(string, 11,  5);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   134
1321
938ec22ae6f7 (svn r1825) Further style improvements:
tron
parents: 1319
diff changeset
   135
	switch (tab) {
938ec22ae6f7 (svn r1825) Further style improvements:
tron
parents: 1319
diff changeset
   136
		case 4:
2063
95259a31ceb5 (svn r2572) - Codechange: [string] Changed string system so it's not as dependent on decode_parameters
ludde
parents: 2057
diff changeset
   137
			if (index >= 0xC0)
4912
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
   138
				return GetSpecialTownNameString(buffr, index - 0xC0, GetInt32(&argv), last);
1321
938ec22ae6f7 (svn r1825) Further style improvements:
tron
parents: 1319
diff changeset
   139
			break;
938ec22ae6f7 (svn r1825) Further style improvements:
tron
parents: 1319
diff changeset
   140
938ec22ae6f7 (svn r1825) Further style improvements:
tron
parents: 1319
diff changeset
   141
		case 14:
2063
95259a31ceb5 (svn r2572) - Codechange: [string] Changed string system so it's not as dependent on decode_parameters
ludde
parents: 2057
diff changeset
   142
			if (index >= 0xE4)
4912
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
   143
				return GetSpecialPlayerNameString(buffr, index - 0xE4, argv, last);
1321
938ec22ae6f7 (svn r1825) Further style improvements:
tron
parents: 1319
diff changeset
   144
			break;
938ec22ae6f7 (svn r1825) Further style improvements:
tron
parents: 1319
diff changeset
   145
938ec22ae6f7 (svn r1825) Further style improvements:
tron
parents: 1319
diff changeset
   146
		case 15:
8941
f93c669d3ca6 (svn r12015) -Fix [FS#1716] (Revert r11422): Patch in FS#1430 avoided instead of fixed the problem. GetStringWithArgs() discards information that SCC_GENDER_LIST needs to work. Now use pointers to retrieve GRF strings, so that GetStringPtr() will work correctly. This is advantageous as now no buffer copy is made when using all GRF strings.
peter1138
parents: 8819
diff changeset
   147
			/* Old table for custom names. This is no longer used */
f93c669d3ca6 (svn r12015) -Fix [FS#1716] (Revert r11422): Patch in FS#1430 avoided instead of fixed the problem. GetStringWithArgs() discards information that SCC_GENDER_LIST needs to work. Now use pointers to retrieve GRF strings, so that GetStringPtr() will work correctly. This is advantageous as now no buffer copy is made when using all GRF strings.
peter1138
parents: 8819
diff changeset
   148
			error("Incorrect conversion of custom name string.");
1321
938ec22ae6f7 (svn r1825) Further style improvements:
tron
parents: 1319
diff changeset
   149
4710
a663b32b9f96 (svn r6622) - Add support for NewGRF text includes. (Based on mart3p's patch)
peter1138
parents: 4602
diff changeset
   150
		case 26:
a663b32b9f96 (svn r6622) - Add support for NewGRF text includes. (Based on mart3p's patch)
peter1138
parents: 4602
diff changeset
   151
			/* Include string within newgrf text (format code 81) */
8424
4a488a90ccab (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 8368
diff changeset
   152
			if (HasBit(index, 10)) {
4710
a663b32b9f96 (svn r6622) - Add support for NewGRF text includes. (Based on mart3p's patch)
peter1138
parents: 4602
diff changeset
   153
				StringID string = GetGRFStringID(0, 0xD000 + GB(index, 0, 10));
4912
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
   154
				return GetStringWithArgs(buffr, string, argv, last);
4710
a663b32b9f96 (svn r6622) - Add support for NewGRF text includes. (Based on mart3p's patch)
peter1138
parents: 4602
diff changeset
   155
			}
a663b32b9f96 (svn r6622) - Add support for NewGRF text includes. (Based on mart3p's patch)
peter1138
parents: 4602
diff changeset
   156
			break;
a663b32b9f96 (svn r6622) - Add support for NewGRF text includes. (Based on mart3p's patch)
peter1138
parents: 4602
diff changeset
   157
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3489
diff changeset
   158
		case 28:
8941
f93c669d3ca6 (svn r12015) -Fix [FS#1716] (Revert r11422): Patch in FS#1430 avoided instead of fixed the problem. GetStringWithArgs() discards information that SCC_GENDER_LIST needs to work. Now use pointers to retrieve GRF strings, so that GetStringPtr() will work correctly. This is advantageous as now no buffer copy is made when using all GRF strings.
peter1138
parents: 8819
diff changeset
   159
			return FormatString(buffr, GetGRFStringPtr(index), argv, 0, last);
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3489
diff changeset
   160
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3489
diff changeset
   161
		case 29:
8941
f93c669d3ca6 (svn r12015) -Fix [FS#1716] (Revert r11422): Patch in FS#1430 avoided instead of fixed the problem. GetStringWithArgs() discards information that SCC_GENDER_LIST needs to work. Now use pointers to retrieve GRF strings, so that GetStringPtr() will work correctly. This is advantageous as now no buffer copy is made when using all GRF strings.
peter1138
parents: 8819
diff changeset
   162
			return FormatString(buffr, GetGRFStringPtr(index + 0x0800), argv, 0, last);
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3489
diff changeset
   163
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3489
diff changeset
   164
		case 30:
8941
f93c669d3ca6 (svn r12015) -Fix [FS#1716] (Revert r11422): Patch in FS#1430 avoided instead of fixed the problem. GetStringWithArgs() discards information that SCC_GENDER_LIST needs to work. Now use pointers to retrieve GRF strings, so that GetStringPtr() will work correctly. This is advantageous as now no buffer copy is made when using all GRF strings.
peter1138
parents: 8819
diff changeset
   165
			return FormatString(buffr, GetGRFStringPtr(index + 0x1000), argv, 0, last);
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3489
diff changeset
   166
2063
95259a31ceb5 (svn r2572) - Codechange: [string] Changed string system so it's not as dependent on decode_parameters
ludde
parents: 2057
diff changeset
   167
		case 31:
6916
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6685
diff changeset
   168
			/* dynamic strings. These are NOT to be passed through the formatter,
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6685
diff changeset
   169
			 * but passed through verbatim. */
2055
9361b56db8ba (svn r2564) Fix: Fixed conceptual issue in network_gui.c. AllocateName is not meant to be used by GUI-code, because it modifies the "game-state".
ludde
parents: 2053
diff changeset
   170
			if (index < (STR_SPEC_USERSTRING & 0x7FF)) {
4912
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
   171
				return strecpy(buffr, _bound_strings[index], last);
2055
9361b56db8ba (svn r2564) Fix: Fixed conceptual issue in network_gui.c. AllocateName is not meant to be used by GUI-code, because it modifies the "game-state".
ludde
parents: 2053
diff changeset
   172
			}
1321
938ec22ae6f7 (svn r1825) Further style improvements:
tron
parents: 1319
diff changeset
   173
4912
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
   174
			return FormatString(buffr, _userstring, NULL, 0, last);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   175
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   176
2639
8a7342eb3a78 (svn r3181) -Bracing
tron
parents: 2635
diff changeset
   177
	if (index >= _langtab_num[tab]) {
1321
938ec22ae6f7 (svn r1825) Further style improvements:
tron
parents: 1319
diff changeset
   178
		error(
938ec22ae6f7 (svn r1825) Further style improvements:
tron
parents: 1319
diff changeset
   179
			"!String 0x%X is invalid. "
938ec22ae6f7 (svn r1825) Further style improvements:
tron
parents: 1319
diff changeset
   180
			"Probably because an old version of the .lng file.\n", string
938ec22ae6f7 (svn r1825) Further style improvements:
tron
parents: 1319
diff changeset
   181
		);
2639
8a7342eb3a78 (svn r3181) -Bracing
tron
parents: 2635
diff changeset
   182
	}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   183
4912
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
   184
	return FormatString(buffr, GetStringPtr(GB(string, 0, 16)), argv, GB(string, 24, 8), last);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   185
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   186
4912
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
   187
char *GetString(char *buffr, StringID string, const char* last)
2063
95259a31ceb5 (svn r2572) - Codechange: [string] Changed string system so it's not as dependent on decode_parameters
ludde
parents: 2057
diff changeset
   188
{
7498
ce6588257e8d (svn r10258) -Codechange: as we are now using int64 all over the place, it's better to use int64 variables in the string generating too instead of packing them into two int32s.
rubidium
parents: 7492
diff changeset
   189
	return GetStringWithArgs(buffr, string, (int64*)_decode_parameters, last);
2063
95259a31ceb5 (svn r2572) - Codechange: [string] Changed string system so it's not as dependent on decode_parameters
ludde
parents: 2057
diff changeset
   190
}
95259a31ceb5 (svn r2572) - Codechange: [string] Changed string system so it's not as dependent on decode_parameters
ludde
parents: 2057
diff changeset
   191
95259a31ceb5 (svn r2572) - Codechange: [string] Changed string system so it's not as dependent on decode_parameters
ludde
parents: 2057
diff changeset
   192
5108
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   193
char *InlineString(char *buf, StringID string)
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   194
{
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   195
	buf += Utf8Encode(buf, SCC_STRING_ID);
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   196
	buf += Utf8Encode(buf, string);
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   197
	return buf;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   198
}
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   199
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   200
6484
8258acaa52c8 (svn r8906) -Feature: translation dependant formatting of dates.
rubidium
parents: 6417
diff changeset
   201
/**
8258acaa52c8 (svn r8906) -Feature: translation dependant formatting of dates.
rubidium
parents: 6417
diff changeset
   202
 * This function takes a C-string and allocates a temporary string ID.
8258acaa52c8 (svn r8906) -Feature: translation dependant formatting of dates.
rubidium
parents: 6417
diff changeset
   203
 * The StringID of the bound string is valid until BindCString is called
8258acaa52c8 (svn r8906) -Feature: translation dependant formatting of dates.
rubidium
parents: 6417
diff changeset
   204
 * another NUM_BOUND_STRINGS times. So be careful when using it.
6916
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6685
diff changeset
   205
 * @param str temp string to add
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6685
diff changeset
   206
 * @return the id of that temp string
6484
8258acaa52c8 (svn r8906) -Feature: translation dependant formatting of dates.
rubidium
parents: 6417
diff changeset
   207
 * @note formatting a DATE_TINY calls BindCString twice, thus reduces the
8258acaa52c8 (svn r8906) -Feature: translation dependant formatting of dates.
rubidium
parents: 6417
diff changeset
   208
 *       amount of 'user' bound strings by 2.
8258acaa52c8 (svn r8906) -Feature: translation dependant formatting of dates.
rubidium
parents: 6417
diff changeset
   209
 * @todo rewrite the BindCString system to make the limit flexible and
8258acaa52c8 (svn r8906) -Feature: translation dependant formatting of dates.
rubidium
parents: 6417
diff changeset
   210
 *       non-round-robin. For example by using smart pointers that free
8258acaa52c8 (svn r8906) -Feature: translation dependant formatting of dates.
rubidium
parents: 6417
diff changeset
   211
 *       the allocated StringID when they go out-of-scope/are freed.
8258acaa52c8 (svn r8906) -Feature: translation dependant formatting of dates.
rubidium
parents: 6417
diff changeset
   212
 */
2055
9361b56db8ba (svn r2564) Fix: Fixed conceptual issue in network_gui.c. AllocateName is not meant to be used by GUI-code, because it modifies the "game-state".
ludde
parents: 2053
diff changeset
   213
StringID BindCString(const char *str)
9361b56db8ba (svn r2564) Fix: Fixed conceptual issue in network_gui.c. AllocateName is not meant to be used by GUI-code, because it modifies the "game-state".
ludde
parents: 2053
diff changeset
   214
{
9361b56db8ba (svn r2564) Fix: Fixed conceptual issue in network_gui.c. AllocateName is not meant to be used by GUI-code, because it modifies the "game-state".
ludde
parents: 2053
diff changeset
   215
	int idx = (++_bind_index) & (NUM_BOUND_STRINGS - 1);
9361b56db8ba (svn r2564) Fix: Fixed conceptual issue in network_gui.c. AllocateName is not meant to be used by GUI-code, because it modifies the "game-state".
ludde
parents: 2053
diff changeset
   216
	_bound_strings[idx] = str;
9361b56db8ba (svn r2564) Fix: Fixed conceptual issue in network_gui.c. AllocateName is not meant to be used by GUI-code, because it modifies the "game-state".
ludde
parents: 2053
diff changeset
   217
	return idx + STR_SPEC_DYNSTRING;
9361b56db8ba (svn r2564) Fix: Fixed conceptual issue in network_gui.c. AllocateName is not meant to be used by GUI-code, because it modifies the "game-state".
ludde
parents: 2053
diff changeset
   218
}
9361b56db8ba (svn r2564) Fix: Fixed conceptual issue in network_gui.c. AllocateName is not meant to be used by GUI-code, because it modifies the "game-state".
ludde
parents: 2053
diff changeset
   219
6916
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6685
diff changeset
   220
/** This function is used to "bind" a C string to a OpenTTD dparam slot.
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6685
diff changeset
   221
 * @param n slot of the string
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6685
diff changeset
   222
 * @param str string to bind
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6685
diff changeset
   223
 */
2055
9361b56db8ba (svn r2564) Fix: Fixed conceptual issue in network_gui.c. AllocateName is not meant to be used by GUI-code, because it modifies the "game-state".
ludde
parents: 2053
diff changeset
   224
void SetDParamStr(uint n, const char *str)
9361b56db8ba (svn r2564) Fix: Fixed conceptual issue in network_gui.c. AllocateName is not meant to be used by GUI-code, because it modifies the "game-state".
ludde
parents: 2053
diff changeset
   225
{
9361b56db8ba (svn r2564) Fix: Fixed conceptual issue in network_gui.c. AllocateName is not meant to be used by GUI-code, because it modifies the "game-state".
ludde
parents: 2053
diff changeset
   226
	SetDParam(n, BindCString(str));
9361b56db8ba (svn r2564) Fix: Fixed conceptual issue in network_gui.c. AllocateName is not meant to be used by GUI-code, because it modifies the "game-state".
ludde
parents: 2053
diff changeset
   227
}
9361b56db8ba (svn r2564) Fix: Fixed conceptual issue in network_gui.c. AllocateName is not meant to be used by GUI-code, because it modifies the "game-state".
ludde
parents: 2053
diff changeset
   228
1309
dab90d4cbf2d (svn r1813) Declare functions implemented in strings.c in their own shiny new header (though i think some of these function don't belong into strings.c)
tron
parents: 1306
diff changeset
   229
void InjectDParam(int amount)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   230
{
7502
71f5d2c6a605 (svn r10262) -Fix (r10258): some places that needed to be changed to uint64 were hidden/forgotten, which caused memory corruptions and that in caused all kinds of assertions to trigger.
rubidium
parents: 7501
diff changeset
   231
	memmove(_decode_parameters + amount, _decode_parameters, sizeof(_decode_parameters) - amount * sizeof(uint64));
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   232
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   233
4912
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
   234
// TODO
7852
d2491d19f323 (svn r10719) -Codechange: since DParams are now 64 bits we should make NUM and COMMA handle writing 64 bit integers to the strings.
rubidium
parents: 7844
diff changeset
   235
static char *FormatCommaNumber(char *buff, int64 number, const char *last)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   236
{
7852
d2491d19f323 (svn r10719) -Codechange: since DParams are now 64 bits we should make NUM and COMMA handle writing 64 bit integers to the strings.
rubidium
parents: 7844
diff changeset
   237
	uint64 divisor = 10000000000000000000ULL;
d2491d19f323 (svn r10719) -Codechange: since DParams are now 64 bits we should make NUM and COMMA handle writing 64 bit integers to the strings.
rubidium
parents: 7844
diff changeset
   238
	uint64 quot;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   239
	int i;
7852
d2491d19f323 (svn r10719) -Codechange: since DParams are now 64 bits we should make NUM and COMMA handle writing 64 bit integers to the strings.
rubidium
parents: 7844
diff changeset
   240
	uint64 tot;
d2491d19f323 (svn r10719) -Codechange: since DParams are now 64 bits we should make NUM and COMMA handle writing 64 bit integers to the strings.
rubidium
parents: 7844
diff changeset
   241
	uint64 num;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   242
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   243
	if (number < 0) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   244
		*buff++ = '-';
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   245
		number = -number;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   246
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   247
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   248
	num = number;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   249
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   250
	tot = 0;
7852
d2491d19f323 (svn r10719) -Codechange: since DParams are now 64 bits we should make NUM and COMMA handle writing 64 bit integers to the strings.
rubidium
parents: 7844
diff changeset
   251
	for (i = 0; i < 20; i++) {
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   252
		quot = 0;
7852
d2491d19f323 (svn r10719) -Codechange: since DParams are now 64 bits we should make NUM and COMMA handle writing 64 bit integers to the strings.
rubidium
parents: 7844
diff changeset
   253
		if (num >= divisor) {
d2491d19f323 (svn r10719) -Codechange: since DParams are now 64 bits we should make NUM and COMMA handle writing 64 bit integers to the strings.
rubidium
parents: 7844
diff changeset
   254
			quot = num / divisor;
d2491d19f323 (svn r10719) -Codechange: since DParams are now 64 bits we should make NUM and COMMA handle writing 64 bit integers to the strings.
rubidium
parents: 7844
diff changeset
   255
			num = num % divisor;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   256
		}
7852
d2491d19f323 (svn r10719) -Codechange: since DParams are now 64 bits we should make NUM and COMMA handle writing 64 bit integers to the strings.
rubidium
parents: 7844
diff changeset
   257
		if (tot |= quot || i == 19) {
1312
8defbb525d09 (svn r1816) Use char instead of byte for string formatting
tron
parents: 1311
diff changeset
   258
			*buff++ = '0' + quot;
7852
d2491d19f323 (svn r10719) -Codechange: since DParams are now 64 bits we should make NUM and COMMA handle writing 64 bit integers to the strings.
rubidium
parents: 7844
diff changeset
   259
			if ((i % 3) == 1 && i != 19) *buff++ = ',';
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   260
		}
7852
d2491d19f323 (svn r10719) -Codechange: since DParams are now 64 bits we should make NUM and COMMA handle writing 64 bit integers to the strings.
rubidium
parents: 7844
diff changeset
   261
d2491d19f323 (svn r10719) -Codechange: since DParams are now 64 bits we should make NUM and COMMA handle writing 64 bit integers to the strings.
rubidium
parents: 7844
diff changeset
   262
		divisor /= 10;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   263
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   264
1316
a7352de83a2b (svn r1820) Style cleanup:
tron
parents: 1312
diff changeset
   265
	*buff = '\0';
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   266
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   267
	return buff;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   268
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   269
4912
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
   270
// TODO
7852
d2491d19f323 (svn r10719) -Codechange: since DParams are now 64 bits we should make NUM and COMMA handle writing 64 bit integers to the strings.
rubidium
parents: 7844
diff changeset
   271
static char *FormatNoCommaNumber(char *buff, int64 number, const char *last)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   272
{
7852
d2491d19f323 (svn r10719) -Codechange: since DParams are now 64 bits we should make NUM and COMMA handle writing 64 bit integers to the strings.
rubidium
parents: 7844
diff changeset
   273
	uint64 divisor = 10000000000000000000ULL;
d2491d19f323 (svn r10719) -Codechange: since DParams are now 64 bits we should make NUM and COMMA handle writing 64 bit integers to the strings.
rubidium
parents: 7844
diff changeset
   274
	uint64 quot;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   275
	int i;
7852
d2491d19f323 (svn r10719) -Codechange: since DParams are now 64 bits we should make NUM and COMMA handle writing 64 bit integers to the strings.
rubidium
parents: 7844
diff changeset
   276
	uint64 tot;
d2491d19f323 (svn r10719) -Codechange: since DParams are now 64 bits we should make NUM and COMMA handle writing 64 bit integers to the strings.
rubidium
parents: 7844
diff changeset
   277
	uint64 num;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   278
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   279
	if (number < 0) {
4912
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
   280
		buff = strecpy(buff, "-", last);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   281
		number = -number;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   282
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   283
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   284
	num = number;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   285
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   286
	tot = 0;
7852
d2491d19f323 (svn r10719) -Codechange: since DParams are now 64 bits we should make NUM and COMMA handle writing 64 bit integers to the strings.
rubidium
parents: 7844
diff changeset
   287
	for (i = 0; i < 20; i++) {
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   288
		quot = 0;
7852
d2491d19f323 (svn r10719) -Codechange: since DParams are now 64 bits we should make NUM and COMMA handle writing 64 bit integers to the strings.
rubidium
parents: 7844
diff changeset
   289
		if (num >= divisor) {
d2491d19f323 (svn r10719) -Codechange: since DParams are now 64 bits we should make NUM and COMMA handle writing 64 bit integers to the strings.
rubidium
parents: 7844
diff changeset
   290
			quot = num / divisor;
d2491d19f323 (svn r10719) -Codechange: since DParams are now 64 bits we should make NUM and COMMA handle writing 64 bit integers to the strings.
rubidium
parents: 7844
diff changeset
   291
			num = num % divisor;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   292
		}
7852
d2491d19f323 (svn r10719) -Codechange: since DParams are now 64 bits we should make NUM and COMMA handle writing 64 bit integers to the strings.
rubidium
parents: 7844
diff changeset
   293
		if (tot |= quot || i == 19) {
1312
8defbb525d09 (svn r1816) Use char instead of byte for string formatting
tron
parents: 1311
diff changeset
   294
			*buff++ = '0' + quot;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   295
		}
7852
d2491d19f323 (svn r10719) -Codechange: since DParams are now 64 bits we should make NUM and COMMA handle writing 64 bit integers to the strings.
rubidium
parents: 7844
diff changeset
   296
d2491d19f323 (svn r10719) -Codechange: since DParams are now 64 bits we should make NUM and COMMA handle writing 64 bit integers to the strings.
rubidium
parents: 7844
diff changeset
   297
		divisor /= 10;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   298
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   299
1316
a7352de83a2b (svn r1820) Style cleanup:
tron
parents: 1312
diff changeset
   300
	*buff = '\0';
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   301
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   302
	return buff;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   303
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   304
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   305
4912
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
   306
static char *FormatYmdString(char *buff, Date date, const char* last)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   307
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   308
	YearMonthDay ymd;
4289
ff1b2b915cab (svn r5919) -Cleanup: use the type Date when the variable really is a date
rubidium
parents: 4288
diff changeset
   309
	ConvertDateToYMD(date, &ymd);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   310
7498
ce6588257e8d (svn r10258) -Codechange: as we are now using int64 all over the place, it's better to use int64 variables in the string generating too instead of packing them into two int32s.
rubidium
parents: 7492
diff changeset
   311
	int64 args[3] = { ymd.day + STR_01AC_1ST - 1, STR_0162_JAN + ymd.month, ymd.year };
6484
8258acaa52c8 (svn r8906) -Feature: translation dependant formatting of dates.
rubidium
parents: 6417
diff changeset
   312
	return FormatString(buff, GetStringPtr(STR_DATE_LONG), args, 0, last);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   313
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   314
4912
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
   315
static char *FormatMonthAndYear(char *buff, Date date, const char* last)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   316
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   317
	YearMonthDay ymd;
4289
ff1b2b915cab (svn r5919) -Cleanup: use the type Date when the variable really is a date
rubidium
parents: 4288
diff changeset
   318
	ConvertDateToYMD(date, &ymd);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   319
7498
ce6588257e8d (svn r10258) -Codechange: as we are now using int64 all over the place, it's better to use int64 variables in the string generating too instead of packing them into two int32s.
rubidium
parents: 7492
diff changeset
   320
	int64 args[2] = { STR_MONTH_JAN + ymd.month, ymd.year };
6484
8258acaa52c8 (svn r8906) -Feature: translation dependant formatting of dates.
rubidium
parents: 6417
diff changeset
   321
	return FormatString(buff, GetStringPtr(STR_DATE_SHORT), args, 0, last);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   322
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   323
4912
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
   324
static char *FormatTinyDate(char *buff, Date date, const char* last)
1097
653c846fb5d9 (svn r1598) Feature: Message history now is stickyable and resizeable
dominik
parents: 1093
diff changeset
   325
{
653c846fb5d9 (svn r1598) Feature: Message history now is stickyable and resizeable
dominik
parents: 1093
diff changeset
   326
	YearMonthDay ymd;
4289
ff1b2b915cab (svn r5919) -Cleanup: use the type Date when the variable really is a date
rubidium
parents: 4288
diff changeset
   327
	ConvertDateToYMD(date, &ymd);
1097
653c846fb5d9 (svn r1598) Feature: Message history now is stickyable and resizeable
dominik
parents: 1093
diff changeset
   328
6484
8258acaa52c8 (svn r8906) -Feature: translation dependant formatting of dates.
rubidium
parents: 6417
diff changeset
   329
	char day[3];
8258acaa52c8 (svn r8906) -Feature: translation dependant formatting of dates.
rubidium
parents: 6417
diff changeset
   330
	char month[3];
8258acaa52c8 (svn r8906) -Feature: translation dependant formatting of dates.
rubidium
parents: 6417
diff changeset
   331
	/* We want to zero-pad the days and months */
8258acaa52c8 (svn r8906) -Feature: translation dependant formatting of dates.
rubidium
parents: 6417
diff changeset
   332
	snprintf(day,   lengthof(day),   "%02i", ymd.day);
8258acaa52c8 (svn r8906) -Feature: translation dependant formatting of dates.
rubidium
parents: 6417
diff changeset
   333
	snprintf(month, lengthof(month), "%02i", ymd.month + 1);
8258acaa52c8 (svn r8906) -Feature: translation dependant formatting of dates.
rubidium
parents: 6417
diff changeset
   334
7498
ce6588257e8d (svn r10258) -Codechange: as we are now using int64 all over the place, it's better to use int64 variables in the string generating too instead of packing them into two int32s.
rubidium
parents: 7492
diff changeset
   335
	int64 args[3] = { BindCString(day), BindCString(month), ymd.year };
6484
8258acaa52c8 (svn r8906) -Feature: translation dependant formatting of dates.
rubidium
parents: 6417
diff changeset
   336
	return FormatString(buff, GetStringPtr(STR_DATE_TINY), args, 0, last);
1097
653c846fb5d9 (svn r1598) Feature: Message history now is stickyable and resizeable
dominik
parents: 1093
diff changeset
   337
}
653c846fb5d9 (svn r1598) Feature: Message history now is stickyable and resizeable
dominik
parents: 1093
diff changeset
   338
7492
6e76d5fd4ca7 (svn r10252) -Fix: never overflow when applying exchange rates before drawing the amount of money.
rubidium
parents: 7490
diff changeset
   339
static char *FormatGenericCurrency(char *buff, const CurrencySpec *spec, Money number, bool compact, const char* last)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   340
{
8259
127e5d73637d (svn r11312) -Codechange: implement a overflow safe integer and use that for money and don't misuses CommandCost to have a overflow safe integer. Based on a patch by Noldo.
rubidium
parents: 8112
diff changeset
   341
	/* We are going to make number absolute for printing, so
127e5d73637d (svn r11312) -Codechange: implement a overflow safe integer and use that for money and don't misuses CommandCost to have a overflow safe integer. Based on a patch by Noldo.
rubidium
parents: 8112
diff changeset
   342
	 * keep this piece of data as we need it later on */
127e5d73637d (svn r11312) -Codechange: implement a overflow safe integer and use that for money and don't misuses CommandCost to have a overflow safe integer. Based on a patch by Noldo.
rubidium
parents: 8112
diff changeset
   343
	bool negative = number < 0;
127e5d73637d (svn r11312) -Codechange: implement a overflow safe integer and use that for money and don't misuses CommandCost to have a overflow safe integer. Based on a patch by Noldo.
rubidium
parents: 8112
diff changeset
   344
	const char *multiplier = "";
4912
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
   345
	char buf[40];
8259
127e5d73637d (svn r11312) -Codechange: implement a overflow safe integer and use that for money and don't misuses CommandCost to have a overflow safe integer. Based on a patch by Noldo.
rubidium
parents: 8112
diff changeset
   346
	char *p;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   347
	int j;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   348
8259
127e5d73637d (svn r11312) -Codechange: implement a overflow safe integer and use that for money and don't misuses CommandCost to have a overflow safe integer. Based on a patch by Noldo.
rubidium
parents: 8112
diff changeset
   349
	number *= spec->rate;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   350
6916
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6685
diff changeset
   351
	/* convert from negative */
1316
a7352de83a2b (svn r1820) Style cleanup:
tron
parents: 1312
diff changeset
   352
	if (number < 0) {
7918
3b2e2a49a093 (svn r10820) -Codechange: make negative currencies red and restore the colour from before the currency was printed; this removes the need to make two strings for printing currencies (one for positive currencies and one for negative currencies).
rubidium
parents: 7907
diff changeset
   353
		if (buff + Utf8CharLen(SCC_RED) > last) return buff;
3b2e2a49a093 (svn r10820) -Codechange: make negative currencies red and restore the colour from before the currency was printed; this removes the need to make two strings for printing currencies (one for positive currencies and one for negative currencies).
rubidium
parents: 7907
diff changeset
   354
		buff += Utf8Encode(buff, SCC_RED);
4912
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
   355
		buff = strecpy(buff, "-", last);
1316
a7352de83a2b (svn r1820) Style cleanup:
tron
parents: 1312
diff changeset
   356
		number = -number;
a7352de83a2b (svn r1820) Style cleanup:
tron
parents: 1312
diff changeset
   357
	}
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 64
diff changeset
   358
4602
36e779efee9a (svn r6454) -Fix(r6108) : Allow custom currency to display both prefix and suffix
belugas
parents: 4505
diff changeset
   359
	/* Add prefix part, folowing symbol_pos specification.
36e779efee9a (svn r6454) -Fix(r6108) : Allow custom currency to display both prefix and suffix
belugas
parents: 4505
diff changeset
   360
	 * Here, it can can be either 0 (prefix) or 2 (both prefix anf suffix).
36e779efee9a (svn r6454) -Fix(r6108) : Allow custom currency to display both prefix and suffix
belugas
parents: 4505
diff changeset
   361
	 * The only remaining value is 1 (suffix), so everything that is not 1 */
4912
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
   362
	if (spec->symbol_pos != 1) buff = strecpy(buff, spec->prefix, last);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   363
6916
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6685
diff changeset
   364
	/* for huge numbers, compact the number into k or M */
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   365
	if (compact) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   366
		if (number >= 1000000000) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   367
			number = (number + 500000) / 1000000;
4912
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
   368
			multiplier = "M";
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   369
		} else if (number >= 1000000) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   370
			number = (number + 500) / 1000;
4912
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
   371
			multiplier = "k";
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 64
diff changeset
   372
		}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   373
	}
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 64
diff changeset
   374
6916
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6685
diff changeset
   375
	/* convert to ascii number and add commas */
4912
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
   376
	p = endof(buf);
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
   377
	*--p = '\0';
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   378
	j = 4;
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 64
diff changeset
   379
	do {
1316
a7352de83a2b (svn r1820) Style cleanup:
tron
parents: 1312
diff changeset
   380
		if (--j == 0) {
4912
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
   381
			*--p = spec->separator;
1316
a7352de83a2b (svn r1820) Style cleanup:
tron
parents: 1312
diff changeset
   382
			j = 3;
a7352de83a2b (svn r1820) Style cleanup:
tron
parents: 1312
diff changeset
   383
		}
8259
127e5d73637d (svn r11312) -Codechange: implement a overflow safe integer and use that for money and don't misuses CommandCost to have a overflow safe integer. Based on a patch by Noldo.
rubidium
parents: 8112
diff changeset
   384
		*--p = '0' + (char)(number % 10);
4912
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
   385
	} while ((number /= 10) != 0);
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
   386
	buff = strecpy(buff, p, last);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   387
4912
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
   388
	buff = strecpy(buff, multiplier, last);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   389
4602
36e779efee9a (svn r6454) -Fix(r6108) : Allow custom currency to display both prefix and suffix
belugas
parents: 4505
diff changeset
   390
	/* Add suffix part, folowing symbol_pos specification.
36e779efee9a (svn r6454) -Fix(r6108) : Allow custom currency to display both prefix and suffix
belugas
parents: 4505
diff changeset
   391
	 * Here, it can can be either 1 (suffix) or 2 (both prefix anf suffix).
36e779efee9a (svn r6454) -Fix(r6108) : Allow custom currency to display both prefix and suffix
belugas
parents: 4505
diff changeset
   392
	 * The only remaining value is 1 (prefix), so everything that is not 0 */
4912
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
   393
	if (spec->symbol_pos != 0) buff = strecpy(buff, spec->suffix, last);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   394
8259
127e5d73637d (svn r11312) -Codechange: implement a overflow safe integer and use that for money and don't misuses CommandCost to have a overflow safe integer. Based on a patch by Noldo.
rubidium
parents: 8112
diff changeset
   395
	if (negative) {
7918
3b2e2a49a093 (svn r10820) -Codechange: make negative currencies red and restore the colour from before the currency was printed; this removes the need to make two strings for printing currencies (one for positive currencies and one for negative currencies).
rubidium
parents: 7907
diff changeset
   396
		if (buff + Utf8CharLen(SCC_PREVIOUS_COLOUR) > last) return buff;
3b2e2a49a093 (svn r10820) -Codechange: make negative currencies red and restore the colour from before the currency was printed; this removes the need to make two strings for printing currencies (one for positive currencies and one for negative currencies).
rubidium
parents: 7907
diff changeset
   397
		buff += Utf8Encode(buff, SCC_PREVIOUS_COLOUR);
3b2e2a49a093 (svn r10820) -Codechange: make negative currencies red and restore the colour from before the currency was printed; this removes the need to make two strings for printing currencies (one for positive currencies and one for negative currencies).
rubidium
parents: 7907
diff changeset
   398
		*buff = '\0';
3b2e2a49a093 (svn r10820) -Codechange: make negative currencies red and restore the colour from before the currency was printed; this removes the need to make two strings for printing currencies (one for positive currencies and one for negative currencies).
rubidium
parents: 7907
diff changeset
   399
	}
3b2e2a49a093 (svn r10820) -Codechange: make negative currencies red and restore the colour from before the currency was printed; this removes the need to make two strings for printing currencies (one for positive currencies and one for negative currencies).
rubidium
parents: 7907
diff changeset
   400
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   401
	return buff;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   402
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   403
9231
5f6249699caf (svn r12420) -Cleanup: Fix the indentation, improve a variable name, and add a NOT_REACHED to DeterminePluralForm.
maedhros
parents: 9229
diff changeset
   404
static int DeterminePluralForm(int64 count)
2082
52fa58482eeb (svn r2592) Feature: [strgen] New way to specify plural forms.
ludde
parents: 2075
diff changeset
   405
{
6916
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6685
diff changeset
   406
	/* The absolute value determines plurality */
9231
5f6249699caf (svn r12420) -Cleanup: Fix the indentation, improve a variable name, and add a NOT_REACHED to DeterminePluralForm.
maedhros
parents: 9229
diff changeset
   407
	uint64 n = abs(count);
2082
52fa58482eeb (svn r2592) Feature: [strgen] New way to specify plural forms.
ludde
parents: 2075
diff changeset
   408
2952
6a26eeda9679 (svn r3511) More whitespace ([FS#46] by Rubidium)
tron
parents: 2951
diff changeset
   409
	switch (_langpack->plural_form) {
9231
5f6249699caf (svn r12420) -Cleanup: Fix the indentation, improve a variable name, and add a NOT_REACHED to DeterminePluralForm.
maedhros
parents: 9229
diff changeset
   410
		default:
5f6249699caf (svn r12420) -Cleanup: Fix the indentation, improve a variable name, and add a NOT_REACHED to DeterminePluralForm.
maedhros
parents: 9229
diff changeset
   411
			NOT_REACHED();
2082
52fa58482eeb (svn r2592) Feature: [strgen] New way to specify plural forms.
ludde
parents: 2075
diff changeset
   412
9231
5f6249699caf (svn r12420) -Cleanup: Fix the indentation, improve a variable name, and add a NOT_REACHED to DeterminePluralForm.
maedhros
parents: 9229
diff changeset
   413
		/* Two forms, singular used for one only
5f6249699caf (svn r12420) -Cleanup: Fix the indentation, improve a variable name, and add a NOT_REACHED to DeterminePluralForm.
maedhros
parents: 9229
diff changeset
   414
		 * Used in:
5f6249699caf (svn r12420) -Cleanup: Fix the indentation, improve a variable name, and add a NOT_REACHED to DeterminePluralForm.
maedhros
parents: 9229
diff changeset
   415
		 *   Danish, Dutch, English, German, Norwegian, Swedish, Estonian, Finnish,
5f6249699caf (svn r12420) -Cleanup: Fix the indentation, improve a variable name, and add a NOT_REACHED to DeterminePluralForm.
maedhros
parents: 9229
diff changeset
   416
		 *   Greek, Hebrew, Italian, Portuguese, Spanish, Esperanto */
5f6249699caf (svn r12420) -Cleanup: Fix the indentation, improve a variable name, and add a NOT_REACHED to DeterminePluralForm.
maedhros
parents: 9229
diff changeset
   417
		case 0:
5f6249699caf (svn r12420) -Cleanup: Fix the indentation, improve a variable name, and add a NOT_REACHED to DeterminePluralForm.
maedhros
parents: 9229
diff changeset
   418
			return n != 1;
2082
52fa58482eeb (svn r2592) Feature: [strgen] New way to specify plural forms.
ludde
parents: 2075
diff changeset
   419
9231
5f6249699caf (svn r12420) -Cleanup: Fix the indentation, improve a variable name, and add a NOT_REACHED to DeterminePluralForm.
maedhros
parents: 9229
diff changeset
   420
		/* Only one form
5f6249699caf (svn r12420) -Cleanup: Fix the indentation, improve a variable name, and add a NOT_REACHED to DeterminePluralForm.
maedhros
parents: 9229
diff changeset
   421
		 * Used in:
5f6249699caf (svn r12420) -Cleanup: Fix the indentation, improve a variable name, and add a NOT_REACHED to DeterminePluralForm.
maedhros
parents: 9229
diff changeset
   422
		 *   Hungarian, Japanese, Korean, Turkish */
5f6249699caf (svn r12420) -Cleanup: Fix the indentation, improve a variable name, and add a NOT_REACHED to DeterminePluralForm.
maedhros
parents: 9229
diff changeset
   423
		case 1:
5f6249699caf (svn r12420) -Cleanup: Fix the indentation, improve a variable name, and add a NOT_REACHED to DeterminePluralForm.
maedhros
parents: 9229
diff changeset
   424
			return 0;
2082
52fa58482eeb (svn r2592) Feature: [strgen] New way to specify plural forms.
ludde
parents: 2075
diff changeset
   425
9231
5f6249699caf (svn r12420) -Cleanup: Fix the indentation, improve a variable name, and add a NOT_REACHED to DeterminePluralForm.
maedhros
parents: 9229
diff changeset
   426
		/* Two forms, singular used for zero and one
5f6249699caf (svn r12420) -Cleanup: Fix the indentation, improve a variable name, and add a NOT_REACHED to DeterminePluralForm.
maedhros
parents: 9229
diff changeset
   427
		 * Used in:
5f6249699caf (svn r12420) -Cleanup: Fix the indentation, improve a variable name, and add a NOT_REACHED to DeterminePluralForm.
maedhros
parents: 9229
diff changeset
   428
		 *   French, Brazilian Portuguese */
5f6249699caf (svn r12420) -Cleanup: Fix the indentation, improve a variable name, and add a NOT_REACHED to DeterminePluralForm.
maedhros
parents: 9229
diff changeset
   429
		case 2:
5f6249699caf (svn r12420) -Cleanup: Fix the indentation, improve a variable name, and add a NOT_REACHED to DeterminePluralForm.
maedhros
parents: 9229
diff changeset
   430
			return n > 1;
2082
52fa58482eeb (svn r2592) Feature: [strgen] New way to specify plural forms.
ludde
parents: 2075
diff changeset
   431
9231
5f6249699caf (svn r12420) -Cleanup: Fix the indentation, improve a variable name, and add a NOT_REACHED to DeterminePluralForm.
maedhros
parents: 9229
diff changeset
   432
		/* Three forms, special case for zero
5f6249699caf (svn r12420) -Cleanup: Fix the indentation, improve a variable name, and add a NOT_REACHED to DeterminePluralForm.
maedhros
parents: 9229
diff changeset
   433
		 * Used in:
5f6249699caf (svn r12420) -Cleanup: Fix the indentation, improve a variable name, and add a NOT_REACHED to DeterminePluralForm.
maedhros
parents: 9229
diff changeset
   434
		 *   Latvian */
5f6249699caf (svn r12420) -Cleanup: Fix the indentation, improve a variable name, and add a NOT_REACHED to DeterminePluralForm.
maedhros
parents: 9229
diff changeset
   435
		case 3:
5f6249699caf (svn r12420) -Cleanup: Fix the indentation, improve a variable name, and add a NOT_REACHED to DeterminePluralForm.
maedhros
parents: 9229
diff changeset
   436
			return n % 10 == 1 && n % 100 != 11 ? 0 : n != 0 ? 1 : 2;
9229
7fa9ce47e9c0 (svn r12417) -Fix: Add a new plural rule for Icelandic.
maedhros
parents: 8941
diff changeset
   437
9231
5f6249699caf (svn r12420) -Cleanup: Fix the indentation, improve a variable name, and add a NOT_REACHED to DeterminePluralForm.
maedhros
parents: 9229
diff changeset
   438
		/* Three forms, special case for one and two
5f6249699caf (svn r12420) -Cleanup: Fix the indentation, improve a variable name, and add a NOT_REACHED to DeterminePluralForm.
maedhros
parents: 9229
diff changeset
   439
		 * Used in:
5f6249699caf (svn r12420) -Cleanup: Fix the indentation, improve a variable name, and add a NOT_REACHED to DeterminePluralForm.
maedhros
parents: 9229
diff changeset
   440
		 *   Gaelige (Irish) */
5f6249699caf (svn r12420) -Cleanup: Fix the indentation, improve a variable name, and add a NOT_REACHED to DeterminePluralForm.
maedhros
parents: 9229
diff changeset
   441
		case 4:
5f6249699caf (svn r12420) -Cleanup: Fix the indentation, improve a variable name, and add a NOT_REACHED to DeterminePluralForm.
maedhros
parents: 9229
diff changeset
   442
			return n == 1 ? 0 : n == 2 ? 1 : 2;
5f6249699caf (svn r12420) -Cleanup: Fix the indentation, improve a variable name, and add a NOT_REACHED to DeterminePluralForm.
maedhros
parents: 9229
diff changeset
   443
5f6249699caf (svn r12420) -Cleanup: Fix the indentation, improve a variable name, and add a NOT_REACHED to DeterminePluralForm.
maedhros
parents: 9229
diff changeset
   444
		/* Three forms, special case for numbers ending in 1[2-9]
5f6249699caf (svn r12420) -Cleanup: Fix the indentation, improve a variable name, and add a NOT_REACHED to DeterminePluralForm.
maedhros
parents: 9229
diff changeset
   445
		 * Used in:
5f6249699caf (svn r12420) -Cleanup: Fix the indentation, improve a variable name, and add a NOT_REACHED to DeterminePluralForm.
maedhros
parents: 9229
diff changeset
   446
		 *   Lithuanian */
5f6249699caf (svn r12420) -Cleanup: Fix the indentation, improve a variable name, and add a NOT_REACHED to DeterminePluralForm.
maedhros
parents: 9229
diff changeset
   447
		case 5:
5f6249699caf (svn r12420) -Cleanup: Fix the indentation, improve a variable name, and add a NOT_REACHED to DeterminePluralForm.
maedhros
parents: 9229
diff changeset
   448
			return n % 10 == 1 && n % 100 != 11 ? 0 : n % 10 >= 2 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2;
5f6249699caf (svn r12420) -Cleanup: Fix the indentation, improve a variable name, and add a NOT_REACHED to DeterminePluralForm.
maedhros
parents: 9229
diff changeset
   449
5f6249699caf (svn r12420) -Cleanup: Fix the indentation, improve a variable name, and add a NOT_REACHED to DeterminePluralForm.
maedhros
parents: 9229
diff changeset
   450
		/* Three forms, special cases for numbers ending in 1 and 2, 3, 4, except those ending in 1[1-4]
5f6249699caf (svn r12420) -Cleanup: Fix the indentation, improve a variable name, and add a NOT_REACHED to DeterminePluralForm.
maedhros
parents: 9229
diff changeset
   451
		 * Used in:
5f6249699caf (svn r12420) -Cleanup: Fix the indentation, improve a variable name, and add a NOT_REACHED to DeterminePluralForm.
maedhros
parents: 9229
diff changeset
   452
		 *   Croatian, Czech, Russian, Slovak, Ukrainian */
5f6249699caf (svn r12420) -Cleanup: Fix the indentation, improve a variable name, and add a NOT_REACHED to DeterminePluralForm.
maedhros
parents: 9229
diff changeset
   453
		case 6:
5f6249699caf (svn r12420) -Cleanup: Fix the indentation, improve a variable name, and add a NOT_REACHED to DeterminePluralForm.
maedhros
parents: 9229
diff changeset
   454
			return n % 10 == 1 && n % 100 != 11 ? 0 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2;
5f6249699caf (svn r12420) -Cleanup: Fix the indentation, improve a variable name, and add a NOT_REACHED to DeterminePluralForm.
maedhros
parents: 9229
diff changeset
   455
5f6249699caf (svn r12420) -Cleanup: Fix the indentation, improve a variable name, and add a NOT_REACHED to DeterminePluralForm.
maedhros
parents: 9229
diff changeset
   456
		/* Three forms, special case for one and some numbers ending in 2, 3, or 4
5f6249699caf (svn r12420) -Cleanup: Fix the indentation, improve a variable name, and add a NOT_REACHED to DeterminePluralForm.
maedhros
parents: 9229
diff changeset
   457
		 * Used in:
5f6249699caf (svn r12420) -Cleanup: Fix the indentation, improve a variable name, and add a NOT_REACHED to DeterminePluralForm.
maedhros
parents: 9229
diff changeset
   458
		 *   Polish */
5f6249699caf (svn r12420) -Cleanup: Fix the indentation, improve a variable name, and add a NOT_REACHED to DeterminePluralForm.
maedhros
parents: 9229
diff changeset
   459
		case 7:
5f6249699caf (svn r12420) -Cleanup: Fix the indentation, improve a variable name, and add a NOT_REACHED to DeterminePluralForm.
maedhros
parents: 9229
diff changeset
   460
			return n == 1 ? 0 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2;
5f6249699caf (svn r12420) -Cleanup: Fix the indentation, improve a variable name, and add a NOT_REACHED to DeterminePluralForm.
maedhros
parents: 9229
diff changeset
   461
5f6249699caf (svn r12420) -Cleanup: Fix the indentation, improve a variable name, and add a NOT_REACHED to DeterminePluralForm.
maedhros
parents: 9229
diff changeset
   462
		/* Four forms, special case for one and all numbers ending in 02, 03, or 04
5f6249699caf (svn r12420) -Cleanup: Fix the indentation, improve a variable name, and add a NOT_REACHED to DeterminePluralForm.
maedhros
parents: 9229
diff changeset
   463
		 * Used in:
5f6249699caf (svn r12420) -Cleanup: Fix the indentation, improve a variable name, and add a NOT_REACHED to DeterminePluralForm.
maedhros
parents: 9229
diff changeset
   464
		 *   Slovenian */
5f6249699caf (svn r12420) -Cleanup: Fix the indentation, improve a variable name, and add a NOT_REACHED to DeterminePluralForm.
maedhros
parents: 9229
diff changeset
   465
		case 8:
5f6249699caf (svn r12420) -Cleanup: Fix the indentation, improve a variable name, and add a NOT_REACHED to DeterminePluralForm.
maedhros
parents: 9229
diff changeset
   466
			return n % 100 == 1 ? 0 : n % 100 == 2 ? 1 : n % 100 == 3 || n % 100 == 4 ? 2 : 3;
5f6249699caf (svn r12420) -Cleanup: Fix the indentation, improve a variable name, and add a NOT_REACHED to DeterminePluralForm.
maedhros
parents: 9229
diff changeset
   467
5f6249699caf (svn r12420) -Cleanup: Fix the indentation, improve a variable name, and add a NOT_REACHED to DeterminePluralForm.
maedhros
parents: 9229
diff changeset
   468
		/* Two forms; singular used for everything ending in 1 but not in 11.
5f6249699caf (svn r12420) -Cleanup: Fix the indentation, improve a variable name, and add a NOT_REACHED to DeterminePluralForm.
maedhros
parents: 9229
diff changeset
   469
		 * Used in:
5f6249699caf (svn r12420) -Cleanup: Fix the indentation, improve a variable name, and add a NOT_REACHED to DeterminePluralForm.
maedhros
parents: 9229
diff changeset
   470
		 *   Icelandic */
5f6249699caf (svn r12420) -Cleanup: Fix the indentation, improve a variable name, and add a NOT_REACHED to DeterminePluralForm.
maedhros
parents: 9229
diff changeset
   471
		case 9:
5f6249699caf (svn r12420) -Cleanup: Fix the indentation, improve a variable name, and add a NOT_REACHED to DeterminePluralForm.
maedhros
parents: 9229
diff changeset
   472
			return n % 10 == 1 && n % 100 != 11 ? 0 : 1;
2082
52fa58482eeb (svn r2592) Feature: [strgen] New way to specify plural forms.
ludde
parents: 2075
diff changeset
   473
	}
52fa58482eeb (svn r2592) Feature: [strgen] New way to specify plural forms.
ludde
parents: 2075
diff changeset
   474
}
52fa58482eeb (svn r2592) Feature: [strgen] New way to specify plural forms.
ludde
parents: 2075
diff changeset
   475
52fa58482eeb (svn r2592) Feature: [strgen] New way to specify plural forms.
ludde
parents: 2075
diff changeset
   476
static const char *ParseStringChoice(const char *b, uint form, char *dst, int *dstlen)
52fa58482eeb (svn r2592) Feature: [strgen] New way to specify plural forms.
ludde
parents: 2075
diff changeset
   477
{
52fa58482eeb (svn r2592) Feature: [strgen] New way to specify plural forms.
ludde
parents: 2075
diff changeset
   478
	//<NUM> {Length of each string} {each string}
52fa58482eeb (svn r2592) Feature: [strgen] New way to specify plural forms.
ludde
parents: 2075
diff changeset
   479
	uint n = (byte)*b++;
6987
b0f13039bda2 (svn r9672) -Cleanup: lots of coding style fixes around operands.
rubidium
parents: 6916
diff changeset
   480
	uint pos, i, mylen = 0, mypos = 0;
2952
6a26eeda9679 (svn r3511) More whitespace ([FS#46] by Rubidium)
tron
parents: 2951
diff changeset
   481
6a26eeda9679 (svn r3511) More whitespace ([FS#46] by Rubidium)
tron
parents: 2951
diff changeset
   482
	for (i = pos = 0; i != n; i++) {
2082
52fa58482eeb (svn r2592) Feature: [strgen] New way to specify plural forms.
ludde
parents: 2075
diff changeset
   483
		uint len = (byte)*b++;
52fa58482eeb (svn r2592) Feature: [strgen] New way to specify plural forms.
ludde
parents: 2075
diff changeset
   484
		if (i == form) {
52fa58482eeb (svn r2592) Feature: [strgen] New way to specify plural forms.
ludde
parents: 2075
diff changeset
   485
			mypos = pos;
52fa58482eeb (svn r2592) Feature: [strgen] New way to specify plural forms.
ludde
parents: 2075
diff changeset
   486
			mylen = len;
52fa58482eeb (svn r2592) Feature: [strgen] New way to specify plural forms.
ludde
parents: 2075
diff changeset
   487
		}
52fa58482eeb (svn r2592) Feature: [strgen] New way to specify plural forms.
ludde
parents: 2075
diff changeset
   488
		pos += len;
52fa58482eeb (svn r2592) Feature: [strgen] New way to specify plural forms.
ludde
parents: 2075
diff changeset
   489
	}
52fa58482eeb (svn r2592) Feature: [strgen] New way to specify plural forms.
ludde
parents: 2075
diff changeset
   490
	*dstlen = mylen;
52fa58482eeb (svn r2592) Feature: [strgen] New way to specify plural forms.
ludde
parents: 2075
diff changeset
   491
	memcpy(dst, b + mypos, mylen);
52fa58482eeb (svn r2592) Feature: [strgen] New way to specify plural forms.
ludde
parents: 2075
diff changeset
   492
	return b + pos;
52fa58482eeb (svn r2592) Feature: [strgen] New way to specify plural forms.
ludde
parents: 2075
diff changeset
   493
}
52fa58482eeb (svn r2592) Feature: [strgen] New way to specify plural forms.
ludde
parents: 2075
diff changeset
   494
6574
e1d1a12faaf7 (svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents: 6573
diff changeset
   495
struct Units {
3342
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   496
	int s_m;           ///< Multiplier for velocity
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   497
	int s_s;           ///< Shift for velocity
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   498
	StringID velocity; ///< String for velocity
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   499
	int p_m;           ///< Multiplier for power
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   500
	int p_s;           ///< Shift for power
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   501
	StringID power;    ///< String for velocity
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   502
	int w_m;           ///< Multiplier for weight
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   503
	int w_s;           ///< Shift for weight
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   504
	StringID s_weight; ///< Short string for weight
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   505
	StringID l_weight; ///< Long string for weight
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   506
	int v_m;           ///< Multiplier for volume
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   507
	int v_s;           ///< Shift for volume
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   508
	StringID s_volume; ///< Short string for volume
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   509
	StringID l_volume; ///< Long string for volume
3489
1a4ffb2bc0f4 (svn r4340) Add force {FORCE} to the units system. This is currently unused.
peter1138
parents: 3485
diff changeset
   510
	int f_m;           ///< Multiplier for force
1a4ffb2bc0f4 (svn r4340) Add force {FORCE} to the units system. This is currently unused.
peter1138
parents: 3485
diff changeset
   511
	int f_s;           ///< Shift for force
1a4ffb2bc0f4 (svn r4340) Add force {FORCE} to the units system. This is currently unused.
peter1138
parents: 3485
diff changeset
   512
	StringID force;    ///< String for force
6574
e1d1a12faaf7 (svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents: 6573
diff changeset
   513
};
3342
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   514
3489
1a4ffb2bc0f4 (svn r4340) Add force {FORCE} to the units system. This is currently unused.
peter1138
parents: 3485
diff changeset
   515
/* Unit conversions */
3342
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   516
static const Units units[] = {
5653
5d95f08eb4b9 (svn r7596) -Codechange: Always display tractive effort in kN.
peter1138
parents: 5296
diff changeset
   517
	{ // Imperial (Original, mph, hp, metric ton, litre, kN)
6125
492a1c0440af (svn r8464) -Revert (r4322): Change back to converting to mph in the GUI code, as 1 mph == 1.6 km/h is too far out for some people.
peter1138
parents: 6065
diff changeset
   518
		   1,  0, STR_UNITS_VELOCITY_IMPERIAL,
3342
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   519
		   1,  0, STR_UNITS_POWER_IMPERIAL,
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   520
		   1,  0, STR_UNITS_WEIGHT_SHORT_METRIC, STR_UNITS_WEIGHT_LONG_METRIC,
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   521
		1000,  0, STR_UNITS_VOLUME_SHORT_METRIC, STR_UNITS_VOLUME_LONG_METRIC,
5653
5d95f08eb4b9 (svn r7596) -Codechange: Always display tractive effort in kN.
peter1138
parents: 5296
diff changeset
   522
		   1,  0, STR_UNITS_FORCE_SI,
3342
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   523
	},
5653
5d95f08eb4b9 (svn r7596) -Codechange: Always display tractive effort in kN.
peter1138
parents: 5296
diff changeset
   524
	{ // Metric (km/h, hp, metric ton, litre, kN)
6125
492a1c0440af (svn r8464) -Revert (r4322): Change back to converting to mph in the GUI code, as 1 mph == 1.6 km/h is too far out for some people.
peter1138
parents: 6065
diff changeset
   525
		 103,  6, STR_UNITS_VELOCITY_METRIC,
3342
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   526
		   1,  0, STR_UNITS_POWER_METRIC,
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   527
		   1,  0, STR_UNITS_WEIGHT_SHORT_METRIC, STR_UNITS_WEIGHT_LONG_METRIC,
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   528
		1000,  0, STR_UNITS_VOLUME_SHORT_METRIC, STR_UNITS_VOLUME_LONG_METRIC,
5653
5d95f08eb4b9 (svn r7596) -Codechange: Always display tractive effort in kN.
peter1138
parents: 5296
diff changeset
   529
		   1,  0, STR_UNITS_FORCE_SI,
3342
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   530
	},
3489
1a4ffb2bc0f4 (svn r4340) Add force {FORCE} to the units system. This is currently unused.
peter1138
parents: 3485
diff changeset
   531
	{ // SI (m/s, kilowatt, kilogram, cubic metres, kilonewton)
6125
492a1c0440af (svn r8464) -Revert (r4322): Change back to converting to mph in the GUI code, as 1 mph == 1.6 km/h is too far out for some people.
peter1138
parents: 6065
diff changeset
   532
		1831, 12, STR_UNITS_VELOCITY_SI,
3342
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   533
		 764, 10, STR_UNITS_POWER_SI,
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   534
		1000,  0, STR_UNITS_WEIGHT_SHORT_SI, STR_UNITS_WEIGHT_LONG_SI,
3485
a67571100234 (svn r4336) Fix units conversion of volume for SI
peter1138
parents: 3477
diff changeset
   535
		   1,  0, STR_UNITS_VOLUME_SHORT_SI, STR_UNITS_VOLUME_LONG_SI,
3489
1a4ffb2bc0f4 (svn r4340) Add force {FORCE} to the units system. This is currently unused.
peter1138
parents: 3485
diff changeset
   536
		   1,  0, STR_UNITS_FORCE_SI,
3342
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   537
	},
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   538
};
2082
52fa58482eeb (svn r2592) Feature: [strgen] New way to specify plural forms.
ludde
parents: 2075
diff changeset
   539
10134
9a2cfea36caf (svn r12665) -Codechange: make the internal speed <-> display speed conversions available to a bigger part of the code.
rubidium
parents: 9286
diff changeset
   540
/**
9a2cfea36caf (svn r12665) -Codechange: make the internal speed <-> display speed conversions available to a bigger part of the code.
rubidium
parents: 9286
diff changeset
   541
 * Convert the given (internal) speed to the display speed.
9a2cfea36caf (svn r12665) -Codechange: make the internal speed <-> display speed conversions available to a bigger part of the code.
rubidium
parents: 9286
diff changeset
   542
 * @param speed the speed to convert
9a2cfea36caf (svn r12665) -Codechange: make the internal speed <-> display speed conversions available to a bigger part of the code.
rubidium
parents: 9286
diff changeset
   543
 * @return the converted speed.
9a2cfea36caf (svn r12665) -Codechange: make the internal speed <-> display speed conversions available to a bigger part of the code.
rubidium
parents: 9286
diff changeset
   544
 */
9a2cfea36caf (svn r12665) -Codechange: make the internal speed <-> display speed conversions available to a bigger part of the code.
rubidium
parents: 9286
diff changeset
   545
uint ConvertSpeedToDisplaySpeed(uint speed)
9a2cfea36caf (svn r12665) -Codechange: make the internal speed <-> display speed conversions available to a bigger part of the code.
rubidium
parents: 9286
diff changeset
   546
{
9a2cfea36caf (svn r12665) -Codechange: make the internal speed <-> display speed conversions available to a bigger part of the code.
rubidium
parents: 9286
diff changeset
   547
 return (speed * units[_opt_ptr->units].s_m) >> units[_opt_ptr->units].s_s;
9a2cfea36caf (svn r12665) -Codechange: make the internal speed <-> display speed conversions available to a bigger part of the code.
rubidium
parents: 9286
diff changeset
   548
}
9a2cfea36caf (svn r12665) -Codechange: make the internal speed <-> display speed conversions available to a bigger part of the code.
rubidium
parents: 9286
diff changeset
   549
9a2cfea36caf (svn r12665) -Codechange: make the internal speed <-> display speed conversions available to a bigger part of the code.
rubidium
parents: 9286
diff changeset
   550
/**
9a2cfea36caf (svn r12665) -Codechange: make the internal speed <-> display speed conversions available to a bigger part of the code.
rubidium
parents: 9286
diff changeset
   551
 * Convert the given display speed to the (internal) speed.
9a2cfea36caf (svn r12665) -Codechange: make the internal speed <-> display speed conversions available to a bigger part of the code.
rubidium
parents: 9286
diff changeset
   552
 * @param speed the speed to convert
9a2cfea36caf (svn r12665) -Codechange: make the internal speed <-> display speed conversions available to a bigger part of the code.
rubidium
parents: 9286
diff changeset
   553
 * @return the converted speed.
9a2cfea36caf (svn r12665) -Codechange: make the internal speed <-> display speed conversions available to a bigger part of the code.
rubidium
parents: 9286
diff changeset
   554
 */
9a2cfea36caf (svn r12665) -Codechange: make the internal speed <-> display speed conversions available to a bigger part of the code.
rubidium
parents: 9286
diff changeset
   555
uint ConvertDisplaySpeedToSpeed(uint speed)
9a2cfea36caf (svn r12665) -Codechange: make the internal speed <-> display speed conversions available to a bigger part of the code.
rubidium
parents: 9286
diff changeset
   556
{
9a2cfea36caf (svn r12665) -Codechange: make the internal speed <-> display speed conversions available to a bigger part of the code.
rubidium
parents: 9286
diff changeset
   557
	return ((speed << units[_opt_ptr->units].s_s) + units[_opt_ptr->units].s_m / 2) / units[_opt_ptr->units].s_m;
9a2cfea36caf (svn r12665) -Codechange: make the internal speed <-> display speed conversions available to a bigger part of the code.
rubidium
parents: 9286
diff changeset
   558
}
9a2cfea36caf (svn r12665) -Codechange: make the internal speed <-> display speed conversions available to a bigger part of the code.
rubidium
parents: 9286
diff changeset
   559
7498
ce6588257e8d (svn r10258) -Codechange: as we are now using int64 all over the place, it's better to use int64 variables in the string generating too instead of packing them into two int32s.
rubidium
parents: 7492
diff changeset
   560
static char* FormatString(char* buff, const char* str, const int64* argv, uint casei, const char* last)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   561
{
4840
176bc2a66322 (svn r6766) -Codechange: Move _openttd_revision[] into the functions that use it instead of global
Darkvater
parents: 4710
diff changeset
   562
	extern const char _openttd_revision[];
5108
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   563
	WChar b;
7498
ce6588257e8d (svn r10258) -Codechange: as we are now using int64 all over the place, it's better to use int64 variables in the string generating too instead of packing them into two int32s.
rubidium
parents: 7492
diff changeset
   564
	const int64 *argv_orig = argv;
2087
bedb167de57b (svn r2597) Feature: [string system] Support cases.
ludde
parents: 2084
diff changeset
   565
	uint modifier = 0;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   566
5108
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   567
	while ((b = Utf8Consume(&str)) != '\0') {
8112
f432a920f3b7 (svn r11145) -Codechange: add support for "decoding" TTDPs string codes wrt to registers 0x100 to 0x10F.
rubidium
parents: 7931
diff changeset
   568
		if (SCC_NEWGRF_FIRST <= b && b <= SCC_NEWGRF_LAST) {
f432a920f3b7 (svn r11145) -Codechange: add support for "decoding" TTDPs string codes wrt to registers 0x100 to 0x10F.
rubidium
parents: 7931
diff changeset
   569
			/* We need to pass some stuff as it might be modified; oh boy. */
f432a920f3b7 (svn r11145) -Codechange: add support for "decoding" TTDPs string codes wrt to registers 0x100 to 0x10F.
rubidium
parents: 7931
diff changeset
   570
			b = RemapNewGRFStringControlCode(b, &buff, &str, (int64*)argv);
f432a920f3b7 (svn r11145) -Codechange: add support for "decoding" TTDPs string codes wrt to registers 0x100 to 0x10F.
rubidium
parents: 7931
diff changeset
   571
			if (b == 0) continue;
f432a920f3b7 (svn r11145) -Codechange: add support for "decoding" TTDPs string codes wrt to registers 0x100 to 0x10F.
rubidium
parents: 7931
diff changeset
   572
		}
f432a920f3b7 (svn r11145) -Codechange: add support for "decoding" TTDPs string codes wrt to registers 0x100 to 0x10F.
rubidium
parents: 7931
diff changeset
   573
1316
a7352de83a2b (svn r1820) Style cleanup:
tron
parents: 1312
diff changeset
   574
		switch (b) {
5108
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   575
			case SCC_SETX: // {SETX}
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   576
				if (buff + Utf8CharLen(SCC_SETX) + 1 < last) {
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   577
					buff += Utf8Encode(buff, SCC_SETX);
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   578
					*buff++ = *str++;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   579
				}
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   580
				break;
2410
d1fae093e768 (svn r2936) Move string commands to a non-printable range and remove stale comments
tron
parents: 2353
diff changeset
   581
5108
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   582
			case SCC_SETXY: // {SETXY}
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   583
				if (buff + Utf8CharLen(SCC_SETXY) + 2 < last) {
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   584
					buff += Utf8Encode(buff, SCC_SETXY);
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   585
					*buff++ = *str++;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   586
					*buff++ = *str++;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   587
				}
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   588
				break;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   589
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   590
			case SCC_STRING_ID: // {STRINL}
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   591
				buff = GetStringWithArgs(buff, Utf8Consume(&str), argv, last);
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   592
				break;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   593
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   594
			case SCC_DATE_LONG: // {DATE_LONG}
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   595
				buff = FormatYmdString(buff, GetInt32(&argv), last);
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   596
				break;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   597
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   598
			case SCC_DATE_SHORT: // {DATE_SHORT}
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   599
				buff = FormatMonthAndYear(buff, GetInt32(&argv), last);
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   600
				break;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   601
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   602
			case SCC_VELOCITY: {// {VELOCITY}
7498
ce6588257e8d (svn r10258) -Codechange: as we are now using int64 all over the place, it's better to use int64 variables in the string generating too instead of packing them into two int32s.
rubidium
parents: 7492
diff changeset
   603
				int64 args[1];
5108
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   604
				assert(_opt_ptr->units < lengthof(units));
10134
9a2cfea36caf (svn r12665) -Codechange: make the internal speed <-> display speed conversions available to a bigger part of the code.
rubidium
parents: 9286
diff changeset
   605
				args[0] = ConvertSpeedToDisplaySpeed(GetInt32(&argv));
5108
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   606
				buff = FormatString(buff, GetStringPtr(units[_opt_ptr->units].velocity), args, modifier >> 24, last);
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   607
				modifier = 0;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   608
				break;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   609
			}
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   610
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   611
			case SCC_CURRENCY_COMPACT: /* {CURRCOMPACT} */
7490
3550f7e59b2e (svn r10250) -Fix: money is always 64 bits, so always parse those 64 bits.
rubidium
parents: 7452
diff changeset
   612
				buff = FormatGenericCurrency(buff, _currency, GetInt64(&argv), true, last);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   613
				break;
5108
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   614
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   615
			case SCC_REVISION: /* {REV} */
4912
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
   616
				buff = strecpy(buff, _openttd_revision, last);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   617
				break;
5108
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   618
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   619
			case SCC_CARGO_SHORT: { /* {SHORTCARGO} */
6916
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6685
diff changeset
   620
				/* Short description of cargotypes. Layout:
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6685
diff changeset
   621
				 * 8-bit = cargo type
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6685
diff changeset
   622
				 * 16-bit = cargo count */
6417
26acff62d001 (svn r8826) -Codechange: Replace _cargoc's separate arrays with a regular struct array (with accessor) and implement new initialization method using cargo labels.
peter1138
parents: 6414
diff changeset
   623
				StringID cargo_str = GetCargo(GetInt32(&argv))->units_volume;
3342
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   624
				switch (cargo_str) {
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   625
					case STR_TONS: {
7498
ce6588257e8d (svn r10258) -Codechange: as we are now using int64 all over the place, it's better to use int64 variables in the string generating too instead of packing them into two int32s.
rubidium
parents: 7492
diff changeset
   626
						int64 args[1];
3342
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   627
						assert(_opt_ptr->units < lengthof(units));
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   628
						args[0] = GetInt32(&argv) * units[_opt_ptr->units].w_m >> units[_opt_ptr->units].w_s;
4912
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
   629
						buff = FormatString(buff, GetStringPtr(units[_opt_ptr->units].l_weight), args, modifier >> 24, last);
3342
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   630
						modifier = 0;
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   631
						break;
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   632
					}
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   633
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   634
					case STR_LITERS: {
7498
ce6588257e8d (svn r10258) -Codechange: as we are now using int64 all over the place, it's better to use int64 variables in the string generating too instead of packing them into two int32s.
rubidium
parents: 7492
diff changeset
   635
						int64 args[1];
3342
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   636
						assert(_opt_ptr->units < lengthof(units));
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   637
						args[0] = GetInt32(&argv) * units[_opt_ptr->units].v_m >> units[_opt_ptr->units].v_s;
4912
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
   638
						buff = FormatString(buff, GetStringPtr(units[_opt_ptr->units].l_volume), args, modifier >> 24, last);
3342
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   639
						modifier = 0;
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   640
						break;
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   641
					}
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   642
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   643
					default:
6685
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
   644
						if (cargo_str >= 0xE000 && cargo_str < 0xF800) {
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
   645
							/* NewGRF strings from Action 4 use a different format here,
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
   646
							 * of e.g. "x tonnes of coal", so process accordingly. */
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
   647
							buff = GetStringWithArgs(buff, cargo_str, argv++, last);
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
   648
						} else {
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
   649
							buff = FormatCommaNumber(buff, GetInt32(&argv), last);
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
   650
							buff = strecpy(buff, " ", last);
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
   651
							buff = strecpy(buff, GetStringPtr(cargo_str), last);
410bba0abb67 (svn r9411) -Codechange: Add support for loading of newcargo data.
peter1138
parents: 6683
diff changeset
   652
						}
3342
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   653
						break;
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   654
				}
1316
a7352de83a2b (svn r1820) Style cleanup:
tron
parents: 1312
diff changeset
   655
			} break;
5108
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   656
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   657
			case SCC_STRING1: { /* {STRING1} */
6916
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6685
diff changeset
   658
				/* String that consumes ONE argument */
2087
bedb167de57b (svn r2597) Feature: [string system] Support cases.
ludde
parents: 2084
diff changeset
   659
				uint str = modifier + GetInt32(&argv);
4912
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
   660
				buff = GetStringWithArgs(buff, str, GetArgvPtr(&argv, 1), last);
2087
bedb167de57b (svn r2597) Feature: [string system] Support cases.
ludde
parents: 2084
diff changeset
   661
				modifier = 0;
2063
95259a31ceb5 (svn r2572) - Codechange: [string] Changed string system so it's not as dependent on decode_parameters
ludde
parents: 2057
diff changeset
   662
				break;
95259a31ceb5 (svn r2572) - Codechange: [string] Changed string system so it's not as dependent on decode_parameters
ludde
parents: 2057
diff changeset
   663
			}
5108
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   664
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   665
			case SCC_STRING2: { /* {STRING2} */
6916
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6685
diff changeset
   666
				/* String that consumes TWO arguments */
2087
bedb167de57b (svn r2597) Feature: [string system] Support cases.
ludde
parents: 2084
diff changeset
   667
				uint str = modifier + GetInt32(&argv);
4912
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
   668
				buff = GetStringWithArgs(buff, str, GetArgvPtr(&argv, 2), last);
2087
bedb167de57b (svn r2597) Feature: [string system] Support cases.
ludde
parents: 2084
diff changeset
   669
				modifier = 0;
2063
95259a31ceb5 (svn r2572) - Codechange: [string] Changed string system so it's not as dependent on decode_parameters
ludde
parents: 2057
diff changeset
   670
				break;
95259a31ceb5 (svn r2572) - Codechange: [string] Changed string system so it's not as dependent on decode_parameters
ludde
parents: 2057
diff changeset
   671
			}
5108
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   672
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   673
			case SCC_STRING3: { /* {STRING3} */
6916
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6685
diff changeset
   674
				/* String that consumes THREE arguments */
2087
bedb167de57b (svn r2597) Feature: [string system] Support cases.
ludde
parents: 2084
diff changeset
   675
				uint str = modifier + GetInt32(&argv);
4912
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
   676
				buff = GetStringWithArgs(buff, str, GetArgvPtr(&argv, 3), last);
2087
bedb167de57b (svn r2597) Feature: [string system] Support cases.
ludde
parents: 2084
diff changeset
   677
				modifier = 0;
2063
95259a31ceb5 (svn r2572) - Codechange: [string] Changed string system so it's not as dependent on decode_parameters
ludde
parents: 2057
diff changeset
   678
				break;
95259a31ceb5 (svn r2572) - Codechange: [string] Changed string system so it's not as dependent on decode_parameters
ludde
parents: 2057
diff changeset
   679
			}
5108
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   680
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   681
			case SCC_STRING4: { /* {STRING4} */
6916
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6685
diff changeset
   682
				/* String that consumes FOUR arguments */
2087
bedb167de57b (svn r2597) Feature: [string system] Support cases.
ludde
parents: 2084
diff changeset
   683
				uint str = modifier + GetInt32(&argv);
4912
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
   684
				buff = GetStringWithArgs(buff, str, GetArgvPtr(&argv, 4), last);
2087
bedb167de57b (svn r2597) Feature: [string system] Support cases.
ludde
parents: 2084
diff changeset
   685
				modifier = 0;
2063
95259a31ceb5 (svn r2572) - Codechange: [string] Changed string system so it's not as dependent on decode_parameters
ludde
parents: 2057
diff changeset
   686
				break;
95259a31ceb5 (svn r2572) - Codechange: [string] Changed string system so it's not as dependent on decode_parameters
ludde
parents: 2057
diff changeset
   687
			}
5108
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   688
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   689
			case SCC_STRING5: { /* {STRING5} */
6916
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6685
diff changeset
   690
				/* String that consumes FIVE arguments */
2087
bedb167de57b (svn r2597) Feature: [string system] Support cases.
ludde
parents: 2084
diff changeset
   691
				uint str = modifier + GetInt32(&argv);
4912
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
   692
				buff = GetStringWithArgs(buff, str, GetArgvPtr(&argv, 5), last);
2087
bedb167de57b (svn r2597) Feature: [string system] Support cases.
ludde
parents: 2084
diff changeset
   693
				modifier = 0;
2063
95259a31ceb5 (svn r2572) - Codechange: [string] Changed string system so it's not as dependent on decode_parameters
ludde
parents: 2057
diff changeset
   694
				break;
95259a31ceb5 (svn r2572) - Codechange: [string] Changed string system so it's not as dependent on decode_parameters
ludde
parents: 2057
diff changeset
   695
			}
95259a31ceb5 (svn r2572) - Codechange: [string] Changed string system so it's not as dependent on decode_parameters
ludde
parents: 2057
diff changeset
   696
5108
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   697
			case SCC_STATION_FEATURES: { /* {STATIONFEATURES} */
4912
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
   698
				buff = StationGetSpecialString(buff, GetInt32(&argv), last);
2063
95259a31ceb5 (svn r2572) - Codechange: [string] Changed string system so it's not as dependent on decode_parameters
ludde
parents: 2057
diff changeset
   699
				break;
95259a31ceb5 (svn r2572) - Codechange: [string] Changed string system so it's not as dependent on decode_parameters
ludde
parents: 2057
diff changeset
   700
			}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   701
5108
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   702
			case SCC_INDUSTRY_NAME: { /* {INDUSTRY} */
3033
e4f7c60a1742 (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 2966
diff changeset
   703
				const Industry* i = GetIndustry(GetInt32(&argv));
7498
ce6588257e8d (svn r10258) -Codechange: as we are now using int64 all over the place, it's better to use int64 variables in the string generating too instead of packing them into two int32s.
rubidium
parents: 7492
diff changeset
   704
				int64 args[2];
2070
26c657906f25 (svn r2580) Change: Added {INDUSTRY} command for printing industry names instead of the old {TOWN} {STRING} way.
ludde
parents: 2063
diff changeset
   705
6916
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6685
diff changeset
   706
				/* industry not valid anymore? */
7886
b02aa3532d1d (svn r10759) -Codechange: make the industry struct use the pool item class as super class.
rubidium
parents: 7882
diff changeset
   707
				if (!i->IsValid()) break;
2070
26c657906f25 (svn r2580) Change: Added {INDUSTRY} command for printing industry names instead of the old {TOWN} {STRING} way.
ludde
parents: 2063
diff changeset
   708
6916
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6685
diff changeset
   709
				/* First print the town name and the industry type name
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6685
diff changeset
   710
				 * The string STR_INDUSTRY_PATTERN controls the formatting */
2070
26c657906f25 (svn r2580) Change: Added {INDUSTRY} command for printing industry names instead of the old {TOWN} {STRING} way.
ludde
parents: 2063
diff changeset
   711
				args[0] = i->town->index;
4942
f990abfa4438 (svn r6930) -Codechange: Move industry name into IndustrySpec
belugas
parents: 4920
diff changeset
   712
				args[1] = GetIndustrySpec(i->type)->name;
4912
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
   713
				buff = FormatString(buff, GetStringPtr(STR_INDUSTRY_FORMAT), args, modifier >> 24, last);
2087
bedb167de57b (svn r2597) Feature: [string system] Support cases.
ludde
parents: 2084
diff changeset
   714
				modifier = 0;
2070
26c657906f25 (svn r2580) Change: Added {INDUSTRY} command for printing industry names instead of the old {TOWN} {STRING} way.
ludde
parents: 2063
diff changeset
   715
				break;
26c657906f25 (svn r2580) Change: Added {INDUSTRY} command for printing industry names instead of the old {TOWN} {STRING} way.
ludde
parents: 2063
diff changeset
   716
			}
26c657906f25 (svn r2580) Change: Added {INDUSTRY} command for printing industry names instead of the old {TOWN} {STRING} way.
ludde
parents: 2063
diff changeset
   717
5108
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   718
			case SCC_VOLUME: { // {VOLUME}
7498
ce6588257e8d (svn r10258) -Codechange: as we are now using int64 all over the place, it's better to use int64 variables in the string generating too instead of packing them into two int32s.
rubidium
parents: 7492
diff changeset
   719
				int64 args[1];
3342
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   720
				assert(_opt_ptr->units < lengthof(units));
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   721
				args[0] = GetInt32(&argv) * units[_opt_ptr->units].v_m >> units[_opt_ptr->units].v_s;
4912
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
   722
				buff = FormatString(buff, GetStringPtr(units[_opt_ptr->units].l_volume), args, modifier >> 24, last);
2087
bedb167de57b (svn r2597) Feature: [string system] Support cases.
ludde
parents: 2084
diff changeset
   723
				modifier = 0;
2084
d67790a49f78 (svn r2594) Fix: [strgen] Misc updates to the string system.
ludde
parents: 2082
diff changeset
   724
				break;
d67790a49f78 (svn r2594) Fix: [strgen] Misc updates to the string system.
ludde
parents: 2082
diff changeset
   725
			}
d67790a49f78 (svn r2594) Fix: [strgen] Misc updates to the string system.
ludde
parents: 2082
diff changeset
   726
5108
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   727
			case SCC_GENDER_LIST: { // {G 0 Der Die Das}
8941
f93c669d3ca6 (svn r12015) -Fix [FS#1716] (Revert r11422): Patch in FS#1430 avoided instead of fixed the problem. GetStringWithArgs() discards information that SCC_GENDER_LIST needs to work. Now use pointers to retrieve GRF strings, so that GetStringPtr() will work correctly. This is advantageous as now no buffer copy is made when using all GRF strings.
peter1138
parents: 8819
diff changeset
   728
				const char *s = GetStringPtr(argv_orig[(byte)*str++]); // contains the string that determines gender.
2084
d67790a49f78 (svn r2594) Fix: [strgen] Misc updates to the string system.
ludde
parents: 2082
diff changeset
   729
				int len;
d67790a49f78 (svn r2594) Fix: [strgen] Misc updates to the string system.
ludde
parents: 2082
diff changeset
   730
				int gender = 0;
7907
5e026fa6089a (svn r10792) -Fix [FS#1104]: when determining the gender of a string, do not assume that the gender is in the front of the string when there can be case switching code at that location.
rubidium
parents: 7889
diff changeset
   731
				if (s != NULL) {
5e026fa6089a (svn r10792) -Fix [FS#1104]: when determining the gender of a string, do not assume that the gender is in the front of the string when there can be case switching code at that location.
rubidium
parents: 7889
diff changeset
   732
					wchar_t c = Utf8Consume(&s);
5e026fa6089a (svn r10792) -Fix [FS#1104]: when determining the gender of a string, do not assume that the gender is in the front of the string when there can be case switching code at that location.
rubidium
parents: 7889
diff changeset
   733
					/* Switch case is always put before genders, so remove those bits */
5e026fa6089a (svn r10792) -Fix [FS#1104]: when determining the gender of a string, do not assume that the gender is in the front of the string when there can be case switching code at that location.
rubidium
parents: 7889
diff changeset
   734
					if (c == SCC_SWITCH_CASE) {
5e026fa6089a (svn r10792) -Fix [FS#1104]: when determining the gender of a string, do not assume that the gender is in the front of the string when there can be case switching code at that location.
rubidium
parents: 7889
diff changeset
   735
						/* Skip to the last (i.e. default) case */
5e026fa6089a (svn r10792) -Fix [FS#1104]: when determining the gender of a string, do not assume that the gender is in the front of the string when there can be case switching code at that location.
rubidium
parents: 7889
diff changeset
   736
						for (uint num = (byte)*s++; num != 0; num--) s += 3 + (s[1] << 8) + s[2];
5e026fa6089a (svn r10792) -Fix [FS#1104]: when determining the gender of a string, do not assume that the gender is in the front of the string when there can be case switching code at that location.
rubidium
parents: 7889
diff changeset
   737
5e026fa6089a (svn r10792) -Fix [FS#1104]: when determining the gender of a string, do not assume that the gender is in the front of the string when there can be case switching code at that location.
rubidium
parents: 7889
diff changeset
   738
						c = Utf8Consume(&s);
5e026fa6089a (svn r10792) -Fix [FS#1104]: when determining the gender of a string, do not assume that the gender is in the front of the string when there can be case switching code at that location.
rubidium
parents: 7889
diff changeset
   739
					}
5e026fa6089a (svn r10792) -Fix [FS#1104]: when determining the gender of a string, do not assume that the gender is in the front of the string when there can be case switching code at that location.
rubidium
parents: 7889
diff changeset
   740
					/* Does this string have a gender, if so, set it */
5e026fa6089a (svn r10792) -Fix [FS#1104]: when determining the gender of a string, do not assume that the gender is in the front of the string when there can be case switching code at that location.
rubidium
parents: 7889
diff changeset
   741
					if (c == SCC_GENDER_INDEX) gender = (byte)s[0];
5e026fa6089a (svn r10792) -Fix [FS#1104]: when determining the gender of a string, do not assume that the gender is in the front of the string when there can be case switching code at that location.
rubidium
parents: 7889
diff changeset
   742
				}
2084
d67790a49f78 (svn r2594) Fix: [strgen] Misc updates to the string system.
ludde
parents: 2082
diff changeset
   743
				str = ParseStringChoice(str, gender, buff, &len);
d67790a49f78 (svn r2594) Fix: [strgen] Misc updates to the string system.
ludde
parents: 2082
diff changeset
   744
				buff += len;
d67790a49f78 (svn r2594) Fix: [strgen] Misc updates to the string system.
ludde
parents: 2082
diff changeset
   745
				break;
d67790a49f78 (svn r2594) Fix: [strgen] Misc updates to the string system.
ludde
parents: 2082
diff changeset
   746
			}
d67790a49f78 (svn r2594) Fix: [strgen] Misc updates to the string system.
ludde
parents: 2082
diff changeset
   747
5108
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   748
			case SCC_DATE_TINY: { // {DATE_TINY}
4912
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
   749
				buff = FormatTinyDate(buff, GetInt32(&argv), last);
2087
bedb167de57b (svn r2597) Feature: [string system] Support cases.
ludde
parents: 2084
diff changeset
   750
				break;
bedb167de57b (svn r2597) Feature: [string system] Support cases.
ludde
parents: 2084
diff changeset
   751
			}
bedb167de57b (svn r2597) Feature: [string system] Support cases.
ludde
parents: 2084
diff changeset
   752
5108
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   753
			case SCC_CARGO: { // {CARGO}
6916
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6685
diff changeset
   754
				/* Layout now is:
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6685
diff changeset
   755
				 *   8bit   - cargo type
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6685
diff changeset
   756
				 *   16-bit - cargo count */
4898
68560c75ec28 (svn r6858) - Fix (r6855): Handle rail vehicles with no capacity (N/A) by setting cargo type to CT_INVALID and handling it later. STR_8838_N_A is not a valid cargo type...
peter1138
parents: 4840
diff changeset
   757
				CargoID cargo = GetInt32(&argv);
7889
f167f5959c24 (svn r10762) -Codechange: Change enum StringIDEnum { to static const StringID = for
peter1138
parents: 7886
diff changeset
   758
				StringID cargo_str = (cargo == CT_INVALID) ? STR_8838_N_A : GetCargo(cargo)->quantifier;
4912
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
   759
				buff = GetStringWithArgs(buff, cargo_str, argv++, last);
2087
bedb167de57b (svn r2597) Feature: [string system] Support cases.
ludde
parents: 2084
diff changeset
   760
				break;
bedb167de57b (svn r2597) Feature: [string system] Support cases.
ludde
parents: 2084
diff changeset
   761
			}
bedb167de57b (svn r2597) Feature: [string system] Support cases.
ludde
parents: 2084
diff changeset
   762
5108
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   763
			case SCC_POWER: { // {POWER}
7498
ce6588257e8d (svn r10258) -Codechange: as we are now using int64 all over the place, it's better to use int64 variables in the string generating too instead of packing them into two int32s.
rubidium
parents: 7492
diff changeset
   764
				int64 args[1];
3342
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   765
				assert(_opt_ptr->units < lengthof(units));
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   766
				args[0] = GetInt32(&argv) * units[_opt_ptr->units].p_m >> units[_opt_ptr->units].p_s;
4912
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
   767
				buff = FormatString(buff, GetStringPtr(units[_opt_ptr->units].power), args, modifier >> 24, last);
3342
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   768
				modifier = 0;
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   769
				break;
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   770
			}
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   771
5108
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   772
			case SCC_VOLUME_SHORT: { // {VOLUME_S}
7498
ce6588257e8d (svn r10258) -Codechange: as we are now using int64 all over the place, it's better to use int64 variables in the string generating too instead of packing them into two int32s.
rubidium
parents: 7492
diff changeset
   773
				int64 args[1];
3342
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   774
				assert(_opt_ptr->units < lengthof(units));
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   775
				args[0] = GetInt32(&argv) * units[_opt_ptr->units].v_m >> units[_opt_ptr->units].v_s;
4912
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
   776
				buff = FormatString(buff, GetStringPtr(units[_opt_ptr->units].s_volume), args, modifier >> 24, last);
3342
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   777
				modifier = 0;
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   778
				break;
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   779
			}
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   780
5108
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   781
			case SCC_WEIGHT: { // {WEIGHT}
7498
ce6588257e8d (svn r10258) -Codechange: as we are now using int64 all over the place, it's better to use int64 variables in the string generating too instead of packing them into two int32s.
rubidium
parents: 7492
diff changeset
   782
				int64 args[1];
3342
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   783
				assert(_opt_ptr->units < lengthof(units));
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   784
				args[0] = GetInt32(&argv) * units[_opt_ptr->units].w_m >> units[_opt_ptr->units].w_s;
4912
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
   785
				buff = FormatString(buff, GetStringPtr(units[_opt_ptr->units].l_weight), args, modifier >> 24, last);
3342
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   786
				modifier = 0;
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   787
				break;
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   788
			}
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   789
5108
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   790
			case SCC_WEIGHT_SHORT: { // {WEIGHT_S}
7498
ce6588257e8d (svn r10258) -Codechange: as we are now using int64 all over the place, it's better to use int64 variables in the string generating too instead of packing them into two int32s.
rubidium
parents: 7492
diff changeset
   791
				int64 args[1];
3342
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   792
				assert(_opt_ptr->units < lengthof(units));
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   793
				args[0] = GetInt32(&argv) * units[_opt_ptr->units].w_m >> units[_opt_ptr->units].w_s;
4912
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
   794
				buff = FormatString(buff, GetStringPtr(units[_opt_ptr->units].s_weight), args, modifier >> 24, last);
3342
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   795
				modifier = 0;
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   796
				break;
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   797
			}
0de5e6997611 (svn r4126) - Feature: A new multi-lingual multi-measuring-unit system:
peter1138
parents: 3329
diff changeset
   798
5108
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   799
			case SCC_FORCE: { // {FORCE}
7498
ce6588257e8d (svn r10258) -Codechange: as we are now using int64 all over the place, it's better to use int64 variables in the string generating too instead of packing them into two int32s.
rubidium
parents: 7492
diff changeset
   800
				int64 args[1];
3489
1a4ffb2bc0f4 (svn r4340) Add force {FORCE} to the units system. This is currently unused.
peter1138
parents: 3485
diff changeset
   801
				assert(_opt_ptr->units < lengthof(units));
1a4ffb2bc0f4 (svn r4340) Add force {FORCE} to the units system. This is currently unused.
peter1138
parents: 3485
diff changeset
   802
				args[0] = GetInt32(&argv) * units[_opt_ptr->units].f_m >> units[_opt_ptr->units].f_s;
4912
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
   803
				buff = FormatString(buff, GetStringPtr(units[_opt_ptr->units].force), args, modifier >> 24, last);
3489
1a4ffb2bc0f4 (svn r4340) Add force {FORCE} to the units system. This is currently unused.
peter1138
parents: 3485
diff changeset
   804
				modifier = 0;
1a4ffb2bc0f4 (svn r4340) Add force {FORCE} to the units system. This is currently unused.
peter1138
parents: 3485
diff changeset
   805
				break;
1a4ffb2bc0f4 (svn r4340) Add force {FORCE} to the units system. This is currently unused.
peter1138
parents: 3485
diff changeset
   806
			}
1a4ffb2bc0f4 (svn r4340) Add force {FORCE} to the units system. This is currently unused.
peter1138
parents: 3485
diff changeset
   807
5108
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   808
			case SCC_SKIP: // {SKIP}
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   809
				argv++;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   810
				break;
2410
d1fae093e768 (svn r2936) Move string commands to a non-printable range and remove stale comments
tron
parents: 2353
diff changeset
   811
6916
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6685
diff changeset
   812
			/* This sets up the gender for the string.
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6685
diff changeset
   813
			 * We just ignore this one. It's used in {G 0 Der Die Das} to determine the case. */
5108
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   814
			case SCC_GENDER_INDEX: // {GENDER 0}
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   815
				str++;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   816
				break;
2630
35249d2ded3e (svn r3172) static, const
tron
parents: 2548
diff changeset
   817
5108
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   818
			case SCC_STRING: {// {STRING}
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   819
				uint str = modifier + GetInt32(&argv);
6916
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6685
diff changeset
   820
				/* WARNING. It's prohibited for the included string to consume any arguments.
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6685
diff changeset
   821
				 * For included strings that consume argument, you should use STRING1, STRING2 etc.
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6685
diff changeset
   822
				 * To debug stuff you can set argv to NULL and it will tell you */
5108
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   823
				buff = GetStringWithArgs(buff, str, argv, last);
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   824
				modifier = 0;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   825
				break;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   826
			}
2087
bedb167de57b (svn r2597) Feature: [string system] Support cases.
ludde
parents: 2084
diff changeset
   827
5108
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   828
			case SCC_COMMA: // {COMMA}
7852
d2491d19f323 (svn r10719) -Codechange: since DParams are now 64 bits we should make NUM and COMMA handle writing 64 bit integers to the strings.
rubidium
parents: 7844
diff changeset
   829
				buff = FormatCommaNumber(buff, GetInt64(&argv), last);
5108
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   830
				break;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   831
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   832
			case SCC_ARG_INDEX: // Move argument pointer
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   833
				argv = argv_orig + (byte)*str++;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   834
				break;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   835
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   836
			case SCC_PLURAL_LIST: { // {P}
7852
d2491d19f323 (svn r10719) -Codechange: since DParams are now 64 bits we should make NUM and COMMA handle writing 64 bit integers to the strings.
rubidium
parents: 7844
diff changeset
   837
				int64 v = argv_orig[(byte)*str++]; // contains the number that determines plural
5108
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   838
				int len;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   839
				str = ParseStringChoice(str, DeterminePluralForm(v), buff, &len);
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   840
				buff += len;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   841
				break;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   842
			}
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   843
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   844
			case SCC_NUM: // {NUM}
7852
d2491d19f323 (svn r10719) -Codechange: since DParams are now 64 bits we should make NUM and COMMA handle writing 64 bit integers to the strings.
rubidium
parents: 7844
diff changeset
   845
				buff = FormatNoCommaNumber(buff, GetInt64(&argv), last);
5108
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   846
				break;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   847
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   848
			case SCC_CURRENCY: // {CURRENCY}
7490
3550f7e59b2e (svn r10250) -Fix: money is always 64 bits, so always parse those 64 bits.
rubidium
parents: 7452
diff changeset
   849
				buff = FormatGenericCurrency(buff, _currency, GetInt64(&argv), false, last);
5108
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   850
				break;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   851
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   852
			case SCC_WAYPOINT_NAME: { // {WAYPOINT}
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   853
				Waypoint *wp = GetWaypoint(GetInt32(&argv));
8754
5dae65402806 (svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents: 8750
diff changeset
   854
5dae65402806 (svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents: 8750
diff changeset
   855
				if (!wp->IsValid()) { // waypoint doesn't exist anymore
5dae65402806 (svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents: 8750
diff changeset
   856
					buff = GetStringWithArgs(buff, STR_UNKNOWN_DESTINATION, NULL, last);
5dae65402806 (svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents: 8750
diff changeset
   857
				} else if (wp->name != NULL) {
5dae65402806 (svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents: 8750
diff changeset
   858
					buff = strecpy(buff, wp->name, last);
5108
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   859
				} else {
8754
5dae65402806 (svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents: 8750
diff changeset
   860
					int64 temp[2];
5108
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   861
					temp[0] = wp->town_index;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   862
					temp[1] = wp->town_cn + 1;
8754
5dae65402806 (svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents: 8750
diff changeset
   863
					StringID str = wp->town_cn == 0 ? STR_WAYPOINTNAME_CITY : STR_WAYPOINTNAME_CITY_SERIAL;
5dae65402806 (svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents: 8750
diff changeset
   864
5dae65402806 (svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents: 8750
diff changeset
   865
					buff = GetStringWithArgs(buff, str, temp, last);
2087
bedb167de57b (svn r2597) Feature: [string system] Support cases.
ludde
parents: 2084
diff changeset
   866
				}
5108
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   867
				break;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   868
			}
1097
653c846fb5d9 (svn r1598) Feature: Message history now is stickyable and resizeable
dominik
parents: 1093
diff changeset
   869
5108
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   870
			case SCC_STATION_NAME: { // {STATION}
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   871
				const Station* st = GetStation(GetInt32(&argv));
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   872
6322
3d191e6e89bc (svn r8707) -Codechange: Turn IsValidStation into a method of Station
celestar
parents: 6125
diff changeset
   873
				if (!st->IsValid()) { // station doesn't exist anymore
5108
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   874
					buff = GetStringWithArgs(buff, STR_UNKNOWN_DESTINATION, NULL, last);
8754
5dae65402806 (svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents: 8750
diff changeset
   875
				} else if (st->name != NULL) {
5dae65402806 (svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents: 8750
diff changeset
   876
					buff = strecpy(buff, st->name, last);
5108
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   877
				} else {
7551
9ae828d83ff2 (svn r10320) -Fix [FS#278]: one could only build a limited number of stations before one had to rename them.
rubidium
parents: 7547
diff changeset
   878
					int64 temp[3];
7452
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7425
diff changeset
   879
					temp[0] = STR_TOWN;
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7425
diff changeset
   880
					temp[1] = st->town->index;
7551
9ae828d83ff2 (svn r10320) -Fix [FS#278]: one could only build a limited number of stations before one had to rename them.
rubidium
parents: 7547
diff changeset
   881
					temp[2] = st->index;
5108
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   882
					buff = GetStringWithArgs(buff, st->string_id, temp, last);
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   883
				}
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   884
				break;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   885
			}
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   886
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   887
			case SCC_TOWN_NAME: { // {TOWN}
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   888
				const Town* t = GetTown(GetInt32(&argv));
7498
ce6588257e8d (svn r10258) -Codechange: as we are now using int64 all over the place, it's better to use int64 variables in the string generating too instead of packing them into two int32s.
rubidium
parents: 7492
diff changeset
   889
				int64 temp[1];
5108
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   890
7882
64cdb1d52f16 (svn r10755) -Codechange: make the town struct use the pool item class as super class.
rubidium
parents: 7878
diff changeset
   891
				assert(t->IsValid());
5108
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   892
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   893
				temp[0] = t->townnameparts;
7452
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7425
diff changeset
   894
				uint32 grfid = t->townnamegrfid;
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7425
diff changeset
   895
8754
5dae65402806 (svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents: 8750
diff changeset
   896
				if (t->name != NULL) {
5dae65402806 (svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents: 8750
diff changeset
   897
					buff = strecpy(buff, t->name, last);
5dae65402806 (svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents: 8750
diff changeset
   898
				} else if (grfid == 0) {
7452
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7425
diff changeset
   899
					/* Original town name */
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7425
diff changeset
   900
					buff = GetStringWithArgs(buff, t->townnametype, temp, last);
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7425
diff changeset
   901
				} else {
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7425
diff changeset
   902
					/* Newgrf town name */
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7425
diff changeset
   903
					if (GetGRFTownName(grfid) != NULL) {
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7425
diff changeset
   904
						/* The grf is loaded */
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7425
diff changeset
   905
						buff = GRFTownNameGenerate(buff, t->townnamegrfid, t->townnametype, t->townnameparts, last);
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7425
diff changeset
   906
					} else {
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7425
diff changeset
   907
						/* Fallback to english original */
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7425
diff changeset
   908
						buff = GetStringWithArgs(buff, SPECSTR_TOWNNAME_ENGLISH, temp, last);
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7425
diff changeset
   909
					}
f6fd23727af0 (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents: 7425
diff changeset
   910
				}
5108
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   911
				break;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   912
			}
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
   913
7139
4ae3ab180d05 (svn r9874) -Feature: advanced vehicle lists a.k.a. group interface. Now you can make groups of vehicles and perform all kinds of tasks on that given group. Original code by nycom and graphics by skidd13.
rubidium
parents: 6988
diff changeset
   914
			case SCC_GROUP_NAME: { // {GROUP}
4ae3ab180d05 (svn r9874) -Feature: advanced vehicle lists a.k.a. group interface. Now you can make groups of vehicles and perform all kinds of tasks on that given group. Original code by nycom and graphics by skidd13.
rubidium
parents: 6988
diff changeset
   915
				const Group *g = GetGroup(GetInt32(&argv));
4ae3ab180d05 (svn r9874) -Feature: advanced vehicle lists a.k.a. group interface. Now you can make groups of vehicles and perform all kinds of tasks on that given group. Original code by nycom and graphics by skidd13.
rubidium
parents: 6988
diff changeset
   916
7878
70e8283207cd (svn r10751) -Codechange: make the group struct use the pool item class as super class.
rubidium
parents: 7852
diff changeset
   917
				assert(g->IsValid());
7139
4ae3ab180d05 (svn r9874) -Feature: advanced vehicle lists a.k.a. group interface. Now you can make groups of vehicles and perform all kinds of tasks on that given group. Original code by nycom and graphics by skidd13.
rubidium
parents: 6988
diff changeset
   918
8754
5dae65402806 (svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents: 8750
diff changeset
   919
				if (g->name != NULL) {
5dae65402806 (svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents: 8750
diff changeset
   920
					buff = strecpy(buff, g->name, last);
5dae65402806 (svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents: 8750
diff changeset
   921
				} else {
5dae65402806 (svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents: 8750
diff changeset
   922
					int64 args[1];
7139
4ae3ab180d05 (svn r9874) -Feature: advanced vehicle lists a.k.a. group interface. Now you can make groups of vehicles and perform all kinds of tasks on that given group. Original code by nycom and graphics by skidd13.
rubidium
parents: 6988
diff changeset
   923
8754
5dae65402806 (svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents: 8750
diff changeset
   924
					args[0] = g->index;
5dae65402806 (svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents: 8750
diff changeset
   925
					buff = GetStringWithArgs(buff, STR_GROUP_NAME_FORMAT, args, last);
5dae65402806 (svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents: 8750
diff changeset
   926
				}
7139
4ae3ab180d05 (svn r9874) -Feature: advanced vehicle lists a.k.a. group interface. Now you can make groups of vehicles and perform all kinds of tasks on that given group. Original code by nycom and graphics by skidd13.
rubidium
parents: 6988
diff changeset
   927
				break;
4ae3ab180d05 (svn r9874) -Feature: advanced vehicle lists a.k.a. group interface. Now you can make groups of vehicles and perform all kinds of tasks on that given group. Original code by nycom and graphics by skidd13.
rubidium
parents: 6988
diff changeset
   928
			}
4ae3ab180d05 (svn r9874) -Feature: advanced vehicle lists a.k.a. group interface. Now you can make groups of vehicles and perform all kinds of tasks on that given group. Original code by nycom and graphics by skidd13.
rubidium
parents: 6988
diff changeset
   929
7555
e20900912fa2 (svn r10324) -Codechange: reference engine names by index
peter1138
parents: 7554
diff changeset
   930
			case SCC_ENGINE_NAME: { // {ENGINE}
e20900912fa2 (svn r10324) -Codechange: reference engine names by index
peter1138
parents: 7554
diff changeset
   931
				EngineID engine = (EngineID)GetInt32(&argv);
8754
5dae65402806 (svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents: 8750
diff changeset
   932
				const Engine *e = GetEngine(engine);
7555
e20900912fa2 (svn r10324) -Codechange: reference engine names by index
peter1138
parents: 7554
diff changeset
   933
8754
5dae65402806 (svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents: 8750
diff changeset
   934
				if (e->name != NULL) {
5dae65402806 (svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents: 8750
diff changeset
   935
					buff = strecpy(buff, e->name, last);
5dae65402806 (svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents: 8750
diff changeset
   936
				} else {
5dae65402806 (svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents: 8750
diff changeset
   937
					buff = GetStringWithArgs(buff, EngInfo(engine)->string_id, NULL, last);
5dae65402806 (svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents: 8750
diff changeset
   938
				}
7555
e20900912fa2 (svn r10324) -Codechange: reference engine names by index
peter1138
parents: 7554
diff changeset
   939
				break;
e20900912fa2 (svn r10324) -Codechange: reference engine names by index
peter1138
parents: 7554
diff changeset
   940
			}
e20900912fa2 (svn r10324) -Codechange: reference engine names by index
peter1138
parents: 7554
diff changeset
   941
7545
9a4834d48970 (svn r10314) -Codechange: Refer to vehicle names by index
peter1138
parents: 7502
diff changeset
   942
			case SCC_VEHICLE_NAME: { // {VEHICLE}
9a4834d48970 (svn r10314) -Codechange: Refer to vehicle names by index
peter1138
parents: 7502
diff changeset
   943
				const Vehicle *v = GetVehicle(GetInt32(&argv));
9a4834d48970 (svn r10314) -Codechange: Refer to vehicle names by index
peter1138
parents: 7502
diff changeset
   944
8754
5dae65402806 (svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents: 8750
diff changeset
   945
				if (v->name != NULL) {
5dae65402806 (svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents: 8750
diff changeset
   946
					buff = strecpy(buff, v->name, last);
5dae65402806 (svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents: 8750
diff changeset
   947
				} else {
5dae65402806 (svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents: 8750
diff changeset
   948
					int64 args[1];
5dae65402806 (svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents: 8750
diff changeset
   949
					args[0] = v->unitnumber;
7545
9a4834d48970 (svn r10314) -Codechange: Refer to vehicle names by index
peter1138
parents: 7502
diff changeset
   950
8754
5dae65402806 (svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents: 8750
diff changeset
   951
					StringID str;
5dae65402806 (svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents: 8750
diff changeset
   952
					switch (v->type) {
5dae65402806 (svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents: 8750
diff changeset
   953
						default: NOT_REACHED();
5dae65402806 (svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents: 8750
diff changeset
   954
						case VEH_TRAIN:    str = STR_SV_TRAIN_NAME; break;
5dae65402806 (svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents: 8750
diff changeset
   955
						case VEH_ROAD:     str = STR_SV_ROADVEH_NAME; break;
5dae65402806 (svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents: 8750
diff changeset
   956
						case VEH_SHIP:     str = STR_SV_SHIP_NAME; break;
5dae65402806 (svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents: 8750
diff changeset
   957
						case VEH_AIRCRAFT: str = STR_SV_AIRCRAFT_NAME; break;
5dae65402806 (svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents: 8750
diff changeset
   958
					}
5dae65402806 (svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents: 8750
diff changeset
   959
5dae65402806 (svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents: 8750
diff changeset
   960
					buff = GetStringWithArgs(buff, str, args, last);
5dae65402806 (svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents: 8750
diff changeset
   961
				}
7545
9a4834d48970 (svn r10314) -Codechange: Refer to vehicle names by index
peter1138
parents: 7502
diff changeset
   962
				break;
9a4834d48970 (svn r10314) -Codechange: Refer to vehicle names by index
peter1138
parents: 7502
diff changeset
   963
			}
9a4834d48970 (svn r10314) -Codechange: Refer to vehicle names by index
peter1138
parents: 7502
diff changeset
   964
7552
064d734e9900 (svn r10321) -Codechange: refer to sign text by index
peter1138
parents: 7551
diff changeset
   965
			case SCC_SIGN_NAME: { // {SIGN}
064d734e9900 (svn r10321) -Codechange: refer to sign text by index
peter1138
parents: 7551
diff changeset
   966
				const Sign *si = GetSign(GetInt32(&argv));
8754
5dae65402806 (svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents: 8750
diff changeset
   967
				if (si->name != NULL) {
5dae65402806 (svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents: 8750
diff changeset
   968
					buff = strecpy(buff, si->name, last);
5dae65402806 (svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents: 8750
diff changeset
   969
				} else {
5dae65402806 (svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents: 8750
diff changeset
   970
					buff = GetStringWithArgs(buff, STR_280A_SIGN, NULL, last);
5dae65402806 (svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents: 8750
diff changeset
   971
				}
7552
064d734e9900 (svn r10321) -Codechange: refer to sign text by index
peter1138
parents: 7551
diff changeset
   972
				break;
064d734e9900 (svn r10321) -Codechange: refer to sign text by index
peter1138
parents: 7551
diff changeset
   973
			}
064d734e9900 (svn r10321) -Codechange: refer to sign text by index
peter1138
parents: 7551
diff changeset
   974
7554
076c42f44a83 (svn r10323) -Codechange: reference company name, number and player (president) name
peter1138
parents: 7552
diff changeset
   975
			case SCC_COMPANY_NAME: { // {COMPANY}
076c42f44a83 (svn r10323) -Codechange: reference company name, number and player (president) name
peter1138
parents: 7552
diff changeset
   976
				const Player *p = GetPlayer((PlayerID)GetInt32(&argv));
8754
5dae65402806 (svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents: 8750
diff changeset
   977
5dae65402806 (svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents: 8750
diff changeset
   978
				if (p->name != NULL) {
5dae65402806 (svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents: 8750
diff changeset
   979
					buff = strecpy(buff, p->name, last);
5dae65402806 (svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents: 8750
diff changeset
   980
				} else {
5dae65402806 (svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents: 8750
diff changeset
   981
					int64 args[1];
5dae65402806 (svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents: 8750
diff changeset
   982
					args[0] = p->name_2;
5dae65402806 (svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents: 8750
diff changeset
   983
					buff = GetStringWithArgs(buff, p->name_1, args, last);
5dae65402806 (svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents: 8750
diff changeset
   984
				}
7554
076c42f44a83 (svn r10323) -Codechange: reference company name, number and player (president) name
peter1138
parents: 7552
diff changeset
   985
				break;
076c42f44a83 (svn r10323) -Codechange: reference company name, number and player (president) name
peter1138
parents: 7552
diff changeset
   986
			}
076c42f44a83 (svn r10323) -Codechange: reference company name, number and player (president) name
peter1138
parents: 7552
diff changeset
   987
076c42f44a83 (svn r10323) -Codechange: reference company name, number and player (president) name
peter1138
parents: 7552
diff changeset
   988
			case SCC_COMPANY_NUM: { // {COMPANYNUM}
076c42f44a83 (svn r10323) -Codechange: reference company name, number and player (president) name
peter1138
parents: 7552
diff changeset
   989
				PlayerID player = (PlayerID)GetInt32(&argv);
076c42f44a83 (svn r10323) -Codechange: reference company name, number and player (president) name
peter1138
parents: 7552
diff changeset
   990
076c42f44a83 (svn r10323) -Codechange: reference company name, number and player (president) name
peter1138
parents: 7552
diff changeset
   991
				/* Nothing is added for AI or inactive players */
076c42f44a83 (svn r10323) -Codechange: reference company name, number and player (president) name
peter1138
parents: 7552
diff changeset
   992
				if (IsHumanPlayer(player) && IsValidPlayer(player)) {
076c42f44a83 (svn r10323) -Codechange: reference company name, number and player (president) name
peter1138
parents: 7552
diff changeset
   993
					int64 args[1];
076c42f44a83 (svn r10323) -Codechange: reference company name, number and player (president) name
peter1138
parents: 7552
diff changeset
   994
					args[0] = player + 1;
076c42f44a83 (svn r10323) -Codechange: reference company name, number and player (president) name
peter1138
parents: 7552
diff changeset
   995
					buff = GetStringWithArgs(buff, STR_7002_PLAYER, args, last);
076c42f44a83 (svn r10323) -Codechange: reference company name, number and player (president) name
peter1138
parents: 7552
diff changeset
   996
				}
076c42f44a83 (svn r10323) -Codechange: reference company name, number and player (president) name
peter1138
parents: 7552
diff changeset
   997
				break;
076c42f44a83 (svn r10323) -Codechange: reference company name, number and player (president) name
peter1138
parents: 7552
diff changeset
   998
			}
076c42f44a83 (svn r10323) -Codechange: reference company name, number and player (president) name
peter1138
parents: 7552
diff changeset
   999
076c42f44a83 (svn r10323) -Codechange: reference company name, number and player (president) name
peter1138
parents: 7552
diff changeset
  1000
			case SCC_PLAYER_NAME: { // {PLAYERNAME}
076c42f44a83 (svn r10323) -Codechange: reference company name, number and player (president) name
peter1138
parents: 7552
diff changeset
  1001
				const Player *p = GetPlayer((PlayerID)GetInt32(&argv));
8754
5dae65402806 (svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents: 8750
diff changeset
  1002
5dae65402806 (svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents: 8750
diff changeset
  1003
				if (p->president_name != NULL) {
5dae65402806 (svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents: 8750
diff changeset
  1004
					buff = strecpy(buff, p->president_name, last);
5dae65402806 (svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents: 8750
diff changeset
  1005
				} else {
5dae65402806 (svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents: 8750
diff changeset
  1006
					int64 args[1];
5dae65402806 (svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents: 8750
diff changeset
  1007
					args[0] = p->president_name_2;
5dae65402806 (svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents: 8750
diff changeset
  1008
					buff = GetStringWithArgs(buff, p->president_name_1, args, last);
5dae65402806 (svn r11822) -Codechange: Replaced fixed size custom name array. Names are now attached to their object directly and there is
peter1138
parents: 8750
diff changeset
  1009
				}
7554
076c42f44a83 (svn r10323) -Codechange: reference company name, number and player (president) name
peter1138
parents: 7552
diff changeset
  1010
				break;
076c42f44a83 (svn r10323) -Codechange: reference company name, number and player (president) name
peter1138
parents: 7552
diff changeset
  1011
			}
076c42f44a83 (svn r10323) -Codechange: reference company name, number and player (president) name
peter1138
parents: 7552
diff changeset
  1012
5108
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
  1013
			case SCC_SETCASE: { // {SETCASE}
6916
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6685
diff changeset
  1014
				/* This is a pseudo command, it's outputted when someone does {STRING.ack}
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6685
diff changeset
  1015
				 * The modifier is added to all subsequent GetStringWithArgs that accept the modifier. */
5108
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
  1016
				modifier = (byte)*str++ << 24;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
  1017
				break;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
  1018
			}
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
  1019
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
  1020
			case SCC_SWITCH_CASE: { // {Used to implement case switching}
6916
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6685
diff changeset
  1021
				/* <0x9E> <NUM CASES> <CASE1> <LEN1> <STRING1> <CASE2> <LEN2> <STRING2> <CASE3> <LEN3> <STRING3> <STRINGDEFAULT>
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6685
diff changeset
  1022
				 * Each LEN is printed using 2 bytes in big endian order. */
5108
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
  1023
				uint num = (byte)*str++;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
  1024
				while (num) {
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
  1025
					if ((byte)str[0] == casei) {
6916
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6685
diff changeset
  1026
						/* Found the case, adjust str pointer and continue */
5108
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
  1027
						str += 3;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
  1028
						break;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
  1029
					}
6916
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6685
diff changeset
  1030
					/* Otherwise skip to the next case */
5108
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
  1031
					str += 3 + (str[1] << 8) + str[2];
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
  1032
					num--;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
  1033
				}
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
  1034
				break;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
  1035
			}
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
  1036
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
  1037
			default:
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
  1038
				if (buff + Utf8CharLen(b) < last) buff += Utf8Encode(buff, b);
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
  1039
				break;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1040
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1041
	}
1316
a7352de83a2b (svn r1820) Style cleanup:
tron
parents: 1312
diff changeset
  1042
	*buff = '\0';
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1043
	return buff;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1044
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1045
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1046
4912
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
  1047
static char *StationGetSpecialString(char *buff, int x, const char* last)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1048
{
5108
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
  1049
	if ((x & 0x01) && (buff + Utf8CharLen(SCC_TRAIN) < last)) buff += Utf8Encode(buff, SCC_TRAIN);
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
  1050
	if ((x & 0x02) && (buff + Utf8CharLen(SCC_LORRY) < last)) buff += Utf8Encode(buff, SCC_LORRY);
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
  1051
	if ((x & 0x04) && (buff + Utf8CharLen(SCC_BUS)   < last)) buff += Utf8Encode(buff, SCC_BUS);
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
  1052
	if ((x & 0x08) && (buff + Utf8CharLen(SCC_PLANE) < last)) buff += Utf8Encode(buff, SCC_PLANE);
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
  1053
	if ((x & 0x10) && (buff + Utf8CharLen(SCC_SHIP)  < last)) buff += Utf8Encode(buff, SCC_SHIP);
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 4942
diff changeset
  1054
	*buff = '\0';
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1055
	return buff;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1056
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1057
4912
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
  1058
static char *GetSpecialTownNameString(char *buff, int ind, uint32 seed, const char* last)
1316
a7352de83a2b (svn r1820) Style cleanup:
tron
parents: 1312
diff changeset
  1059
{
4912
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
  1060
	char name[512];
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1061
4920
de739ffd31a4 (svn r6896) - Fix (r6895): Supply last position of the correct buffer *again*
peter1138
parents: 4919
diff changeset
  1062
	_town_name_generators[ind](name, seed, lastof(name));
4912
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
  1063
	return strecpy(buff, name, last);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1064
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1065
2650
8caa93e39375 (svn r3192) Split the surname list into two lists (non-toyland/toyland) and use lengthof() to get the number of names instead of using magic numbers
tron
parents: 2643
diff changeset
  1066
static const char* const _silly_company_names[] = {
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1067
	"Bloggs Brothers",
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1068
	"Tiny Transport Ltd.",
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1069
	"Express Travel",
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1070
	"Comfy-Coach & Co.",
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1071
	"Crush & Bump Ltd.",
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1072
	"Broken & Late Ltd.",
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1073
	"Sam Speedy & Son",
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1074
	"Supersonic Travel",
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1075
	"Mike's Motors",
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1076
	"Lightning International",
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1077
	"Pannik & Loozit Ltd.",
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1078
	"Inter-City Transport",
2650
8caa93e39375 (svn r3192) Split the surname list into two lists (non-toyland/toyland) and use lengthof() to get the number of names instead of using magic numbers
tron
parents: 2643
diff changeset
  1079
	"Getout & Pushit Ltd."
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1080
};
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1081
2650
8caa93e39375 (svn r3192) Split the surname list into two lists (non-toyland/toyland) and use lengthof() to get the number of names instead of using magic numbers
tron
parents: 2643
diff changeset
  1082
static const char* const _surname_list[] = {
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1083
	"Adams",
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1084
	"Allan",
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1085
	"Baker",
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1086
	"Bigwig",
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1087
	"Black",
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1088
	"Bloggs",
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1089
	"Brown",
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1090
	"Campbell",
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1091
	"Gordon",
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1092
	"Hamilton",
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1093
	"Hawthorn",
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1094
	"Higgins",
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1095
	"Green",
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1096
	"Gribble",
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1097
	"Jones",
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1098
	"McAlpine",
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1099
	"MacDonald",
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1100
	"McIntosh",
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1101
	"Muir",
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1102
	"Murphy",
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1103
	"Nelson",
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1104
	"O'Donnell",
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1105
	"Parker",
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1106
	"Phillips",
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1107
	"Pilkington",
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1108
	"Quigley",
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1109
	"Sharkey",
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1110
	"Thomson",
2650
8caa93e39375 (svn r3192) Split the surname list into two lists (non-toyland/toyland) and use lengthof() to get the number of names instead of using magic numbers
tron
parents: 2643
diff changeset
  1111
	"Watkins"
8caa93e39375 (svn r3192) Split the surname list into two lists (non-toyland/toyland) and use lengthof() to get the number of names instead of using magic numbers
tron
parents: 2643
diff changeset
  1112
};
8caa93e39375 (svn r3192) Split the surname list into two lists (non-toyland/toyland) and use lengthof() to get the number of names instead of using magic numbers
tron
parents: 2643
diff changeset
  1113
8caa93e39375 (svn r3192) Split the surname list into two lists (non-toyland/toyland) and use lengthof() to get the number of names instead of using magic numbers
tron
parents: 2643
diff changeset
  1114
static const char* const _silly_surname_list[] = {
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1115
	"Grumpy",
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1116
	"Dozy",
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1117
	"Speedy",
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1118
	"Nosey",
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1119
	"Dribble",
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1120
	"Mushroom",
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1121
	"Cabbage",
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1122
	"Sniffle",
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1123
	"Fishy",
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1124
	"Swindle",
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1125
	"Sneaky",
2650
8caa93e39375 (svn r3192) Split the surname list into two lists (non-toyland/toyland) and use lengthof() to get the number of names instead of using magic numbers
tron
parents: 2643
diff changeset
  1126
	"Nutkins"
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1127
};
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1128
1312
8defbb525d09 (svn r1816) Use char instead of byte for string formatting
tron
parents: 1311
diff changeset
  1129
static const char _initial_name_letters[] = {
1321
938ec22ae6f7 (svn r1825) Further style improvements:
tron
parents: 1319
diff changeset
  1130
	'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
938ec22ae6f7 (svn r1825) Further style improvements:
tron
parents: 1319
diff changeset
  1131
	'K', 'L', 'M', 'N', 'P', 'R', 'S', 'T', 'W',
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1132
};
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1133
4912
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
  1134
static char *GenAndCoName(char *buff, uint32 arg, const char* last)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1135
{
2650
8caa93e39375 (svn r3192) Split the surname list into two lists (non-toyland/toyland) and use lengthof() to get the number of names instead of using magic numbers
tron
parents: 2643
diff changeset
  1136
	const char* const* base;
8caa93e39375 (svn r3192) Split the surname list into two lists (non-toyland/toyland) and use lengthof() to get the number of names instead of using magic numbers
tron
parents: 2643
diff changeset
  1137
	uint num;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1138
6683
7ec558346172 (svn r9400) -Codechange: Use some more representative enum names for landscape types.
belugas
parents: 6670
diff changeset
  1139
	if (_opt_ptr->landscape == LT_TOYLAND) {
2650
8caa93e39375 (svn r3192) Split the surname list into two lists (non-toyland/toyland) and use lengthof() to get the number of names instead of using magic numbers
tron
parents: 2643
diff changeset
  1140
		base = _silly_surname_list;
8caa93e39375 (svn r3192) Split the surname list into two lists (non-toyland/toyland) and use lengthof() to get the number of names instead of using magic numbers
tron
parents: 2643
diff changeset
  1141
		num  = lengthof(_silly_surname_list);
8caa93e39375 (svn r3192) Split the surname list into two lists (non-toyland/toyland) and use lengthof() to get the number of names instead of using magic numbers
tron
parents: 2643
diff changeset
  1142
	} else {
8caa93e39375 (svn r3192) Split the surname list into two lists (non-toyland/toyland) and use lengthof() to get the number of names instead of using magic numbers
tron
parents: 2643
diff changeset
  1143
		base = _surname_list;
8caa93e39375 (svn r3192) Split the surname list into two lists (non-toyland/toyland) and use lengthof() to get the number of names instead of using magic numbers
tron
parents: 2643
diff changeset
  1144
		num  = lengthof(_surname_list);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1145
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1146
4912
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
  1147
	buff = strecpy(buff, base[num * GB(arg, 16, 8) >> 8], last);
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
  1148
	buff = strecpy(buff, " & Co.", last);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1149
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1150
	return buff;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1151
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1152
4912
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
  1153
static char *GenPresidentName(char *buff, uint32 x, const char* last)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1154
{
4912
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
  1155
	char initial[] = "?. ";
2650
8caa93e39375 (svn r3192) Split the surname list into two lists (non-toyland/toyland) and use lengthof() to get the number of names instead of using magic numbers
tron
parents: 2643
diff changeset
  1156
	const char* const* base;
8caa93e39375 (svn r3192) Split the surname list into two lists (non-toyland/toyland) and use lengthof() to get the number of names instead of using magic numbers
tron
parents: 2643
diff changeset
  1157
	uint num;
8caa93e39375 (svn r3192) Split the surname list into two lists (non-toyland/toyland) and use lengthof() to get the number of names instead of using magic numbers
tron
parents: 2643
diff changeset
  1158
	uint i;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1159
4912
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
  1160
	initial[0] = _initial_name_letters[sizeof(_initial_name_letters) * GB(x, 0, 8) >> 8];
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
  1161
	buff = strecpy(buff, initial, last);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1162
2150
010d923a81a9 (svn r2660) Get rid of some more shifting/anding/casting
tron
parents: 2140
diff changeset
  1163
	i = (sizeof(_initial_name_letters) + 35) * GB(x, 8, 8) >> 8;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1164
	if (i < sizeof(_initial_name_letters)) {
4912
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
  1165
		initial[0] = _initial_name_letters[i];
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
  1166
		buff = strecpy(buff, initial, last);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1167
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1168
6683
7ec558346172 (svn r9400) -Codechange: Use some more representative enum names for landscape types.
belugas
parents: 6670
diff changeset
  1169
	if (_opt_ptr->landscape == LT_TOYLAND) {
2650
8caa93e39375 (svn r3192) Split the surname list into two lists (non-toyland/toyland) and use lengthof() to get the number of names instead of using magic numbers
tron
parents: 2643
diff changeset
  1170
		base = _silly_surname_list;
8caa93e39375 (svn r3192) Split the surname list into two lists (non-toyland/toyland) and use lengthof() to get the number of names instead of using magic numbers
tron
parents: 2643
diff changeset
  1171
		num  = lengthof(_silly_surname_list);
8caa93e39375 (svn r3192) Split the surname list into two lists (non-toyland/toyland) and use lengthof() to get the number of names instead of using magic numbers
tron
parents: 2643
diff changeset
  1172
	} else {
8caa93e39375 (svn r3192) Split the surname list into two lists (non-toyland/toyland) and use lengthof() to get the number of names instead of using magic numbers
tron
parents: 2643
diff changeset
  1173
		base = _surname_list;
8caa93e39375 (svn r3192) Split the surname list into two lists (non-toyland/toyland) and use lengthof() to get the number of names instead of using magic numbers
tron
parents: 2643
diff changeset
  1174
		num  = lengthof(_surname_list);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1175
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1176
4912
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
  1177
	buff = strecpy(buff, base[num * GB(x, 16, 8) >> 8], last);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1178
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1179
	return buff;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1180
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1181
7498
ce6588257e8d (svn r10258) -Codechange: as we are now using int64 all over the place, it's better to use int64 variables in the string generating too instead of packing them into two int32s.
rubidium
parents: 7492
diff changeset
  1182
static char *GetSpecialPlayerNameString(char *buff, int ind, const int64 *argv, const char* last)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1183
{
1316
a7352de83a2b (svn r1820) Style cleanup:
tron
parents: 1312
diff changeset
  1184
	switch (ind) {
1321
938ec22ae6f7 (svn r1825) Further style improvements:
tron
parents: 1319
diff changeset
  1185
		case 1: // not used
4912
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
  1186
			return strecpy(buff, _silly_company_names[GetInt32(&argv) & 0xFFFF], last);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1187
1321
938ec22ae6f7 (svn r1825) Further style improvements:
tron
parents: 1319
diff changeset
  1188
		case 2: // used for Foobar & Co company names
4912
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
  1189
			return GenAndCoName(buff, GetInt32(&argv), last);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1190
1321
938ec22ae6f7 (svn r1825) Further style improvements:
tron
parents: 1319
diff changeset
  1191
		case 3: // President name
4912
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
  1192
			return GenPresidentName(buff, GetInt32(&argv), last);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1193
1321
938ec22ae6f7 (svn r1825) Further style improvements:
tron
parents: 1319
diff changeset
  1194
		case 4: // song names
4912
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
  1195
			return strecpy(buff, origin_songs_specs[GetInt32(&argv) - 1].song_name, last);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1196
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1197
6916
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6685
diff changeset
  1198
	/* town name? */
10229
fba3f9fa44d7 (svn r12761) -Codechange: lots of minor whitespace coding style fixes around operators.
rubidium
parents: 10134
diff changeset
  1199
	if (IsInsideMM(ind - 6, 0, SPECSTR_TOWNNAME_LAST - SPECSTR_TOWNNAME_START + 1)) {
4912
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
  1200
		buff = GetSpecialTownNameString(buff, ind - 6, GetInt32(&argv), last);
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
  1201
		return strecpy(buff, " Transport", last);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1202
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1203
6916
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6685
diff changeset
  1204
	/* language name? */
8450
dce58137301f (svn r11510) -Codechange: merge the IS_*INSIDE* functions and rename them fitting to the naming style
skidd13
parents: 8424
diff changeset
  1205
	if (IsInsideMM(ind, (SPECSTR_LANGUAGE_START - 0x70E4), (SPECSTR_LANGUAGE_END - 0x70E4) + 1)) {
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1206
		int i = ind - (SPECSTR_LANGUAGE_START - 0x70E4);
1853
2c2f5699e75f (svn r2359) Use strecpy instead of str_cat (which was rather a cpy than a cat, btw), remove the latter and simplify some constructs
tron
parents: 1704
diff changeset
  1207
		return strecpy(buff,
4912
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
  1208
			i == _dynlang.curr ? _langpack->own_name : _dynlang.ent[i].name, last);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1209
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1210
6916
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6685
diff changeset
  1211
	/* resolution size? */
8450
dce58137301f (svn r11510) -Codechange: merge the IS_*INSIDE* functions and rename them fitting to the naming style
skidd13
parents: 8424
diff changeset
  1212
	if (IsInsideMM(ind, (SPECSTR_RESOLUTION_START - 0x70E4), (SPECSTR_RESOLUTION_END - 0x70E4) + 1)) {
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1213
		int i = ind - (SPECSTR_RESOLUTION_START - 0x70E4);
4912
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
  1214
		buff += snprintf(
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
  1215
			buff, last - buff + 1, "%dx%d", _resolutions[i][0], _resolutions[i][1]
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
  1216
		);
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
  1217
		return buff;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1218
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1219
6916
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6685
diff changeset
  1220
	/* screenshot format name? */
8450
dce58137301f (svn r11510) -Codechange: merge the IS_*INSIDE* functions and rename them fitting to the naming style
skidd13
parents: 8424
diff changeset
  1221
	if (IsInsideMM(ind, (SPECSTR_SCREENSHOT_START - 0x70E4), (SPECSTR_SCREENSHOT_END - 0x70E4) + 1)) {
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1222
		int i = ind - (SPECSTR_SCREENSHOT_START - 0x70E4);
4912
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4898
diff changeset
  1223
		return strecpy(buff, GetScreenshotFormatDesc(i), last);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1224
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1225
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1226
	assert(0);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1227
	return NULL;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1228
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1229
7394
75d35728b8b1 (svn r10145) -Fix: make compiling with networking disabled (again) possible.
rubidium
parents: 7293
diff changeset
  1230
#ifdef ENABLE_NETWORK
7289
d6a004877931 (svn r10032) -Add: sort the strings in server language dropdown
glx
parents: 7139
diff changeset
  1231
extern void SortNetworkLanguages();
7394
75d35728b8b1 (svn r10145) -Fix: make compiling with networking disabled (again) possible.
rubidium
parents: 7293
diff changeset
  1232
#else /* ENABLE_NETWORK */
75d35728b8b1 (svn r10145) -Fix: make compiling with networking disabled (again) possible.
rubidium
parents: 7293
diff changeset
  1233
static inline void SortNetworkLanguages() {}
75d35728b8b1 (svn r10145) -Fix: make compiling with networking disabled (again) possible.
rubidium
parents: 7293
diff changeset
  1234
#endif /* ENABLE_NETWORK */
7289
d6a004877931 (svn r10032) -Add: sort the strings in server language dropdown
glx
parents: 7139
diff changeset
  1235
1316
a7352de83a2b (svn r1820) Style cleanup:
tron
parents: 1312
diff changeset
  1236
bool ReadLanguagePack(int lang_index)
a7352de83a2b (svn r1820) Style cleanup:
tron
parents: 1312
diff changeset
  1237
{
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1238
	int tot_count, i;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1239
	size_t len;
1312
8defbb525d09 (svn r1816) Use char instead of byte for string formatting
tron
parents: 1311
diff changeset
  1240
	char **langpack_offs;
8defbb525d09 (svn r1816) Use char instead of byte for string formatting
tron
parents: 1311
diff changeset
  1241
	char *s;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1242
6646
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1243
	LanguagePack *lang_pack = (LanguagePack*)ReadFileToMem(_dynlang.ent[lang_index].file, &len, 200000);
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1244
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1245
	if (lang_pack == NULL) return false;
1319
cd302ee91e27 (svn r1823) Get rid of some ugly cast magic concerning language packs
tron
parents: 1318
diff changeset
  1246
	if (len < sizeof(LanguagePack) ||
cd302ee91e27 (svn r1823) Get rid of some ugly cast magic concerning language packs
tron
parents: 1318
diff changeset
  1247
			lang_pack->ident != TO_LE32(LANGUAGE_PACK_IDENT) ||
cd302ee91e27 (svn r1823) Get rid of some ugly cast magic concerning language packs
tron
parents: 1318
diff changeset
  1248
			lang_pack->version != TO_LE32(LANGUAGE_PACK_VERSION)) {
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1249
		free(lang_pack);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1250
		return false;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1251
	}
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 64
diff changeset
  1252
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1253
#if defined(TTD_BIG_ENDIAN)
1316
a7352de83a2b (svn r1820) Style cleanup:
tron
parents: 1312
diff changeset
  1254
	for (i = 0; i != 32; i++) {
2966
7f382cfeb93d (svn r3529) - Fix: [ 1415782 ] crash in string code with openbsd/zaurus; alignment issues (thanks Tron for the help)
Darkvater
parents: 2957
diff changeset
  1255
		lang_pack->offsets[i] = ReadLE16Aligned(&lang_pack->offsets[i]);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1256
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1257
#endif
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1258
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1259
	tot_count = 0;
1316
a7352de83a2b (svn r1820) Style cleanup:
tron
parents: 1312
diff changeset
  1260
	for (i = 0; i != 32; i++) {
1319
cd302ee91e27 (svn r1823) Get rid of some ugly cast magic concerning language packs
tron
parents: 1318
diff changeset
  1261
		uint num = lang_pack->offsets[i];
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1262
		_langtab_start[i] = tot_count;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1263
		_langtab_num[i] = num;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1264
		tot_count += num;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1265
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1266
6916
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6685
diff changeset
  1267
	/* Allocate offsets */
5860
7fdc9b423ba1 (svn r8066) - Codechange: MallocT(), CallocT(), ReallocT() now return the pointer to allocated memory instead of modifying the pointer given as parameter
KUDr
parents: 5838
diff changeset
  1268
	langpack_offs = MallocT<char*>(tot_count);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1269
6916
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6685
diff changeset
  1270
	/* Fill offsets */
1319
cd302ee91e27 (svn r1823) Get rid of some ugly cast magic concerning language packs
tron
parents: 1318
diff changeset
  1271
	s = lang_pack->data;
1316
a7352de83a2b (svn r1820) Style cleanup:
tron
parents: 1312
diff changeset
  1272
	for (i = 0; i != tot_count; i++) {
1312
8defbb525d09 (svn r1816) Use char instead of byte for string formatting
tron
parents: 1311
diff changeset
  1273
		len = (byte)*s;
1316
a7352de83a2b (svn r1820) Style cleanup:
tron
parents: 1312
diff changeset
  1274
		*s++ = '\0'; // zero terminate the string before.
a7352de83a2b (svn r1820) Style cleanup:
tron
parents: 1312
diff changeset
  1275
		if (len >= 0xC0) len = ((len & 0x3F) << 8) + (byte)*s++;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1276
		langpack_offs[i] = s;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1277
		s += len;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1278
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1279
1321
938ec22ae6f7 (svn r1825) Further style improvements:
tron
parents: 1319
diff changeset
  1280
	free(_langpack);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1281
	_langpack = lang_pack;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1282
1321
938ec22ae6f7 (svn r1825) Further style improvements:
tron
parents: 1319
diff changeset
  1283
	free(_langpack_offs);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1284
	_langpack_offs = langpack_offs;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1285
6670
86c087999542 (svn r9373) -Fix (r9271): the chosen language was not stored nor read properly in/from the cfg.
rubidium
parents: 6646
diff changeset
  1286
	const char *c_file = strrchr(_dynlang.ent[lang_index].file, PATHSEPCHAR) + 1;
86c087999542 (svn r9373) -Fix (r9271): the chosen language was not stored nor read properly in/from the cfg.
rubidium
parents: 6646
diff changeset
  1287
	ttd_strlcpy(_dynlang.curr_file, c_file, lengthof(_dynlang.curr_file));
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1288
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1289
	_dynlang.curr = lang_index;
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents: 3489
diff changeset
  1290
	SetCurrentGrfLangID(_langpack->isocode);
7289
d6a004877931 (svn r10032) -Add: sort the strings in server language dropdown
glx
parents: 7139
diff changeset
  1291
	SortNetworkLanguages();
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1292
	return true;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1293
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1294
7844
fbecfb6e2c2b (svn r10711) -Fix [Win32]: take default language from current user's locale on Windows (In-)
KUDr
parents: 7812
diff changeset
  1295
/* Win32 implementation in win32.cpp. */
7931
855327e1ab53 (svn r10851) -Feature [OSX]: OpenTTD will now pick the same language as finder is set to if no config file is found (ln-)
bjarni
parents: 7918
diff changeset
  1296
/* OS X implementation in os/macosx/macos.mm. */
855327e1ab53 (svn r10851) -Feature [OSX]: OpenTTD will now pick the same language as finder is set to if no config file is found (ln-)
bjarni
parents: 7918
diff changeset
  1297
#if !(defined(WIN32) || defined(__APPLE__))
3329
992d1f7cb747 (svn r4105) - Feature: Add proper ISO-8859-15 <> LOCALCODE conversion. As the mess that is makefile can't properly support it at the moment, it is only available for MACOSX. Windows doesn't need FS conversion and I have no idea about OS/2 so it's disabled for them.
Darkvater
parents: 3033
diff changeset
  1298
/** Determine the current charset based on the environment
992d1f7cb747 (svn r4105) - Feature: Add proper ISO-8859-15 <> LOCALCODE conversion. As the mess that is makefile can't properly support it at the moment, it is only available for MACOSX. Windows doesn't need FS conversion and I have no idea about OS/2 so it's disabled for them.
Darkvater
parents: 3033
diff changeset
  1299
 * First check some default values, after this one we passed ourselves
992d1f7cb747 (svn r4105) - Feature: Add proper ISO-8859-15 <> LOCALCODE conversion. As the mess that is makefile can't properly support it at the moment, it is only available for MACOSX. Windows doesn't need FS conversion and I have no idea about OS/2 so it's disabled for them.
Darkvater
parents: 3033
diff changeset
  1300
 * and if none exist return the value for $LANG
6916
e87d54a598ea (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6685
diff changeset
  1301
 * @param param environment variable to check conditionally if default ones are not
3329
992d1f7cb747 (svn r4105) - Feature: Add proper ISO-8859-15 <> LOCALCODE conversion. As the mess that is makefile can't properly support it at the moment, it is only available for MACOSX. Windows doesn't need FS conversion and I have no idea about OS/2 so it's disabled for them.
Darkvater
parents: 3033
diff changeset
  1302
 *        set. Pass NULL if you don't want additional checks.
992d1f7cb747 (svn r4105) - Feature: Add proper ISO-8859-15 <> LOCALCODE conversion. As the mess that is makefile can't properly support it at the moment, it is only available for MACOSX. Windows doesn't need FS conversion and I have no idea about OS/2 so it's disabled for them.
Darkvater
parents: 3033
diff changeset
  1303
 * @return return string containing current charset, or NULL if not-determinable */
992d1f7cb747 (svn r4105) - Feature: Add proper ISO-8859-15 <> LOCALCODE conversion. As the mess that is makefile can't properly support it at the moment, it is only available for MACOSX. Windows doesn't need FS conversion and I have no idea about OS/2 so it's disabled for them.
Darkvater
parents: 3033
diff changeset
  1304
const char *GetCurrentLocale(const char *param)
992d1f7cb747 (svn r4105) - Feature: Add proper ISO-8859-15 <> LOCALCODE conversion. As the mess that is makefile can't properly support it at the moment, it is only available for MACOSX. Windows doesn't need FS conversion and I have no idea about OS/2 so it's disabled for them.
Darkvater
parents: 3033
diff changeset
  1305
{
992d1f7cb747 (svn r4105) - Feature: Add proper ISO-8859-15 <> LOCALCODE conversion. As the mess that is makefile can't properly support it at the moment, it is only available for MACOSX. Windows doesn't need FS conversion and I have no idea about OS/2 so it's disabled for them.
Darkvater
parents: 3033
diff changeset
  1306
	const char *env;
992d1f7cb747 (svn r4105) - Feature: Add proper ISO-8859-15 <> LOCALCODE conversion. As the mess that is makefile can't properly support it at the moment, it is only available for MACOSX. Windows doesn't need FS conversion and I have no idea about OS/2 so it's disabled for them.
Darkvater
parents: 3033
diff changeset
  1307
992d1f7cb747 (svn r4105) - Feature: Add proper ISO-8859-15 <> LOCALCODE conversion. As the mess that is makefile can't properly support it at the moment, it is only available for MACOSX. Windows doesn't need FS conversion and I have no idea about OS/2 so it's disabled for them.
Darkvater
parents: 3033
diff changeset
  1308
	env = getenv("LANGUAGE");
992d1f7cb747 (svn r4105) - Feature: Add proper ISO-8859-15 <> LOCALCODE conversion. As the mess that is makefile can't properly support it at the moment, it is only available for MACOSX. Windows doesn't need FS conversion and I have no idea about OS/2 so it's disabled for them.
Darkvater
parents: 3033
diff changeset
  1309
	if (env != NULL) return env;
992d1f7cb747 (svn r4105) - Feature: Add proper ISO-8859-15 <> LOCALCODE conversion. As the mess that is makefile can't properly support it at the moment, it is only available for MACOSX. Windows doesn't need FS conversion and I have no idea about OS/2 so it's disabled for them.
Darkvater
parents: 3033
diff changeset
  1310
992d1f7cb747 (svn r4105) - Feature: Add proper ISO-8859-15 <> LOCALCODE conversion. As the mess that is makefile can't properly support it at the moment, it is only available for MACOSX. Windows doesn't need FS conversion and I have no idea about OS/2 so it's disabled for them.
Darkvater
parents: 3033
diff changeset
  1311
	env = getenv("LC_ALL");
992d1f7cb747 (svn r4105) - Feature: Add proper ISO-8859-15 <> LOCALCODE conversion. As the mess that is makefile can't properly support it at the moment, it is only available for MACOSX. Windows doesn't need FS conversion and I have no idea about OS/2 so it's disabled for them.
Darkvater
parents: 3033
diff changeset
  1312
	if (env != NULL) return env;
992d1f7cb747 (svn r4105) - Feature: Add proper ISO-8859-15 <> LOCALCODE conversion. As the mess that is makefile can't properly support it at the moment, it is only available for MACOSX. Windows doesn't need FS conversion and I have no idea about OS/2 so it's disabled for them.
Darkvater
parents: 3033
diff changeset
  1313
992d1f7cb747 (svn r4105) - Feature: Add proper ISO-8859-15 <> LOCALCODE conversion. As the mess that is makefile can't properly support it at the moment, it is only available for MACOSX. Windows doesn't need FS conversion and I have no idea about OS/2 so it's disabled for them.
Darkvater
parents: 3033
diff changeset
  1314
	if (param != NULL) {
992d1f7cb747 (svn r4105) - Feature: Add proper ISO-8859-15 <> LOCALCODE conversion. As the mess that is makefile can't properly support it at the moment, it is only available for MACOSX. Windows doesn't need FS conversion and I have no idea about OS/2 so it's disabled for them.
Darkvater
parents: 3033
diff changeset
  1315
		env = getenv(param);
992d1f7cb747 (svn r4105) - Feature: Add proper ISO-8859-15 <> LOCALCODE conversion. As the mess that is makefile can't properly support it at the moment, it is only available for MACOSX. Windows doesn't need FS conversion and I have no idea about OS/2 so it's disabled for them.
Darkvater
parents: 3033
diff changeset
  1316
		if (env != NULL) return env;
992d1f7cb747 (svn r4105) - Feature: Add proper ISO-8859-15 <> LOCALCODE conversion. As the mess that is makefile can't properly support it at the moment, it is only available for MACOSX. Windows doesn't need FS conversion and I have no idea about OS/2 so it's disabled for them.
Darkvater
parents: 3033
diff changeset
  1317
	}
992d1f7cb747 (svn r4105) - Feature: Add proper ISO-8859-15 <> LOCALCODE conversion. As the mess that is makefile can't properly support it at the moment, it is only available for MACOSX. Windows doesn't need FS conversion and I have no idea about OS/2 so it's disabled for them.
Darkvater
parents: 3033
diff changeset
  1318
992d1f7cb747 (svn r4105) - Feature: Add proper ISO-8859-15 <> LOCALCODE conversion. As the mess that is makefile can't properly support it at the moment, it is only available for MACOSX. Windows doesn't need FS conversion and I have no idea about OS/2 so it's disabled for them.
Darkvater
parents: 3033
diff changeset
  1319
	return getenv("LANG");
992d1f7cb747 (svn r4105) - Feature: Add proper ISO-8859-15 <> LOCALCODE conversion. As the mess that is makefile can't properly support it at the moment, it is only available for MACOSX. Windows doesn't need FS conversion and I have no idea about OS/2 so it's disabled for them.
Darkvater
parents: 3033
diff changeset
  1320
}
10254
14e7c7ada607 (svn r12786) -Change: remove more function from functions.h.
rubidium
parents: 10250
diff changeset
  1321
#else
14e7c7ada607 (svn r12786) -Change: remove more function from functions.h.
rubidium
parents: 10250
diff changeset
  1322
const char *GetCurrentLocale(const char *param);
7931
855327e1ab53 (svn r10851) -Feature [OSX]: OpenTTD will now pick the same language as finder is set to if no config file is found (ln-)
bjarni
parents: 7918
diff changeset
  1323
#endif /* !(defined(WIN32) || defined(__APPLE__)) */
3329
992d1f7cb747 (svn r4105) - Feature: Add proper ISO-8859-15 <> LOCALCODE conversion. As the mess that is makefile can't properly support it at the moment, it is only available for MACOSX. Windows doesn't need FS conversion and I have no idea about OS/2 so it's disabled for them.
Darkvater
parents: 3033
diff changeset
  1324
7289
d6a004877931 (svn r10032) -Add: sort the strings in server language dropdown
glx
parents: 7139
diff changeset
  1325
int CDECL StringIDSorter(const void *a, const void *b)
d6a004877931 (svn r10032) -Add: sort the strings in server language dropdown
glx
parents: 7139
diff changeset
  1326
{
d6a004877931 (svn r10032) -Add: sort the strings in server language dropdown
glx
parents: 7139
diff changeset
  1327
	const StringID va = *(const StringID*)a;
d6a004877931 (svn r10032) -Add: sort the strings in server language dropdown
glx
parents: 7139
diff changeset
  1328
	const StringID vb = *(const StringID*)b;
d6a004877931 (svn r10032) -Add: sort the strings in server language dropdown
glx
parents: 7139
diff changeset
  1329
	char stra[512];
d6a004877931 (svn r10032) -Add: sort the strings in server language dropdown
glx
parents: 7139
diff changeset
  1330
	char strb[512];
d6a004877931 (svn r10032) -Add: sort the strings in server language dropdown
glx
parents: 7139
diff changeset
  1331
	GetString(stra, va, lastof(stra));
d6a004877931 (svn r10032) -Add: sort the strings in server language dropdown
glx
parents: 7139
diff changeset
  1332
	GetString(strb, vb, lastof(strb));
d6a004877931 (svn r10032) -Add: sort the strings in server language dropdown
glx
parents: 7139
diff changeset
  1333
d6a004877931 (svn r10032) -Add: sort the strings in server language dropdown
glx
parents: 7139
diff changeset
  1334
	return strcmp(stra, strb);
d6a004877931 (svn r10032) -Add: sort the strings in server language dropdown
glx
parents: 7139
diff changeset
  1335
}
d6a004877931 (svn r10032) -Add: sort the strings in server language dropdown
glx
parents: 7139
diff changeset
  1336
6646
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1337
/**
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1338
 * Checks whether the given language is already found.
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1339
 * @param langs    languages we've found so fa
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1340
 * @param max      the length of the language list
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1341
 * @param language name of the language to check
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1342
 * @return true if and only if a language file with the same name has not been found
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1343
 */
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1344
static bool UniqueLanguageFile(const Language *langs, uint max, const char *language)
4219
4211284f29ec (svn r5763) - Cleanup: Move the now unified GetLanguageList and comparator function to strings.c where it belongs.
Darkvater
parents: 4120
diff changeset
  1345
{
6646
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1346
	for (uint i = 0; i < max; i++) {
6670
86c087999542 (svn r9373) -Fix (r9271): the chosen language was not stored nor read properly in/from the cfg.
rubidium
parents: 6646
diff changeset
  1347
		const char *f_name = strrchr(langs[i].file, PATHSEPCHAR) + 1;
6646
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1348
		if (strcmp(f_name, language) == 0) return false; // duplicates
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1349
	}
4219
4211284f29ec (svn r5763) - Cleanup: Move the now unified GetLanguageList and comparator function to strings.c where it belongs.
Darkvater
parents: 4120
diff changeset
  1350
6646
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1351
	return true;
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1352
}
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1353
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1354
/**
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1355
 * Reads the language file header and checks compatability.
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1356
 * @param file the file to read
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1357
 * @param hdr  the place to write the header information to
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1358
 * @return true if and only if the language file is of a compatible version
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1359
 */
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1360
static bool GetLanguageFileHeader(const char *file, LanguagePack *hdr)
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1361
{
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1362
	FILE *f = fopen(file, "rb");
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1363
	if (f == NULL) return false;
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1364
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1365
	size_t read = fread(hdr, sizeof(*hdr), 1, f);
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1366
	fclose(f);
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1367
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1368
	return read == 1 &&
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1369
			hdr->ident == TO_LE32(LANGUAGE_PACK_IDENT) &&
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1370
			hdr->version == TO_LE32(LANGUAGE_PACK_VERSION);
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1371
}
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1372
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1373
/**
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1374
 * Gets a list of languages from the given directory.
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1375
 * @param langs the list to write to
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1376
 * @param start the initial offset in the list
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1377
 * @param max   the length of the language list
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1378
 * @param path  the base directory to search in
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1379
 * @return the number of added languages
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1380
 */
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1381
static int GetLanguageList(Language *langs, int start, int max, const char *path)
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1382
{
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1383
	int i = start;
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1384
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1385
	DIR *dir = ttd_opendir(path);
4219
4211284f29ec (svn r5763) - Cleanup: Move the now unified GetLanguageList and comparator function to strings.c where it belongs.
Darkvater
parents: 4120
diff changeset
  1386
	if (dir != NULL) {
6646
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1387
		struct dirent *dirent;
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1388
		while ((dirent = readdir(dir)) != NULL && i < max) {
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1389
			const char *d_name    = FS2OTTD(dirent->d_name);
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1390
			const char *extension = strrchr(d_name, '.');
4219
4211284f29ec (svn r5763) - Cleanup: Move the now unified GetLanguageList and comparator function to strings.c where it belongs.
Darkvater
parents: 4120
diff changeset
  1391
6646
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1392
			/* Not a language file */
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1393
			if (extension == NULL || strcmp(extension, ".lng") != 0) continue;
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1394
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1395
			/* Filter any duplicate language-files, first-come first-serve */
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1396
			if (!UniqueLanguageFile(langs, i, d_name)) continue;
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1397
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1398
			langs[i].file = str_fmt("%s%s", path, d_name);
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1399
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1400
			/* Check whether the file is of the correct version */
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1401
			LanguagePack hdr;
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1402
			if (!GetLanguageFileHeader(langs[i].file, &hdr)) {
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1403
				free(langs[i].file);
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1404
				continue;
4219
4211284f29ec (svn r5763) - Cleanup: Move the now unified GetLanguageList and comparator function to strings.c where it belongs.
Darkvater
parents: 4120
diff changeset
  1405
			}
6646
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1406
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1407
			i++;
4219
4211284f29ec (svn r5763) - Cleanup: Move the now unified GetLanguageList and comparator function to strings.c where it belongs.
Darkvater
parents: 4120
diff changeset
  1408
		}
4211284f29ec (svn r5763) - Cleanup: Move the now unified GetLanguageList and comparator function to strings.c where it belongs.
Darkvater
parents: 4120
diff changeset
  1409
		closedir(dir);
4211284f29ec (svn r5763) - Cleanup: Move the now unified GetLanguageList and comparator function to strings.c where it belongs.
Darkvater
parents: 4120
diff changeset
  1410
	}
6646
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1411
	return i - start;
4219
4211284f29ec (svn r5763) - Cleanup: Move the now unified GetLanguageList and comparator function to strings.c where it belongs.
Darkvater
parents: 4120
diff changeset
  1412
}
4211284f29ec (svn r5763) - Cleanup: Move the now unified GetLanguageList and comparator function to strings.c where it belongs.
Darkvater
parents: 4120
diff changeset
  1413
6646
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1414
/**
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1415
 * Make a list of the available language packs. put the data in
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1416
 * _dynlang struct.
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1417
 */
6573
7624f942237f (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6484
diff changeset
  1418
void InitializeLanguagePacks()
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1419
{
7425
350b9265b7a2 (svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents: 7394
diff changeset
  1420
	Searchpath sp;
6646
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1421
	Language files[MAX_LANG];
7425
350b9265b7a2 (svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents: 7394
diff changeset
  1422
	uint language_count = 0;
350b9265b7a2 (svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents: 7394
diff changeset
  1423
350b9265b7a2 (svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents: 7394
diff changeset
  1424
	FOR_ALL_SEARCHPATHS(sp) {
350b9265b7a2 (svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents: 7394
diff changeset
  1425
		char path[MAX_PATH];
350b9265b7a2 (svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents: 7394
diff changeset
  1426
		FioAppendDirectory(path, lengthof(path), sp, LANG_DIR);
350b9265b7a2 (svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents: 7394
diff changeset
  1427
		language_count += GetLanguageList(files, language_count, lengthof(files), path);
350b9265b7a2 (svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents: 7394
diff changeset
  1428
	}
6646
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1429
	if (language_count == 0) error("No available language packs (invalid versions?)");
2257
9cf0a4b8eadb (svn r2777) -Feature: When starting without a config file determine the language on basis of the current locale
tron
parents: 2201
diff changeset
  1430
6646
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1431
	/* Acquire the locale of the current system */
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1432
	const char *lang = GetCurrentLocale("LC_MESSAGES");
4505
f87e0c7fdda1 (svn r6290) -Feature: When automatically detecting the language try to first match language+territory (e.g. de_CH), then just language (e.g. de) and fall back to en_GB otherwise
tron
parents: 4503
diff changeset
  1433
	if (lang == NULL) lang = "en_GB";
2257
9cf0a4b8eadb (svn r2777) -Feature: When starting without a config file determine the language on basis of the current locale
tron
parents: 2201
diff changeset
  1434
6646
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1435
	int chosen_language   = -1; ///< Matching the language in the configuartion file or the current locale
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1436
	int language_fallback = -1; ///< Using pt_PT for pt_BR locale when pt_BR is not available
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1437
	int en_GB_fallback    =  0; ///< Fallback when no locale-matching language has been found
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1438
6646
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1439
	DynamicLanguages *dl = &_dynlang;
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1440
	dl->num = 0;
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1441
	/* Fill the dynamic languages structures */
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1442
	for (uint i = 0; i < language_count; i++) {
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1443
		/* File read the language header */
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1444
		LanguagePack hdr;
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1445
		if (!GetLanguageFileHeader(files[i].file, &hdr)) continue;
1321
938ec22ae6f7 (svn r1825) Further style improvements:
tron
parents: 1319
diff changeset
  1446
6646
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1447
		dl->ent[dl->num].file = files[i].file;
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1448
		dl->ent[dl->num].name = strdup(hdr.name);
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1449
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1450
		/* We are trying to find a default language. The priority is by
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1451
		 * configuration file, local environment and last, if nothing found,
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1452
		 * english. If def equals -1, we have not picked a default language */
6670
86c087999542 (svn r9373) -Fix (r9271): the chosen language was not stored nor read properly in/from the cfg.
rubidium
parents: 6646
diff changeset
  1453
		const char *lang_file = strrchr(dl->ent[dl->num].file, PATHSEPCHAR) + 1;
86c087999542 (svn r9373) -Fix (r9271): the chosen language was not stored nor read properly in/from the cfg.
rubidium
parents: 6646
diff changeset
  1454
		if (strcmp(lang_file, dl->curr_file) == 0) chosen_language = dl->num;
6646
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1455
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1456
		if (chosen_language == -1) {
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1457
			if (strcmp (hdr.isocode, "en_GB") == 0) en_GB_fallback    = dl->num;
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1458
			if (strncmp(hdr.isocode, lang, 5) == 0) chosen_language   = dl->num;
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1459
			if (strncmp(hdr.isocode, lang, 2) == 0) language_fallback = dl->num;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1460
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1461
6646
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1462
		dl->num++;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1463
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1464
6646
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1465
	if (dl->num == 0) error("Invalid version of language packs");
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1466
6646
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1467
	/* We haven't found the language in the config nor the one in the locale.
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1468
	 * Now we set it to one of the fallback languages */
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1469
	if (chosen_language == -1) {
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1470
		chosen_language = (language_fallback != -1) ? language_fallback : en_GB_fallback;
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1471
	}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1472
6646
0e3b3d315288 (svn r9271) -Codechange: make the language pack initialisation a little more clear and extendable (more language paths).
rubidium
parents: 6574
diff changeset
  1473
	if (!ReadLanguagePack(chosen_language)) error("Can't read language pack '%s'", dl->ent[chosen_language].file);
2075
7f0ca01392db (svn r2585) - Fix [Makefile]: some small cleanups, remove warnings, and add mersenne to makefile (Luca)
Darkvater
parents: 2070
diff changeset
  1474
}
8581
8e4e36a205fe (svn r11646) -Codechange: check whether (some) characters are missing in the current 'font' for the 'currently' chosen language and give a warning when that does happen.
rubidium
parents: 8450
diff changeset
  1475
8e4e36a205fe (svn r11646) -Codechange: check whether (some) characters are missing in the current 'font' for the 'currently' chosen language and give a warning when that does happen.
rubidium
parents: 8450
diff changeset
  1476
/**
8e4e36a205fe (svn r11646) -Codechange: check whether (some) characters are missing in the current 'font' for the 'currently' chosen language and give a warning when that does happen.
rubidium
parents: 8450
diff changeset
  1477
 * Check whether the currently loaded language pack
8e4e36a205fe (svn r11646) -Codechange: check whether (some) characters are missing in the current 'font' for the 'currently' chosen language and give a warning when that does happen.
rubidium
parents: 8450
diff changeset
  1478
 * uses characters that the currently loaded font
8e4e36a205fe (svn r11646) -Codechange: check whether (some) characters are missing in the current 'font' for the 'currently' chosen language and give a warning when that does happen.
rubidium
parents: 8450
diff changeset
  1479
 * does not support. If this is the case an error
8e4e36a205fe (svn r11646) -Codechange: check whether (some) characters are missing in the current 'font' for the 'currently' chosen language and give a warning when that does happen.
rubidium
parents: 8450
diff changeset
  1480
 * message will be shown in English. The error
8e4e36a205fe (svn r11646) -Codechange: check whether (some) characters are missing in the current 'font' for the 'currently' chosen language and give a warning when that does happen.
rubidium
parents: 8450
diff changeset
  1481
 * message will not be localized because that would
8e4e36a205fe (svn r11646) -Codechange: check whether (some) characters are missing in the current 'font' for the 'currently' chosen language and give a warning when that does happen.
rubidium
parents: 8450
diff changeset
  1482
 * mean it might use characters that are not in the
8e4e36a205fe (svn r11646) -Codechange: check whether (some) characters are missing in the current 'font' for the 'currently' chosen language and give a warning when that does happen.
rubidium
parents: 8450
diff changeset
  1483
 * font, which is the whole reason this check has
8e4e36a205fe (svn r11646) -Codechange: check whether (some) characters are missing in the current 'font' for the 'currently' chosen language and give a warning when that does happen.
rubidium
parents: 8450
diff changeset
  1484
 * been added.
8e4e36a205fe (svn r11646) -Codechange: check whether (some) characters are missing in the current 'font' for the 'currently' chosen language and give a warning when that does happen.
rubidium
parents: 8450
diff changeset
  1485
 */
8e4e36a205fe (svn r11646) -Codechange: check whether (some) characters are missing in the current 'font' for the 'currently' chosen language and give a warning when that does happen.
rubidium
parents: 8450
diff changeset
  1486
void CheckForMissingGlyphsInLoadedLanguagePack()
8e4e36a205fe (svn r11646) -Codechange: check whether (some) characters are missing in the current 'font' for the 'currently' chosen language and give a warning when that does happen.
rubidium
parents: 8450
diff changeset
  1487
{
8697
8087ef158f01 (svn r11764) -Change: make the 'do characters exist in the current font file(s)' more robust.
rubidium
parents: 8640
diff changeset
  1488
	const Sprite *question_mark = GetGlyph(FS_NORMAL, '?');
8087ef158f01 (svn r11764) -Change: make the 'do characters exist in the current font file(s)' more robust.
rubidium
parents: 8640
diff changeset
  1489
8581
8e4e36a205fe (svn r11646) -Codechange: check whether (some) characters are missing in the current 'font' for the 'currently' chosen language and give a warning when that does happen.
rubidium
parents: 8450
diff changeset
  1490
	for (uint i = 0; i != 32; i++) {
8e4e36a205fe (svn r11646) -Codechange: check whether (some) characters are missing in the current 'font' for the 'currently' chosen language and give a warning when that does happen.
rubidium
parents: 8450
diff changeset
  1491
		for (uint j = 0; j < _langtab_num[i]; j++) {
8e4e36a205fe (svn r11646) -Codechange: check whether (some) characters are missing in the current 'font' for the 'currently' chosen language and give a warning when that does happen.
rubidium
parents: 8450
diff changeset
  1492
			const char *string = _langpack_offs[_langtab_start[i] + j];
8e4e36a205fe (svn r11646) -Codechange: check whether (some) characters are missing in the current 'font' for the 'currently' chosen language and give a warning when that does happen.
rubidium
parents: 8450
diff changeset
  1493
			WChar c;
8e4e36a205fe (svn r11646) -Codechange: check whether (some) characters are missing in the current 'font' for the 'currently' chosen language and give a warning when that does happen.
rubidium
parents: 8450
diff changeset
  1494
			while ((c = Utf8Consume(&string)) != '\0') {
8e4e36a205fe (svn r11646) -Codechange: check whether (some) characters are missing in the current 'font' for the 'currently' chosen language and give a warning when that does happen.
rubidium
parents: 8450
diff changeset
  1495
				if (c == SCC_SETX) {
8e4e36a205fe (svn r11646) -Codechange: check whether (some) characters are missing in the current 'font' for the 'currently' chosen language and give a warning when that does happen.
rubidium
parents: 8450
diff changeset
  1496
					/*
8e4e36a205fe (svn r11646) -Codechange: check whether (some) characters are missing in the current 'font' for the 'currently' chosen language and give a warning when that does happen.
rubidium
parents: 8450
diff changeset
  1497
					 * SetX is, together with SetXY as special character that
8e4e36a205fe (svn r11646) -Codechange: check whether (some) characters are missing in the current 'font' for the 'currently' chosen language and give a warning when that does happen.
rubidium
parents: 8450
diff changeset
  1498
					 * uses the next (two) characters as data points. We have
8e4e36a205fe (svn r11646) -Codechange: check whether (some) characters are missing in the current 'font' for the 'currently' chosen language and give a warning when that does happen.
rubidium
parents: 8450
diff changeset
  1499
					 * to skip those, otherwise the UTF8 reading will go
8e4e36a205fe (svn r11646) -Codechange: check whether (some) characters are missing in the current 'font' for the 'currently' chosen language and give a warning when that does happen.
rubidium
parents: 8450
diff changeset
  1500
					 * haywire.
8e4e36a205fe (svn r11646) -Codechange: check whether (some) characters are missing in the current 'font' for the 'currently' chosen language and give a warning when that does happen.
rubidium
parents: 8450
diff changeset
  1501
					 */
8e4e36a205fe (svn r11646) -Codechange: check whether (some) characters are missing in the current 'font' for the 'currently' chosen language and give a warning when that does happen.
rubidium
parents: 8450
diff changeset
  1502
					string++;
8e4e36a205fe (svn r11646) -Codechange: check whether (some) characters are missing in the current 'font' for the 'currently' chosen language and give a warning when that does happen.
rubidium
parents: 8450
diff changeset
  1503
				} else if (c == SCC_SETXY) {
8e4e36a205fe (svn r11646) -Codechange: check whether (some) characters are missing in the current 'font' for the 'currently' chosen language and give a warning when that does happen.
rubidium
parents: 8450
diff changeset
  1504
					string += 2;
8697
8087ef158f01 (svn r11764) -Change: make the 'do characters exist in the current font file(s)' more robust.
rubidium
parents: 8640
diff changeset
  1505
				} else if (IsPrintable(c) && c != '?' && GetGlyph(FS_NORMAL, c) == question_mark) {
8581
8e4e36a205fe (svn r11646) -Codechange: check whether (some) characters are missing in the current 'font' for the 'currently' chosen language and give a warning when that does happen.
rubidium
parents: 8450
diff changeset
  1506
					/*
8e4e36a205fe (svn r11646) -Codechange: check whether (some) characters are missing in the current 'font' for the 'currently' chosen language and give a warning when that does happen.
rubidium
parents: 8450
diff changeset
  1507
					 * The character is printable, but not in the normal font.
8e4e36a205fe (svn r11646) -Codechange: check whether (some) characters are missing in the current 'font' for the 'currently' chosen language and give a warning when that does happen.
rubidium
parents: 8450
diff changeset
  1508
					 * This is the case we were testing for. In this case we
8e4e36a205fe (svn r11646) -Codechange: check whether (some) characters are missing in the current 'font' for the 'currently' chosen language and give a warning when that does happen.
rubidium
parents: 8450
diff changeset
  1509
					 * have to show the error. As we do not want the string to
8e4e36a205fe (svn r11646) -Codechange: check whether (some) characters are missing in the current 'font' for the 'currently' chosen language and give a warning when that does happen.
rubidium
parents: 8450
diff changeset
  1510
					 * be translated by the translators, we 'force' it into the
8e4e36a205fe (svn r11646) -Codechange: check whether (some) characters are missing in the current 'font' for the 'currently' chosen language and give a warning when that does happen.
rubidium
parents: 8450
diff changeset
  1511
					 * binary and 'load' it via a BindCString. To do this
8e4e36a205fe (svn r11646) -Codechange: check whether (some) characters are missing in the current 'font' for the 'currently' chosen language and give a warning when that does happen.
rubidium
parents: 8450
diff changeset
  1512
					 * properly we have to set the color of the string,
8e4e36a205fe (svn r11646) -Codechange: check whether (some) characters are missing in the current 'font' for the 'currently' chosen language and give a warning when that does happen.
rubidium
parents: 8450
diff changeset
  1513
					 * otherwise we end up with a lot of artefacts. The color
8e4e36a205fe (svn r11646) -Codechange: check whether (some) characters are missing in the current 'font' for the 'currently' chosen language and give a warning when that does happen.
rubidium
parents: 8450
diff changeset
  1514
					 * 'character' might change in the future, so for safety
8e4e36a205fe (svn r11646) -Codechange: check whether (some) characters are missing in the current 'font' for the 'currently' chosen language and give a warning when that does happen.
rubidium
parents: 8450
diff changeset
  1515
					 * we just Utf8 Encode it into the string, which takes
8e4e36a205fe (svn r11646) -Codechange: check whether (some) characters are missing in the current 'font' for the 'currently' chosen language and give a warning when that does happen.
rubidium
parents: 8450
diff changeset
  1516
					 * exactly three characters, so it replaces the "XXX" with
8e4e36a205fe (svn r11646) -Codechange: check whether (some) characters are missing in the current 'font' for the 'currently' chosen language and give a warning when that does happen.
rubidium
parents: 8450
diff changeset
  1517
					 * the color marker.
8e4e36a205fe (svn r11646) -Codechange: check whether (some) characters are missing in the current 'font' for the 'currently' chosen language and give a warning when that does happen.
rubidium
parents: 8450
diff changeset
  1518
					 */
8698
3968b1da2966 (svn r11765) -Fix: compile warning (Roujin).
rubidium
parents: 8697
diff changeset
  1519
					static char *err_str = strdup("XXXThe current font is missing some of the characters used in the texts for this language. Read the readme to see how to solve this.");
8581
8e4e36a205fe (svn r11646) -Codechange: check whether (some) characters are missing in the current 'font' for the 'currently' chosen language and give a warning when that does happen.
rubidium
parents: 8450
diff changeset
  1520
					Utf8Encode(err_str, SCC_YELLOW);
8e4e36a205fe (svn r11646) -Codechange: check whether (some) characters are missing in the current 'font' for the 'currently' chosen language and give a warning when that does happen.
rubidium
parents: 8450
diff changeset
  1521
					StringID err_msg = BindCString(err_str);
8e4e36a205fe (svn r11646) -Codechange: check whether (some) characters are missing in the current 'font' for the 'currently' chosen language and give a warning when that does happen.
rubidium
parents: 8450
diff changeset
  1522
					ShowErrorMessage(INVALID_STRING_ID, err_msg, 0, 0);
8e4e36a205fe (svn r11646) -Codechange: check whether (some) characters are missing in the current 'font' for the 'currently' chosen language and give a warning when that does happen.
rubidium
parents: 8450
diff changeset
  1523
					return;
8e4e36a205fe (svn r11646) -Codechange: check whether (some) characters are missing in the current 'font' for the 'currently' chosen language and give a warning when that does happen.
rubidium
parents: 8450
diff changeset
  1524
				}
8e4e36a205fe (svn r11646) -Codechange: check whether (some) characters are missing in the current 'font' for the 'currently' chosen language and give a warning when that does happen.
rubidium
parents: 8450
diff changeset
  1525
			}
8e4e36a205fe (svn r11646) -Codechange: check whether (some) characters are missing in the current 'font' for the 'currently' chosen language and give a warning when that does happen.
rubidium
parents: 8450
diff changeset
  1526
		}
8e4e36a205fe (svn r11646) -Codechange: check whether (some) characters are missing in the current 'font' for the 'currently' chosen language and give a warning when that does happen.
rubidium
parents: 8450
diff changeset
  1527
	}
8e4e36a205fe (svn r11646) -Codechange: check whether (some) characters are missing in the current 'font' for the 'currently' chosen language and give a warning when that does happen.
rubidium
parents: 8450
diff changeset
  1528
}
10250
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1529
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1530
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1531
/* --- Handling of saving/loading string IDs from old savegames --- */
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1532
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1533
/**
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1534
 * Remap a string ID from the old format to the new format
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1535
 * @param s StringID that requires remapping
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1536
 * @return translated ID
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1537
 */
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1538
StringID RemapOldStringID(StringID s)
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1539
{
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1540
	switch (s) {
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1541
		case 0x0006: return STR_SV_EMPTY;
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1542
		case 0x7000: return STR_SV_UNNAMED;
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1543
		case 0x70E4: return SPECSTR_PLAYERNAME_ENGLISH;
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1544
		case 0x70E9: return SPECSTR_PLAYERNAME_ENGLISH;
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1545
		case 0x8864: return STR_SV_TRAIN_NAME;
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1546
		case 0x902B: return STR_SV_ROADVEH_NAME;
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1547
		case 0x9830: return STR_SV_SHIP_NAME;
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1548
		case 0xA02F: return STR_SV_AIRCRAFT_NAME;
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1549
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1550
		default:
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1551
			if (IsInsideMM(s, 0x300F, 0x3030)) {
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1552
				return s - 0x300F + STR_SV_STNAME;
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1553
			} else {
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1554
				return s;
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1555
			}
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1556
	}
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1557
}
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1558
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1559
/** Location to load the old names to. */
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1560
char *_old_name_array = NULL;
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1561
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1562
/**
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1563
 * Copy and convert old custom names to UTF-8.
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1564
 * They were all stored in a 512 by 32 long string array and are
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1565
 * now stored with stations, waypoints and other places with names.
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1566
 * @param id the StringID of the custom name to clone.
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1567
 * @return the clones custom name.
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1568
 */
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1569
char *CopyFromOldName(StringID id)
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1570
{
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1571
	/* Is this name an (old) custom name? */
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1572
	if (GB(id, 11, 5) != 15) return NULL;
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1573
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1574
	if (CheckSavegameVersion(37)) {
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1575
		/* Old names were 32 characters long, so 128 characters should be
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1576
		 * plenty to allow for expansion when converted to UTF-8. */
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1577
		char tmp[128];
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1578
		const char *strfrom = &_old_name_array[32 * GB(id, 0, 9)];
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1579
		char *strto = tmp;
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1580
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1581
		for (; *strfrom != '\0'; strfrom++) {
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1582
			WChar c = (byte)*strfrom;
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1583
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1584
			/* Map from non-ISO8859-15 characters to UTF-8. */
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1585
			switch (c) {
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1586
				case 0xA4: c = 0x20AC; break; // Euro
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1587
				case 0xA6: c = 0x0160; break; // S with caron
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1588
				case 0xA8: c = 0x0161; break; // s with caron
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1589
				case 0xB4: c = 0x017D; break; // Z with caron
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1590
				case 0xB8: c = 0x017E; break; // z with caron
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1591
				case 0xBC: c = 0x0152; break; // OE ligature
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1592
				case 0xBD: c = 0x0153; break; // oe ligature
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1593
				case 0xBE: c = 0x0178; break; // Y with diaresis
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1594
				default: break;
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1595
			}
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1596
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1597
			/* Check character will fit into our buffer. */
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1598
			if (strto + Utf8CharLen(c) > lastof(tmp)) break;
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1599
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1600
			strto += Utf8Encode(strto, c);
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1601
		}
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1602
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1603
		/* Terminate the new string and copy it back to the name array */
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1604
		*strto = '\0';
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1605
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1606
		return strdup(tmp);
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1607
	} else {
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1608
		/* Name will already be in UTF-8. */
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1609
		return strdup(&_old_name_array[32 * GB(id, 0, 9)]);
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1610
	}
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1611
}
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1612
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1613
/**
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1614
 * Free the memory of the old names array.
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1615
 * Should be called once the old names have all been converted.
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1616
 */
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1617
void ResetOldNames()
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1618
{
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1619
	free(_old_name_array);
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1620
	_old_name_array = NULL;
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1621
}
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1622
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1623
/**
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1624
 * Initialize the old names table memory.
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1625
 */
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1626
void InitializeOldNames()
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1627
{
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1628
	free(_old_name_array);
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1629
	_old_name_array = CallocT<char>(512 * 32);
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1630
}
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1631
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1632
static void Load_NAME()
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1633
{
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1634
	int index;
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1635
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1636
	while ((index = SlIterateArray()) != -1) {
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1637
		SlArray(&_old_name_array[32 * index], SlGetFieldLength(), SLE_UINT8);
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1638
	}
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1639
}
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1640
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1641
extern const ChunkHandler _name_chunk_handlers[] = {
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1642
	{ 'NAME', NULL, Load_NAME, CH_ARRAY | CH_LAST},
e64ee7484b43 (svn r12782) -Codechange: remove some functions from functions.h and do not statically 'waste' memory when the old name array is not needed anymore.
rubidium
parents: 10229
diff changeset
  1643
};