From adfb42bfa6baaa8c4190a162339d406e928b432a Mon Sep 17 00:00:00 2001 From: Colin Leroy-Mira Date: Wed, 1 Jan 2025 13:23:57 +0100 Subject: [PATCH] Rewrite rewind in assembly --- libsrc/common/rewind.c | 25 ------------------- libsrc/common/rewind.s | 35 ++++++++++++++++++++++++++ test/ref/test_rewind.c | 56 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 91 insertions(+), 25 deletions(-) delete mode 100644 libsrc/common/rewind.c create mode 100644 libsrc/common/rewind.s create mode 100644 test/ref/test_rewind.c diff --git a/libsrc/common/rewind.c b/libsrc/common/rewind.c deleted file mode 100644 index 333230b74..000000000 --- a/libsrc/common/rewind.c +++ /dev/null @@ -1,25 +0,0 @@ -/* -** rewind.c -** -** Christian Groessler, 07-Aug-2000 -*/ - - - -#include - - - -/*****************************************************************************/ -/* Code */ -/*****************************************************************************/ - - - -void __fastcall__ rewind (FILE* f) -{ - fseek(f, 0L, SEEK_SET); - clearerr(f); -} - - diff --git a/libsrc/common/rewind.s b/libsrc/common/rewind.s new file mode 100644 index 000000000..e7013505c --- /dev/null +++ b/libsrc/common/rewind.s @@ -0,0 +1,35 @@ +; +; Colin Leroy-Mira +; +; void __fastcall__ rewind (FILE* f) +; /* Rewind a file */ +; + + .export _rewind + + .import _fseek, _clearerr + .import pushax, pushl0, popax + + .include "stdio.inc" + + +; ------------------------------------------------------------------------ +; Code + +.proc _rewind + + ; Push f twice (once for fseek, once for clearerr later) + jsr pushax + jsr pushax + + ; Push offset (long) zero + jsr pushl0 + + lda #SEEK_SET + jsr _fseek + + ; Clear error + jsr popax + jmp _clearerr + +.endproc diff --git a/test/ref/test_rewind.c b/test/ref/test_rewind.c new file mode 100644 index 000000000..80fe08ce1 --- /dev/null +++ b/test/ref/test_rewind.c @@ -0,0 +1,56 @@ +/* + !!DESCRIPTION!! fgets test + !!LICENCE!! Public domain +*/ + +#include "common.h" + +#include +#include +#include +#include +#include +#include + +FILE *in; +char bufA[32]; +char bufB[32]; + +#define INFILE "cf.in" + +int main(int argc,char **argv) +{ + static int r; + + in = fopen(INFILE, "rb"); + if (in == NULL) { + return EXIT_FAILURE; + } + + r = fread(bufA, 1, sizeof(bufA), in); + + if (r == 0) { + printf("Error: could not read.\n"); + return EXIT_FAILURE; + } + fwrite(bufA, 1, r, stdout); + + rewind(in); + printf("rewind.\n"); + r = fread(bufB, 1, sizeof(bufB), in); + + if (r == 0) { + printf("Error: could not re-read.\n"); + return EXIT_FAILURE; + } + fwrite(bufB, 1, r, stdout); + + fclose(in); + + if (memcmp(bufA, bufB, sizeof(bufA))) { + printf("reads differ.\n"); + return EXIT_FAILURE; + } + + return 0; +}