[pure-lang-svn] SF.net SVN: pure-lang:[654] pure/trunk
Status: Beta
Brought to you by:
agraef
|
From: <ag...@us...> - 2008-08-28 12:03:40
|
Revision: 654
http://pure-lang.svn.sourceforge.net/pure-lang/?rev=654&view=rev
Author: agraef
Date: 2008-08-28 12:03:49 +0000 (Thu, 28 Aug 2008)
Log Message:
-----------
fopen/popen now take care of closing a file object when it's garbage-collected.
Modified Paths:
--------------
pure/trunk/ChangeLog
pure/trunk/lib/system.pure
Modified: pure/trunk/ChangeLog
===================================================================
--- pure/trunk/ChangeLog 2008-08-28 11:38:47 UTC (rev 653)
+++ pure/trunk/ChangeLog 2008-08-28 12:03:49 UTC (rev 654)
@@ -1,5 +1,9 @@
2008-08-28 Albert Graef <Dr....@t-...>
+ * lib/system.pure: New definitions of fopen/popen and
+ fclose/pclose, using sentries which take care of closing a file
+ object automagically when it's garbage-collected.
+
* lib/primitives.pure: Add interface to sentries (see below).
* runtime.cc/h: Added sentries -- expression "guards" which are
Modified: pure/trunk/lib/system.pure
===================================================================
--- pure/trunk/lib/system.pure 2008-08-28 11:38:47 UTC (rev 653)
+++ pure/trunk/lib/system.pure 2008-08-28 12:03:49 UTC (rev 654)
@@ -157,10 +157,12 @@
routines are actually overridden with more convenient Pure wrappers
below. */
+private c_fopen c_popen c_fclose c_pclose;
+extern FILE* fopen(char* name, char* mode) = c_fopen;
+extern FILE* popen(char* cmd, char* mode) = c_popen;
+extern int fclose(FILE* fp) = c_fclose, int pclose(FILE* fp) = c_pclose;
+extern int fflush(FILE* fp);
private c_fgets c_gets;
-extern FILE* fopen(char* name, char* mode);
-extern FILE* popen(char* cmd, char* mode);
-extern int fflush(FILE* fp), int fclose(FILE* fp), int pclose(FILE* fp);
extern char* fgets(void* buf, int size, FILE* fp) = c_fgets;
extern char* gets(void* buf) = c_gets;
extern int fputs(char* s, FILE* fp), int puts(char* s);
@@ -169,6 +171,22 @@
extern void clearerr(FILE* fp);
extern int feof(FILE* fp), int ferror(FILE* fp);
+/* Pure wrappers for fopen/popen and fclose/pclose which take care of closing
+ a file object automagically when it's garbage-collected. */
+
+fopen name::string mode::string = check (c_fopen name mode) with
+ check fp::pointer = sentry c_fclose fp if not null fp;
+ check fp = fp otherwise;
+end;
+
+popen name::string mode::string = check (c_popen name mode) with
+ check fp::pointer = sentry c_pclose fp if not null fp;
+ check fp = fp otherwise;
+end;
+
+fclose fp::pointer = clear_sentry fp $$ c_fclose fp;
+pclose fp::pointer = clear_sentry fp $$ c_pclose fp;
+
/* Pure wrappers for fgets and gets which handle the necessary buffering
automatically. */
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|