diff --git a/lama-spec.pdf b/lama-spec.pdf index 5362cfcb5..3684c574f 100644 Binary files a/lama-spec.pdf and b/lama-spec.pdf differ 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"