format -
themakar - 08.05.2016
Сделал функцию работающую по принципу format
Но она не желает обрабатывать передаваемые параметры тексту и попросту игнорирует их.
PHP код:
stock Log_Gamemode(const path[], const str[], {Float,_}:...)
{
new
args,
start,
end,
string[1024]
;
#emit LOAD.S.pri 8
#emit STOR.pri args
if (args > 8)
{
#emit ADDR.pri str
#emit STOR.pri start
for (end = start + (args - 8); end > start; end -= 4)
{
#emit LREF.pri end
#emit PUSH.pri
}
#emit PUSH.S str
#emit PUSH.C 1024
#emit PUSH.C string
#emit PUSH.C args
#emit SYSREQ.C format
#emit LCTRL 5
#emit SCTRL 4
#emit RETN
Log_Write(path, string);
return true;
}
Log_Write(path, str);
return true;
}
Вызов:
PHP код:
GM:I("Gamemode successfully started for %d ms.", GetTickCount() - count);
На выходе мы имеем:
PHP код:
Info: Gamemode successfully started for %d ms.
Макрос вызова:
PHP код:
#define Log_GameI(%1); \
Log_Gamemode(log_path[LOG_GAMEMODE], "Info: " %1);
Сделав дебаг функции
PHP код:
stock Log_Gamemode(const path[], const str[], {Float,_}:...)
{
new
args,
start,
end,
string[1024]
;
#emit LOAD.S.pri 8
#emit STOR.pri args
print("1");
if (args > 8)
{
#emit ADDR.pri str
#emit STOR.pri start
for (end = start + (args - 8); end > start; end -= 4)
{
#emit LREF.pri end
#emit PUSH.pri
}
#emit PUSH.S str
#emit PUSH.C 1024
#emit PUSH.C string
#emit PUSH.C args
#emit SYSREQ.C format
#emit LCTRL 5
#emit SCTRL 4
#emit RETN
print("2");
Log_Write(path, string);
return true;
}
print("3");
Log_Write(path, str);
return true;
}
Результат:
Так же функцию вызвал на прямую без макроса, результат тот же.
Re: format -
ZiGGi - 08.05.2016
Странная у тебя функция...
PHP код:
#define BYTES_PER_CELL 4
stock Log_Gamemode(const path[], const str[], {Float,_}:...)
{
static const STATIC_ARGS = 2;
new n = (numargs() - STATIC_ARGS) * BYTES_PER_CELL;
if (n)
{
new message[144], arg_start, arg_end;
#emit CONST.alt str
#emit LCTRL 5
#emit ADD
#emit STOR.S.pri arg_start
#emit LOAD.S.alt n
#emit ADD
#emit STOR.S.pri arg_end
do
{
#emit LOAD.I
#emit PUSH.pri
arg_end -= BYTES_PER_CELL;
#emit LOAD.S.pri arg_end
}
while(arg_end > arg_start);
#emit PUSH.S str
#emit PUSH.C 144
#emit PUSH.ADR message
n += BYTES_PER_CELL * 3;
#emit PUSH.S n
#emit SYSREQ.C format
n += BYTES_PER_CELL;
#emit LCTRL 4
#emit LOAD.S.alt n
#emit ADD
#emit SCTRL 4
Log_Write(path, message);
}
else
{
Log_Write(path, str);
}
return 1;
}
Re: format -
themakar - 08.05.2016
Quote:
Originally Posted by ZiGGi
Странная у тебя функция...
|
У Emmet_ по-заимствовал алгоритм.
Сейчас на твоем примере попробую.
UPD: Спасибо за функцию, рабочая.