From: uz Date: Sun, 27 Sep 2009 12:11:05 +0000 (+0000) Subject: Added an untested implementation of snprintf. X-Git-Tag: V2.13.0rc1~12 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=067383eb6af5fbca023b0a623805e8407e2393fc;p=cc65 Added an untested implementation of snprintf. git-svn-id: svn://svn.cc65.org/cc65/trunk@4246 b7a2c559-68d2-44c3-8de9-860c34a00d81 --- diff --git a/libsrc/common/Makefile b/libsrc/common/Makefile index 0c6d76851..df3c97277 100644 --- a/libsrc/common/Makefile +++ b/libsrc/common/Makefile @@ -156,6 +156,7 @@ S_OBJS = _cwd.o \ setjmp.o \ signal.o \ sigtable.o \ + snprintf.o \ sprintf.o \ sscanf.o \ strcat.o \ diff --git a/libsrc/common/snprintf.s b/libsrc/common/snprintf.s new file mode 100644 index 000000000..33ce4b1c9 --- /dev/null +++ b/libsrc/common/snprintf.s @@ -0,0 +1,69 @@ +; +; int snprintf (char* buf, size_t size, const char* Format, ...); +; +; Ullrich von Bassewitz, 2009-09-26 +; + + .export _snprintf + .import pushax, addysp, decsp6, _vsnprintf + .importzp sp, ptr1 + + .macpack generic + +; ---------------------------------------------------------------------------- +; Data + +.bss + +ParamSize: .res 1 ; Number of parameter bytes + +; ---------------------------------------------------------------------------- +; Code + +.code + + +_snprintf: + sty ParamSize ; Number of param bytes passed in Y + +; We have to push buf/size/format, both in the order they already have on stack. +; To make this somewhat more efficient, we will create space on the stack and +; then do a copy of the complete block instead of pushing each parameter +; separately. Since the size of the arguments passed is the same as the size +; of the fixed arguments, this will allow us to calculate the pointer to the +; fixed size arguments easier (they're just ParamSize bytes away). + + jsr decsp6 + +; Calculate a pointer to the Format argument + + lda ParamSize + add sp + sta ptr1 + ldx sp+1 + bcc @L1 + inx +@L1: stx ptr1+1 + +; Now copy buf/size/format + + ldy #6-1 +@L2: lda (ptr1),y + sta (sp),y + dey + bpl @L2 + +; Load va_list (last and __fastcall__ parameter to vsprintf) + + lda ptr1 + ldx ptr1+1 + +; Call vsnprintf + + jsr _vsnprintf + +; Cleanup the stack. We will return what we got from vsprintf + + ldy ParamSize + jmp addysp +