From a2ac0c10b21550bbba2f00f9c519d081f49c3cf6 Mon Sep 17 00:00:00 2001 From: retropikzel Date: Fri, 27 Feb 2026 10:04:46 +0200 Subject: [PATCH] Add c-stdio library --- retropikzel/c-stdio.scm | 22 ++++++++++++++++ retropikzel/c-stdio.sld | 35 ++++++++++++++++++++++++++ retropikzel/{stdio => c-stdio}/LICENSE | 0 retropikzel/c-stdio/README.md | 18 +++++++++++++ retropikzel/{stdio => c-stdio}/VERSION | 0 retropikzel/c-stdio/test.scm | 3 +++ retropikzel/stdio.scm | 29 --------------------- retropikzel/stdio.sld | 35 -------------------------- retropikzel/stdio/test.scm | 3 --- 9 files changed, 78 insertions(+), 67 deletions(-) create mode 100644 retropikzel/c-stdio.scm create mode 100644 retropikzel/c-stdio.sld rename retropikzel/{stdio => c-stdio}/LICENSE (100%) create mode 100644 retropikzel/c-stdio/README.md rename retropikzel/{stdio => c-stdio}/VERSION (100%) create mode 100644 retropikzel/c-stdio/test.scm delete mode 100644 retropikzel/stdio.scm delete mode 100644 retropikzel/stdio.sld delete mode 100644 retropikzel/stdio/test.scm diff --git a/retropikzel/c-stdio.scm b/retropikzel/c-stdio.scm new file mode 100644 index 0000000..da2ed1b --- /dev/null +++ b/retropikzel/c-stdio.scm @@ -0,0 +1,22 @@ +(define-c-library libc '("stdio.h") #f '()) +(define-c-procedure fopen libc 'fopen 'pointer '(pointer pointer)) +(define-c-procedure fclose libc 'fclose 'int '(pointer)) +(define-c-procedure feof 'feof 'int '(pointer)) +(define-c-procedure ferror 'ferror 'int '(pointer)) +(define-c-procedure fgetc 'fgetc 'int '(pointer)) +(define-c-procedure fgetcs 'fgetcs 'pointer '(pointer int pointer)) +(define-c-procedure fputc 'fputc 'int '(int pointer)) +(define-c-procedure fputs 'fputs 'int '(pointer pointer)) +(define-c-procedure fread 'fread 'int '(pointer int int pointer)) +(define-c-procedure fseek 'fseek 'int '(pointer long int)) +(define-c-procedure ftell 'ftell 'long '(pointer)) +(define-c-procedure fwrite 'fwrite 'int '(pointer int int pointer)) +(define-c-procedure getc 'fwrite 'int '(pointer)) +(define-c-procedure getchar 'getchar 'int '()) +(define-c-procedure putc 'putc 'int '(int pointer)) +(define-c-procedure putchar 'putchar 'int '(int)) +(define-c-procedure puts 'puts 'int '(pointer)) +(define-c-procedure remove 'remove 'int '(pointer)) +(define-c-procedure rename 'rename 'int '(pointer pointer)) +(define-c-procedure rewind 'rewind 'int '(pointer)) + diff --git a/retropikzel/c-stdio.sld b/retropikzel/c-stdio.sld new file mode 100644 index 0000000..3c5dbab --- /dev/null +++ b/retropikzel/c-stdio.sld @@ -0,0 +1,35 @@ +(define-library + (retropikzel c-stdio) + (import (scheme base) + (scheme write) + (foreign c)) + (export fopen + fclose + feof + ferror + fgetc + fgets + ;fprintf ;; TODO + fputc + fputs + fread + ;fscanf ;; TODO + fseek + ftell + fwrite + getc + getchar + ;printf ;; TODO + putc + putchar + puts + remove + rename + rewind + ;scanf ;; TODO + ;snprintf ;; TODO + ;sprintf ;; TODO + ;sscanf ;; TODO + ) + (include "c-stdio.scm")) + diff --git a/retropikzel/stdio/LICENSE b/retropikzel/c-stdio/LICENSE similarity index 100% rename from retropikzel/stdio/LICENSE rename to retropikzel/c-stdio/LICENSE diff --git a/retropikzel/c-stdio/README.md b/retropikzel/c-stdio/README.md new file mode 100644 index 0000000..1faebf5 --- /dev/null +++ b/retropikzel/c-stdio/README.md @@ -0,0 +1,18 @@ +stdio.h bindings + + +Does not have: + - fprintf + - (foreign c) has no way to pass variable number of arguments + - fscanf + - (foreign c) has no way to pass variable number of arguments + - printf + - (foreign c) has no way to pass variable number of arguments + - scanf + - (foreign c) has no way to pass variable number of arguments + - snprintf + - (foreign c) has no way to pass variable number of arguments + - sprintf + - (foreign c) has no way to pass variable number of arguments + - sscanf + - (foreign c) has no way to pass variable number of arguments diff --git a/retropikzel/stdio/VERSION b/retropikzel/c-stdio/VERSION similarity index 100% rename from retropikzel/stdio/VERSION rename to retropikzel/c-stdio/VERSION diff --git a/retropikzel/c-stdio/test.scm b/retropikzel/c-stdio/test.scm new file mode 100644 index 0000000..71facc9 --- /dev/null +++ b/retropikzel/c-stdio/test.scm @@ -0,0 +1,3 @@ + +(test-begin "c-stdio") +(test-end "c-stdio") diff --git a/retropikzel/stdio.scm b/retropikzel/stdio.scm deleted file mode 100644 index 37d13b3..0000000 --- a/retropikzel/stdio.scm +++ /dev/null @@ -1,29 +0,0 @@ -(define-c-library libc '("stdio.h") libc-name '((additional-versions ("0" "6")))) -(define-c-procedure internal-fopen libc 'fopen 'pointer '(pointer poiner)) -(define-c-procedure internal-fclose libc 'fclose 'int '(pointer)) - -(define-record-type - (make-stdio-file file) - stdio-file? - (file stdio-file)) - -(define modes `("r" "w" "a" "r+" "w+" "a+" "rb" "wb" "ab" "rb+" "wb+" "ab+")) - -(define (fopen filename mode) - (when (not (string? filename)) (error "fopen: Filename must be string")) - (when (not (string? mode)) (error "fopen: Mode must be string")) - (when (not (member mode modes)) - (error (string-append "fopen: Mode not in allowed modes of " - (apply (lambda (item) (string-append mode " ")) - modes)))) - (let* ((filename-pointer (string->c-utf8 filename)) - (mode-pointer (string->c-utf8 mode)) - (file (make-stdio-file (fopen filename mode)))) - (c-free filename-pointer) - (c-free mode-pointer) - file)) - -(define (fclose file) - (when (not (stdio-file? file)) (error "fclose: File must be stdio-file")) - (internal-fclose (stdio-file file))) - diff --git a/retropikzel/stdio.sld b/retropikzel/stdio.sld deleted file mode 100644 index 53ad988..0000000 --- a/retropikzel/stdio.sld +++ /dev/null @@ -1,35 +0,0 @@ -(define-library - (retropikzel stdio) - (import (scheme base) - (scheme write) - (foreign c)) - (export fopen - fclose - ;feof - ;ferror - ;fgetc - ;fgets - ;fprintf - ;fputc - ;fputs - ;fread - ;fscanf - ;fseek - ;ftell - ;fwrite - ;getc - ;getchar - ;printf - ;putc - ;putchar - ;puts - ;remove - ;rename - ;rewind - ;scanf - ;snprintf - ;sprintf - ;sscanf - ) - (include "stiod.scm")) - diff --git a/retropikzel/stdio/test.scm b/retropikzel/stdio/test.scm deleted file mode 100644 index ac6c55e..0000000 --- a/retropikzel/stdio/test.scm +++ /dev/null @@ -1,3 +0,0 @@ - -(test-begin "stdio") -(test-end "stdio")