Format help
#5

The same as vince showed you,
PHP код:
stock sprintf(const fmat[], {Float_}:...) {
    static 
output[STRLIB_RETURN_SIZE], frm_header[3], heap;
    
    const 
output_size sizeof(output);
    
    if (
ispacked(fmat)) {
        
heap CopyArgumentToHeap(0);
    } else {
        
heap 0;
    }{}
    
    
// Store current frame header
    #emit LCTRL      5
    #emit CONST.alt  frm_header
    #emit MOVS       12
    
    // Change the stack pointer to FRM + 12
    #emit ADD.C    12 // pri is FRM (see above)
    #emit SCTRL    4
    
    // Push sizeof(output)
    #emit PUSH.C      output_size
    
    // Push output
    #emit PUSH.C      output
    
    // Push the argument count
    #emit LOAD.S.pri  8
    #emit ADD.C       8
    #emit PUSH.pri
    
    #if !STRLIB_USE_FORMATEX
        
const formatex 0// Dummy used to avoid "unknown symbol" error
        
        
goto do_sysreq;
    
#endif

    // Call formatex (unless this was skipped above)
    #emit LCTRL       6
    #emit ADD.C       36
    #emit PUSH.pri
    #emit CONST.pri   formatex
    #emit SCTRL       6
    
    #if !STRLIB_USE_FORMATEX
        
do_sysreq:
    
#endif
    
    // Call format (unless formatex was called, in which case this is skipped)
    #emit SYSREQ.C    format
    
    // Restore the stack pointer to FRM
    #emit LCTRL       5
    #emit SCTRL       4
    
    // Copy back the frame header
    #emit MOVE.alt
    #emit CONST.pri   frm_header
    #emit MOVS        12
    
    // Restore heap if needed
    
if (heap) {
        
RestoreHeapToAddress(heap);
    }{}
    
    
// IMPORTANT: Fix compiler bug (returning strings in variadic functions)
    #emit LOAD.S.pri  8
    #emit ADD.C       12
    #emit MOVE.alt
    #emit LCTRL       5
    #emit ADD
    #emit LOAD.I
    #emit STOR.S.pri  20 // 16 + (static_args * 4)
    
    
return output;
    
    
// It is actually used, just not by its symbol name
    #pragma unused fmat

I'm not going to pretend Like I understand how every line works, if you're like me and don't want to bother working with #emit, use this include https://sampforum.blast.hk/showthread.php?tid=362764 , It has lots of useful function, to work with strings, you'll filnd a function sprintf It does what you're looking for.
Reply


Messages In This Thread
Format help - by silverms - 11.09.2017, 08:22
Re: Format help - by Immortal99 - 11.09.2017, 08:28
Re: Format help - by Vince - 11.09.2017, 08:47
Re: Format help - by silverms - 11.09.2017, 08:51
Re: Format help - by Eoussama - 11.09.2017, 09:13
Re: Format help - by silverms - 11.09.2017, 09:15

Forum Jump:


Users browsing this thread: 1 Guest(s)