From 9ff649e563e6f597c9bd07252e5ee9ffc2c6d3e9 Mon Sep 17 00:00:00 2001 From: Dmitry Boulytchev Date: Fri, 19 Nov 2021 01:38:22 +0300 Subject: [PATCH] fexists added --- lama-spec.pdf | Bin 264741 -> 264883 bytes runtime/Std.i | 1 + runtime/runtime.c | 36 +++++++++++++++++++++++------------ spec/08.standard_library.tex | 2 ++ src/version.ml | 2 +- 5 files changed, 28 insertions(+), 13 deletions(-) diff --git a/lama-spec.pdf b/lama-spec.pdf index 5362cfcb5aad0d56f05188136e77f81de2120d38..3684c574f9d5febafab54fa94b1a57202a84c743 100644 GIT binary patch delta 17796 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%0AD(wu_OS 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 P9||@yFbX9lMNdWwC-CC3 diff --git a/runtime/Std.i b/runtime/Std.i index ff5588005..dbe2ff36d 100644 --- a/runtime/Std.i +++ b/runtime/Std.i @@ -26,6 +26,7 @@ F,fopen; F,fclose; F,fread; F,fwrite; +F,fexists; F,failure; F,read; F,write; diff --git a/runtime/runtime.c b/runtime/runtime.c index ba9224121..9c7556f07 100644 --- a/runtime/runtime.c +++ b/runtime/runtime.c @@ -62,7 +62,7 @@ void __post_gc_subst () {} # define TO_DATA(x) ((data*)((char*)(x)-sizeof(int))) # define TO_SEXP(x) ((sexp*)((char*)(x)-2*sizeof(int))) -#ifdef DEBUG_PRINT // GET_SEXP_TAG is necessary for printing from space +# ifdef DEBUG_PRINT // GET_SEXP_TAG is necessary for printing from space # define GET_SEXP_TAG(x) (LEN(x)) #endif @@ -71,7 +71,7 @@ void __post_gc_subst () {} # define BOX(x) ((((int) (x)) << 1) | 0x0001) /* GC extra roots */ -#define MAX_EXTRA_ROOTS_NUMBER 32 +# define MAX_EXTRA_ROOTS_NUMBER 32 typedef struct { int current_free; void ** roots[MAX_EXTRA_ROOTS_NUMBER]; @@ -84,44 +84,44 @@ void clear_extra_roots (void) { } void push_extra_root (void ** p) { -#ifdef DEBUG_PRINT +# ifdef DEBUG_PRINT indent++; print_indent (); printf ("push_extra_root %p %p\n", p, &p); fflush (stdout); -#endif +# endif if (extra_roots.current_free >= MAX_EXTRA_ROOTS_NUMBER) { perror ("ERROR: push_extra_roots: extra_roots_pool overflow"); exit (1); } extra_roots.roots[extra_roots.current_free] = p; extra_roots.current_free++; -#ifdef DEBUG_PRINT +# ifdef DEBUG_PRINT indent--; -#endif +# endif } void pop_extra_root (void ** p) { -#ifdef DEBUG_PRINT +# ifdef DEBUG_PRINT indent++; print_indent (); printf ("pop_extra_root %p %p\n", p, &p); fflush (stdout); -#endif +# endif if (extra_roots.current_free == 0) { perror ("ERROR: pop_extra_root: extra_roots are empty"); exit (1); } extra_roots.current_free--; if (extra_roots.roots[extra_roots.current_free] != p) { -#ifdef DEBUG_PRINT +# ifdef DEBUG_PRINT print_indent (); printf ("%i %p %p", extra_roots.current_free, extra_roots.roots[extra_roots.current_free], p); fflush (stdout); -#endif +# endif perror ("ERROR: pop_extra_root: stack invariant violation"); exit (1); } -#ifdef DEBUG_PRINT +# ifdef DEBUG_PRINT indent--; -#endif +# endif } /* end */ @@ -1427,6 +1427,18 @@ extern void Lfwrite (char *fname, char *contents) { failure ("fwrite (\"%s\"): %s\n", fname, strerror (errno)); } +extern void* Lfexists (char *fname) { + FILE *f; + + ASSERT_STRING("fexists", fname); + + f = fopen (fname, "r"); + + if (f) return BOX(1); + + return BOX(0); +} + extern void* Lfst (void *v) { return Belem (v, BOX(0)); } diff --git a/spec/08.standard_library.tex b/spec/08.standard_library.tex index 19d4ada2b..30bed42e4 100644 --- a/spec/08.standard_library.tex +++ b/spec/08.standard_library.tex @@ -87,6 +87,8 @@ is automatically open and closed within the call.} \descr{\lstinline|fun fwrite (fname, contents)|}{Writes a file. The arguments are file name and the contents to write as strings. The file is automatically created and closed within the call.} +\descr{\lstinline|fun fexists (fname)|}{Checks if a file exists. The argument is the file name.} + \descr{\lstinline|fun fprintf (file, fmt, ...)|}{Same as "\lstinline|printf|", but outputs to a given file. The file argument should be that acquired by \lstinline|fopen| function.} diff --git a/src/version.ml b/src/version.ml index da4a1149e..8ea083cb3 100644 --- a/src/version.ml +++ b/src/version.ml @@ -1 +1 @@ -let version = "Version 1.10, 594fa7bf8, Sat Oct 30 19:24:25 2021 +0300" +let version = "Version 1.10, eb098a6fa, Sun Oct 31 15:34:34 2021 +0300"