format
#1

Сделал функцию работающую по принципу 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 startend -= 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(pathstring);
        return 
true;
    }
    
    
Log_Write(pathstr);
    return 
true;

Вызов:
PHP код:
GM:I("Gamemode successfully started for %d ms."GetTickCount() - count); 
На выходе мы имеем:
PHP код:
InfoGamemode 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 startend -= 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(pathstring);
        return 
true;
    }
    
    print(
"3");    
    
Log_Write(pathstr);
    return 
true;

Результат:
PHP код:
1

Так же функцию вызвал на прямую без макроса, результат тот же.
Reply
#2

Странная у тебя функция...

PHP код:
#define BYTES_PER_CELL            4

stock Log_Gamemode(const path[], const str[], {Float,_}:...)
{
    static const 
STATIC_ARGS 2;
    new 
= (numargs() - STATIC_ARGS) * BYTES_PER_CELL;
    if (
n)
    {
        new 
message[144], arg_startarg_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

        
+= BYTES_PER_CELL 3;
        
#emit PUSH.S            n
        #emit SYSREQ.C            format

        
+= BYTES_PER_CELL;
        
#emit LCTRL                4
        #emit LOAD.S.alt        n
        #emit ADD
        #emit SCTRL                4

        
Log_Write(pathmessage);
    }
    else
    {
        
Log_Write(pathstr);
    }
    return 
1;

Reply
#3

Quote:
Originally Posted by ZiGGi
Посмотреть сообщение
Странная у тебя функция...
У Emmet_ по-заимствовал алгоритм.

Сейчас на твоем примере попробую.

UPD: Спасибо за функцию, рабочая.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)