diff -r 29357016f374 -r 9119726e22bc hedgewars/uLocale.pas --- a/hedgewars/uLocale.pas Tue Feb 20 22:21:33 2018 +0100 +++ b/hedgewars/uLocale.pas Wed Feb 21 02:37:01 2018 +0100 @@ -23,10 +23,13 @@ uses uTypes; const MAX_EVENT_STRINGS = 255; +const MAX_FORMAT_STRING_SYMBOLS = 9; procedure LoadLocale(FileName: shortstring); -function Format(fmt: shortstring; var arg: shortstring): shortstring; -function FormatA(fmt: ansistring; var arg: ansistring): ansistring; +function Format(fmt: shortstring; args: array of shortstring): shortstring; +function FormatA(fmt: ansistring; args: array of ansistring): ansistring; +function Format(fmt: shortstring; arg: shortstring): shortstring; +function FormatA(fmt: ansistring; arg: ansistring): ansistring; function GetEventString(e: TEventId): ansistring; {$IFDEF HWLIBRARY} @@ -113,24 +116,61 @@ GetEventString:= trevt[e][GetRandom(trevt_n[e])]; // Pick a random message and return it end; -function Format(fmt: shortstring; var arg: shortstring): shortstring; -var i: LongInt; +// Format the string fmt. +// Take a shortstring with placeholders %1, %2, %3, etc. and replace +// them with the corresponding elements of an array with up to +// MAX_FORMAT_STRING_SYMBOLS. Important! Each placeholder can only be +// used exactly once and numbers MUST NOT be skipped (e.g. using %1 and %3 +// but not %2. +function Format(fmt: shortstring; args: array of shortstring): shortstring; +var i, p: LongInt; +tempstr: shortstring; begin -i:= Pos('%1', fmt); -if i = 0 then - Format:= fmt -else - Format:= copy(fmt, 1, i - 1) + arg + Format(copy(fmt, i + 2, Length(fmt) - i - 1), arg) +tempstr:= fmt; +for i:=0 to MAX_FORMAT_STRING_SYMBOLS - 1 do + begin + p:= Pos('%'+IntToStr(i), tempstr); + if (p = 0) or (i >= Length(args)) then + break + else + begin + delete(tempstr, p, 2); + insert(args[i], tempstr, p); + end; + end; +Format:= tempstr; end; -function FormatA(fmt: ansistring; var arg: ansistring): ansistring; -var i: LongInt; +// Same as Format, but for ansistring +function FormatA(fmt: ansistring; args: array of ansistring): ansistring; +var i, p: LongInt; +tempstr: ansistring; begin -i:= Pos('%1', fmt); -if i = 0 then - FormatA:= fmt -else - FormatA:= copy(fmt, 1, i - 1) + arg + FormatA(copy(fmt, i + 2, Length(fmt) - i - 1), arg) +tempstr:= fmt; +for i:=0 to MAX_FORMAT_STRING_SYMBOLS - 1 do + begin + p:= Pos('%'+IntToStr(i+1), tempstr); + if (p = 0) or (i >= Length(args)) then + break + else + begin + delete(tempstr, p, 2); + insert(args[i], tempstr, p); + end; + end; +FormatA:= tempstr; +end; + +// Same as Format above, but with only one placeholder %1, replaced by arg. +function Format(fmt: shortstring; arg: shortstring): shortstring; +begin + Format:= Format(fmt, [arg]); +end; + +// Same as above, but for ansistring +function FormatA(fmt: ansistring; arg: ansistring): ansistring; +begin + FormatA:= FormatA(fmt, [arg]); end; {$IFDEF HWLIBRARY}