rev 683 - in trunk: . pr/test src

SVN User <[email protected]> Wed, 30 Jun 2004 17:01:23 -0400
Newsgroups gmane.comp.lang.prothon.cvs
Message-ID <[email protected]>
Author: mark
Date: 2004-06-30 17:01:20 -0400 (Wed, 30 Jun 2004)
New Revision: 683

Modified:
   trunk/STATUS.txt
   trunk/pr/test/test.pr
   trunk/src/builtins-file.c
Log:
added StdIn, StdOut, StdErr objects, untested

Modified: trunk/STATUS.txt
===================================================================
--- trunk/STATUS.txt	2004-06-30 08:34:37 UTC (rev 682)
+++ trunk/STATUS.txt	2004-06-30 21:01:20 UTC (rev 683)
@@ -4,6 +4,8 @@
 --- stdin, stdout, stderr as text files
 --- change file.setStdout to property
 
+--- getAttr(name), setAttr(name, value), delAttr(name)
+
 --- thread keyword for param improvement?
 --- OSThread, Thread, and Gate
 		http://www.prothon.org/pipermail/prothon-user/2004-June/002124.html
@@ -52,8 +54,6 @@
 --- GNU message catalog _"abc" strings
 --- change all strings to resource file
 
---- getAttr(name), setAttr(name, value), delAttr(name)
-
 --- add conditional expression "if C then x else y"
 
 --- pretty print
@@ -125,6 +125,8 @@
 
 ----------------------- NON_CODING TO-DO ------------------------
 
+--- preps
+
 --- apt-get
 		http://www.prothon.org/pipermail/prothon-user/2004-June/002450.html
 

Modified: trunk/pr/test/test.pr
===================================================================
--- trunk/pr/test/test.pr	2004-06-30 08:34:37 UTC (rev 682)
+++ trunk/pr/test/test.pr	2004-06-30 21:01:20 UTC (rev 683)
@@ -1,3 +1,5 @@
 #!/usr/bin/env prothon
 
+print StdOut
+
 print File.stdin.read()
\ No newline at end of file

Modified: trunk/src/builtins-file.c
===================================================================
--- trunk/src/builtins-file.c	2004-06-30 08:34:37 UTC (rev 682)
+++ trunk/src/builtins-file.c	2004-06-30 21:01:20 UTC (rev 683)
@@ -86,6 +86,9 @@
 MODULE_DECLARE(TextFile);
 MODULE_DECLARE(TextFileGen);
 MODULE_DECLARE(TempTextFile);
+MODULE_DECLARE(StdIn);
+MODULE_DECLARE(StdOut);
+MODULE_DECLARE(StdErr);
 
 //*************************** set_file_obj_data *******************************
 static void set_file_obj_data( isp ist, obj_p file_obj, obj_p filename, obj_p mode,
@@ -1179,45 +1182,7 @@
 #define __STDOUT	1
 #define __STDERR	2
 
-static obj_p __open_std_file(int type, apr_pool_t *subpool)
-{
-	obj_p mode, file;
-	apr_file_t *fp;
-	apr_status_t aprerr;
-	apr_int32_t flags;
 
-	switch (type) {
-		case __STDIN:
-			aprerr = apr_file_open_stdin(&fp, subpool);
-			mode = NEW_STRING("r");
-			file = NEW_STRING("<stdin>");
-			flags = APR_READ;
-			break;
-
-		case __STDOUT:
-			aprerr = apr_file_open_stdout(&fp, subpool);
-			file = NEW_STRING("<stdout>");
-			mode = NEW_STRING("w");
-			flags = APR_WRITE;
-			break;
-
-		case __STDERR:
-			aprerr = apr_file_open_stderr(&fp, subpool);
-			file = NEW_STRING("<stderr>");
-			mode = NEW_STRING("w");
-			flags = APR_WRITE;
-			break;
-
-		default:
-			return NULL; /* XXX something stupid, do an error */
-	}
-
-	if (aprerr != APR_SUCCESS)
-		return NULL;
-
-	return new_file_obj(ist, file, mode, fp, MIN_BUFSIZE, flags);
-}
-
 DEF(File, objList_, FORM_RPARAM) {
 	return parms[1];
 }
@@ -1833,13 +1798,57 @@
 	return res;
 }
 
+//*************************** StdIn StdOut StdErr *****************************
 
-//*************************** MAIN_MODULE_INIT *************************************
+MODULE_START(StdIn)
+{
+	apr_status_t aprerr;
+	apr_pool_t *subpool;
+	apr_file_t *fp;
 
+	/* Create base file objects for std{in,out,err} */
+	aprerr = apr_pool_create(&subpool, get_pr_head_pool());
+	if (aprerr != APR_SUCCESS) {
+		raise_exception(ist, OBJ(IO_EXC), "out of memory");
+		return;
+	}
+	StdIn_OBJ = NEW_OBJ(TextFile_OBJ);
+	set_obj_doc(StdIn_OBJ, "StdIn unique object");
+	MODULE_ADD_TO_OBJ(StdIn, OBJ(OBJECT), "StdIn");	
+	aprerr = apr_file_open_stdin(&fp, subpool);
+	IF_APR_ERR("opening stdin") return;
+	set_file_obj_data(ist, StdIn_OBJ, NEW_STRING("<stdin>"), NEW_STRING("r"), 
+						   fp, 0, APR_READ);
+	StdIn_OBJ->unclonable = TRUE;
+
+	StdOut_OBJ = NEW_OBJ(TextFile_OBJ);
+	set_obj_doc(StdOut_OBJ, "StdOut unique object");
+	MODULE_ADD_TO_OBJ(StdOut, OBJ(OBJECT), "StdOut");
+	aprerr = apr_file_open_stdout(&fp, subpool);
+	IF_APR_ERR("opening stdout") return;
+	set_file_obj_data(ist, StdOut_OBJ, NEW_STRING("<stdout>"), NEW_STRING("w"), 
+						   fp, 0, APR_WRITE);
+	StdOut_OBJ->unclonable = TRUE;
+
+	StdErr_OBJ = NEW_OBJ(TextFile_OBJ);
+	set_obj_doc(StdErr_OBJ, "StdErr unique object");
+	MODULE_ADD_TO_OBJ(StdErr, OBJ(OBJECT), "StdErr");	
+	StdErr_OBJ->unclonable = TRUE;
+	aprerr = apr_file_open_stderr(&fp, subpool);
+	IF_APR_ERR("opening stderr") return;
+	set_file_obj_data(ist, StdErr_OBJ, NEW_STRING("<stderr>"), NEW_STRING("w"), 
+						   fp, 0, APR_WRITE);
+
+	set_attr(ist, File_OBJ, sym(ist, "stdout"), StdOut_OBJ);
+}
+
+DEF(StdIn,  call_, FORM_STAR3_PARAM) { return StdIn_OBJ;  }
+DEF(StdOut, call_, FORM_STAR3_PARAM) { return StdOut_OBJ; }
+DEF(StdErr, call_, FORM_STAR3_PARAM) { return StdErr_OBJ; }
+
+//*************************** MAIN_MODULE_INIT ********************************
+
 MAIN_MODULE_INIT(File) {
-	apr_pool_t *std_pool;
-	apr_status_t aprerr;
-	obj_p file_obj;
 
 	MODULE_SUB_INIT(Dir);
 	MODULE_ADD_SYM(Dir, init_);
@@ -1918,18 +1927,10 @@
 	MODULE_SUB_INIT(TextFileGen);
 	MODULE_ADD_SYM(TextFileGen, next);
 
-	/* Create base file objects for std{in,out,err} */
-	aprerr = apr_pool_create(&std_pool, get_pr_head_pool());
-	/* Need some kind of error return! */
-	if (aprerr != APR_SUCCESS)
-		return;
+	MODULE_SUB_INIT(StdIn);
+	MODULE_ADD_SYM(StdIn,  call_);
+	MODULE_ADD_SYM(StdOut, call_);
+	MODULE_ADD_SYM(StdErr, call_);
 
-	if ((file_obj = __open_std_file(__STDIN, std_pool)))
-		set_attr(ist, File_OBJ, sym(ist, "stdin"), file_obj);
-	if ((file_obj = __open_std_file(__STDOUT, std_pool)))
-		set_attr(ist, File_OBJ, sym(ist, "stdout"), file_obj);
-	if ((file_obj = __open_std_file(__STDERR, std_pool)))
-		set_attr(ist, File_OBJ, sym(ist, "stderr"), file_obj);
-
 	check_exceptions(ist);
 }