From 1627af5de86030c01468e98b68d8a903c5894def Mon Sep 17 00:00:00 2001 From: cuz Date: Sat, 22 Jul 2000 11:10:34 +0000 Subject: [PATCH] Replace strdup by an assembler implementation git-svn-id: svn://svn.cc65.org/cc65/trunk@186 b7a2c559-68d2-44c3-8de9-860c34a00d81 --- libsrc/common/.cvsignore | 1 - libsrc/common/Makefile | 3 +- libsrc/common/strdup.c | 25 ------------- libsrc/common/strdup.s | 80 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 82 insertions(+), 27 deletions(-) delete mode 100644 libsrc/common/strdup.c create mode 100644 libsrc/common/strdup.s diff --git a/libsrc/common/.cvsignore b/libsrc/common/.cvsignore index fabf0b023..338c6bca5 100644 --- a/libsrc/common/.cvsignore +++ b/libsrc/common/.cvsignore @@ -1,7 +1,6 @@ fclose.s fgets.s fprintf.s -strdup.s calloc.s _fopen.s fputs.s diff --git a/libsrc/common/Makefile b/libsrc/common/Makefile index 98ca45efd..3c138635a 100644 --- a/libsrc/common/Makefile +++ b/libsrc/common/Makefile @@ -13,7 +13,7 @@ @echo $< @$(AS) -g -o $@ $(AFLAGS) $< -C_OBJS = fclose.o fgets.o fprintf.o strdup.o calloc.o _fopen.o\ +C_OBJS = fclose.o fgets.o fprintf.o calloc.o _fopen.o\ fputs.o fread.o fwrite.o gets.o realloc.o bsearch.o strxfrm.o\ printf.o _hextab.o vfprintf.o fdopen.o strtok.o\ _afailed.o fopen.o fgetc.o fputc.o puts.o gets.o perror.o getchar.o\ @@ -68,6 +68,7 @@ S_OBJS = _fdesc.o \ strcoll.o \ strcpy.o \ strcspn.o \ + strdup.o \ strerror.o \ stricmp.o \ strlen.o \ diff --git a/libsrc/common/strdup.c b/libsrc/common/strdup.c deleted file mode 100644 index 42a01afc8..000000000 --- a/libsrc/common/strdup.c +++ /dev/null @@ -1,25 +0,0 @@ -/* - * strdup.c - * - * Ullrich von Bassewitz, 11.08.1998 - */ - - - -#include -#include - - - -char* strdup (char* s) -{ - char* p; - p = malloc (strlen (s) + 1); - if (p) { - strcpy (p, s); - } - return p; -} - - - diff --git a/libsrc/common/strdup.s b/libsrc/common/strdup.s new file mode 100644 index 000000000..fa2d289c4 --- /dev/null +++ b/libsrc/common/strdup.s @@ -0,0 +1,80 @@ +; +; Ullrich von Bassewitz, 18.07.2000 +; +; char* __fastcall__ strdup (const char* S); +; +; Note: The code knowns which zero page locations are used by malloc. +; + + .importzp sp, tmp1, ptr4 + .import pushax, decsp4, incsp4 + .import _strlen, _malloc, _memcpy + .export _strdup + + .macpack generic + +_strdup: + +; Since we need some place to store the intermediate results, allocate a +; stack frame. To make this somewhat more efficient, create the stackframe +; as needed for the final call to the memcpy function. + + jsr decsp4 ; Target/source + +; Store the pointer into the source slot + + ldy #0 + sta (sp),y + iny + pha + txa + sta (sp),y + pla + +; Get length of S (which is still in a/x) + + jsr _strlen + +; Calculate strlen(S)+1 (the space needed) + + add #1 + bcc @L1 + inx + +; Save the space we're about to allocate in ptr4 + +@L1: sta ptr4 + stx ptr4+1 + +; Allocate memory. _malloc will not use ptr4 + + jsr _malloc + +; Store the result into the target stack slot + + ldy #2 + sta (sp),y ; Store low byte + sta tmp1 + txa ; Get high byte + iny + sta (sp),y ; Store high byte + +; Check for a NULL pointer + + ora tmp1 + beq OutOfMemory + +; Copy the string. memcpy will return the target string which is exactly +; what we need here. It will also drop the allocated stack frame. + + lda ptr4 + ldx ptr4+1 ; Load size + jmp _memcpy ; Copy string, drop stackframe + +; Out of memory, return NULL (A = 0) + +OutOfMemory: + tax + jmp incsp4 ; Drop stack frame + +