rev 640 - trunk/src

SVN User <[email protected]> Sat, 19 Jun 2004 00:00:20 -0400
Newsgroups gmane.comp.lang.prothon.cvs
Message-ID <[email protected]>
Author: mark
Date: 2004-06-19 00:00:17 -0400 (Sat, 19 Jun 2004)
New Revision: 640

Modified:
   trunk/src/builtins-file.c
Log:
TextFile and TempTextFile fixed and tested

Modified: trunk/src/builtins-file.c
===================================================================
--- trunk/src/builtins-file.c	2004-06-19 03:10:09 UTC (rev 639)
+++ trunk/src/builtins-file.c	2004-06-19 04:00:17 UTC (rev 640)
@@ -1388,7 +1388,6 @@
 	else       del_attr(ist, self, sym(ist, "magic"));
 
 	if (strlen(mode) == 0) {
-		SET_TYPE_IF_EXC(TextFile_OBJ, self, DATA_TYPE_DATAPTR) return NULL;
 		set_file_obj_data(ist, self, parms[1], NULL, NULL, 0, 0);
 		read_lock(ist, self);
 		self->unclonable = TRUE;
@@ -1423,7 +1422,6 @@
 		return NULL;
 	}
 	read_unlock(ist, self);
-	SET_TYPE_IF_EXC(TextFile_OBJ, self, DATA_TYPE_DATAPTR) return NULL;
 	set_file_obj_data(ist, self, parms[1], parms[3], f, bufsize, flags);
 	read_lock(ist, self);
 	self->unclonable = TRUE;
@@ -1627,7 +1625,7 @@
 			total_read += num_read = (data_size_t) strlen(buf);
 		}
 		str_obj = NEW_OBJ(OBJ(STRING_PROTO));
-		c2pr_bytcpy(ist, str_obj, buf, total_read, latin);
+		c2pr_bytcpy(ist, str_obj, buf, num_read, latin);
 		pr_free(buf);
 		str_obj->immutable = TRUE;
 		list_append(ist, list_obj, str_obj);
@@ -1723,8 +1721,8 @@
 				raise_exception(ist, OBJ(TYPE_EXC), "writeLines list items must be strings");
 				return NULL;
 			}
-			buf = pr_malloc(size = pr_strlen(parms[1]));
-			pr_str2bytes(ist, buf, parms[1], latin);
+			buf = pr_malloc(size = pr_strlen(item));
+			pr_str2bytes(ist, buf, item, latin);
 			aprerr = apr_file_write_full(STREAM(self), buf, size, NULL);
 			if (aprerr != APR_SUCCESS) {
 				raise_exception(ist, OBJ(IO_EXC), "%s",
@@ -1737,7 +1735,71 @@
 	return parms[1];
 }
 
+//*************************** MODULE TempTextFile *************************************
 
+MODULE_START(TempTextFile)
+{
+	TempTextFile_OBJ = NEW_OBJ(TextFile_OBJ);
+	set_obj_doc(TempTextFile_OBJ, "TempTextFile object prototype");
+
+	MODULE_ADD_TO_BASE(TempTextFile);
+	TempTextFile_OBJ->unclonable = TRUE;
+}
+
+DEF( TempTextFile, init_, FPARM4( encoding,		NEW_STRING("ASCII"),
+							      magic,		OBJ(PR_FALSE),
+								  bufsize,		NEW_INT(-1), 
+								  delOnClose,	OBJ(PR_FALSE) ) ) {
+	apr_status_t aprerr;
+	apr_file_t *fp;
+	apr_pool_t *subpool;
+	char *temp_dir, *fullpath, *encoding;
+	int bufsize, delOnClose = FALSE, flags = 0, magic;
+	
+	BIN_EMPTY_CHK();
+	STRING_PARAM(1, encoding);
+	magic = (parms[3] == OBJ(PR_TRUE));
+	INT_32_PARAM(3, bufsize);
+	if (parms[7] == OBJ(PR_TRUE)) delOnClose = TRUE;
+
+	read_unlock(ist, self);
+	set_attr(ist, self, sym(ist, "encoding"), NEW_STRING(encoding));
+	if (magic) set_attr(ist, self, sym(ist, "magic"), OBJ(PR_TRUE));
+	read_lock(ist, self);
+
+	aprerr = apr_pool_create(&subpool, get_pr_head_pool());
+	IF_APR_ERR("getting memory for TempTextFile") return NULL;
+
+	check_TempDir_proto(ist);
+	temp_dir = pr2c_strptr(ist, get_attr(ist, TempDir_OBJ, sym(ist, "path")));
+	aprerr = apr_filepath_merge( &fullpath, temp_dir, "prothon-temp-file-XXXXXX", 
+		                         APR_FILEPATH_TRUENAME, subpool );
+	IF_APR_ERR("merging filepath") return NULL;
+
+	if (delOnClose) flags = (APR_CREATE | APR_READ | APR_WRITE | APR_EXCL | APR_BINARY | APR_DELONCLOSE);
+	else            flags = (APR_CREATE | APR_READ | APR_WRITE | APR_EXCL | APR_BINARY);
+	aprerr = apr_file_mktemp(&fp, fullpath, flags, subpool);
+	IF_APR_ERR("opening temporary file") return NULL;
+
+	read_unlock(ist, self);
+	SET_TYPE_IF_EXC(TempTextFile_OBJ, self, DATA_TYPE_DATAPTR) return NULL;
+	set_file_obj_data(ist, self, NEW_STRING(fullpath), NULL, fp, bufsize, flags);
+	read_lock(ist, self);
+	self->unclonable = TRUE;
+	return OBJ(NONE);
+}
+
+DEF(TempTextFile, str_, NULL) {
+	char buf[300], *path;
+	BIN_STR_CHK(TempTextFile);
+	path = pr2c_strptr(ist, get_attr(ist, self, sym(ist, "path")));
+	apr_snprintf(buf, sizeof(buf), "<TempTextFile:'%s'>", path);
+	pr_free(path);
+	return NEW_STRING(buf);
+}
+
+//*************************** MAIN_MODULE_INIT *************************************
+
 MAIN_MODULE_INIT(File) {
 	apr_pool_t *std_pool;
 	apr_status_t aprerr;
@@ -1812,6 +1874,10 @@
 	MODULE_ADD_SYM(TextFile, write);
 	MODULE_ADD_SYM(TextFile, writeLines);
 
+	MODULE_SUB_INIT(TempTextFile);
+	MODULE_ADD_SYM(TempTextFile, init_);
+	MODULE_ADD_SYM(TempTextFile, str_);
+
 	/* 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! */