rev 624 - in trunk: include/prothon pr/test src

SVN User <[email protected]> Mon, 14 Jun 2004 18:48:01 -0400
Newsgroups gmane.comp.lang.prothon.cvs
Message-ID <[email protected]>
Author: mark
Date: 2004-06-14 18:47:58 -0400 (Mon, 14 Jun 2004)
New Revision: 624

Modified:
   trunk/include/prothon/prothon_dll.h
   trunk/pr/test/test.pr
   trunk/src/builtins-file.c
Log:
aded TempDir and methods

Modified: trunk/include/prothon/prothon_dll.h
===================================================================
--- trunk/include/prothon/prothon_dll.h	2004-06-14 20:29:45 UTC (rev 623)
+++ trunk/include/prothon/prothon_dll.h	2004-06-14 22:47:58 UTC (rev 624)
@@ -254,6 +254,13 @@
 	set_immutable(module##_##name);									\
 	set_attr(ist, module##_OBJ, sym(ist, #name), module##_##name)
 
+#define MODULE_CONSTANT_OBJ(module, name, obj)						\
+	module##_##name = obj;											\
+	clr_immutable(module##_##name);									\
+	set_obj_id(module##_##name, module, name);						\
+	set_immutable(module##_##name);									\
+	set_attr(ist, module##_OBJ, sym(ist, #name), module##_##name)
+
 #define MODULE_SUB_INIT(name)	\
 	name##_initialize_module();	\
 	check_exceptions(ist);

Modified: trunk/pr/test/test.pr
===================================================================
--- trunk/pr/test/test.pr	2004-06-14 20:29:45 UTC (rev 623)
+++ trunk/pr/test/test.pr	2004-06-14 22:47:58 UTC (rev 624)
@@ -14,9 +14,5 @@
 for i in d.numFiles():
 	print "{0:-40.40} {1:-30.30}".fmt(files[i].path, files[i].name)
 print
-
-d = Dir('abc')
-print d, d.exists?()
-d2 = d.copy(Dir('/def'))
-print d, d.exists?(), d2, d2.exists?()
-*/
\ No newline at end of file
+*/
+print TempDir()
\ No newline at end of file

Modified: trunk/src/builtins-file.c
===================================================================
--- trunk/src/builtins-file.c	2004-06-14 20:29:45 UTC (rev 623)
+++ trunk/src/builtins-file.c	2004-06-14 22:47:58 UTC (rev 624)
@@ -80,6 +80,7 @@
 #define OPEN(obj)    (((obj) != File_OBJ) && STREAM(obj))
 
 MODULE_DECLARE(Dir);
+MODULE_DECLARE(TempDir);
 MODULE_DECLARE(File);
 
 //*************************** set_file_obj_data *******************************
@@ -157,10 +158,11 @@
 	return dir_obj;
 }
 
-#define DLIST_COUNT		1
-#define DLIST_SIZE		2
-#define DLIST_FILENAMES 4
-#define DLIST_COPY		8
+#define DLIST_COUNT			1
+#define DLIST_SIZE			2
+#define DLIST_FILENAMES		4
+#define DLIST_COPY			8
+#define DLIST_DELETE		16
 
 obj_p dir_list( isp ist, obj_p self, int type, int dlist_action, 
 			    obj_p pattern, obj_p dest_dir, int uperms ) {
@@ -187,7 +189,7 @@
 		IF_APR_ERR("reading directory") return NULL;
 		if (type == -1 || finfo.filetype == type) {
 			if (finfo.filetype == APR_REG || (strcmp(finfo.name, ".") && strcmp(finfo.name, ".."))) {
-				if (dlist_action & (DLIST_SIZE|DLIST_FILENAMES|DLIST_COPY)) {
+				if (dlist_action & (DLIST_SIZE|DLIST_FILENAMES|DLIST_COPY|DLIST_DELETE)) {
 					aprerr = apr_filepath_merge( &filepath, dirpath, finfo.name, 
 												 APR_FILEPATH_TRUENAME, filep->pool );
 					IF_APR_ERR("Unable to calculate filepath") return NULL;
@@ -222,6 +224,16 @@
 						del_unlock(new_dst_dir);
 					}
                     break;
+				case DLIST_DELETE:
+					if (finfo.filetype == APR_REG) {
+						aprerr = apr_file_remove(filepath, filep->pool );
+						IF_APR_ERR("deleting file") return NULL;
+					} else {
+						obj_p new_dir = new_dir_obj(ist, filepath);   if_exc_return NULL;
+						call_func0(ist, new_dir, sym(ist, "delete")); if_exc_return NULL;
+						del_unlock(new_dir);
+					}
+					break;
 				}
 			}
 		} else if (finfo.filetype != (type == APR_REG ? APR_DIR : APR_REG)) {
@@ -234,6 +246,8 @@
 	return res;
 }
 
+#define addch3(ch)  buf[buf_idx++].b0 = (u8_t)(ch)
+
 //*************************** MODULE Dir **************************************
 
 MODULE_START(Dir)
@@ -263,7 +277,6 @@
 	return OBJ(NONE);
 }
 
-#define addch3(ch)  buf[buf_idx++].b0 = (u8_t)(ch)
 
 DEF(Dir, str_, NULL) {
 	char buf[300], *path;
@@ -286,16 +299,16 @@
 	else                            return OBJ(PR_FALSE);
 }
 
-DEF(Dir, make, FPARM1(uperm, NEW_INT(APR_UREAD|APR_UWRITE|APR_UEXECUTE))) {
+DEF(Dir, make, FPARM1(uperms, NEW_INT(APR_UREAD|APR_UWRITE|APR_UEXECUTE))) {
     apr_status_t aprerr; 
 	char* path;
-	i32_t uperm;
+	i32_t uperms;
 	pr_file_p filep;
 	BIN_CONTENT_CHK(Dir);
-	INT_32_PARAM(1, uperm);
+	INT_32_PARAM(1, uperms);
 	filep = self->data.ptr;
 	path = pr2c_strptr(ist, get_attr(ist, self, sym(ist, "path")));
-	aprerr = apr_dir_make_recursive(path, uperm, filep->pool);
+	aprerr = apr_dir_make_recursive(path, uperms, filep->pool);
 	IF_APR_ERR("Unable to make directory") return NULL;
 	return self;
 }
@@ -397,7 +410,7 @@
 	return parms[1];
 }
 
-DEF(Dir, copy, FPARM2(dir, NULL, uperms, NEW_INT(0x600))) {
+DEF(Dir, copy, FPARM2(dir, NULL, uperms, NEW_INT(APR_UREAD|APR_UWRITE|APR_UEXECUTE))) {
 	apr_status_t aprerr;
 	i32_t uperms;
 	char* path;
@@ -412,13 +425,20 @@
 	dir_list(ist, self, -1, DLIST_COPY, NULL, parms[1], uperms);
 	return parms[1];
 }
-/*
+
 DEF(Dir, delete, NULL) {
+	apr_status_t aprerr;
+	char* path;
+	pr_file_p filep;
 	BIN_CONTENT_CHK(Dir);
-	dir_list(ist, self, -1, DLIST_COPY, NULL, parms[1], uperms);
+	filep = self->data.ptr;
+	dir_list(ist, self, -1, DLIST_DELETE, NULL, NULL, 0);
+	path = pr2c_strptr(ist, get_attr(ist, self, sym(ist, "path")));
+	aprerr = apr_dir_remove(path, filep->pool );
+	IF_APR_ERR("deleting directory") return NULL;
 	return self;
 }
-*/
+
 DEF(Dir, eq__QUES, FORM_RPARAM) {
 	obj_p self_path, other_path;
 	BIN_CONTENT_CHK(Dir);
@@ -428,11 +448,117 @@
 	return call_func1(ist, self_path, SYM(EQ__QUES), other_path);
 }
 
+DEF(Dir, setUPerms, FPARM1(uperms, NEW_INT(APR_UREAD|APR_UWRITE|APR_UEXECUTE))) {
+	apr_status_t aprerr;
+	char* path;
+	int uperms;
+	BIN_CONTENT_CHK(Dir);
+	INT_32_PARAM(1, uperms);
+	path = pr2c_strptr(ist, get_attr(ist, self, sym(ist, "path")));
+	aprerr = apr_file_perms_set(path, uperms);
+	IF_APR_ERR("setting unix permissions") return NULL;
+	return self;
+}
+
+DEF(Dir, setFileAttrs, FPARM3(readOnly, OBJ(NONE), executable, OBJ(NONE), hidden, OBJ(NONE))) {
+	apr_status_t aprerr;
+	char* path;
+	int attrs = 0, attrs_mask = 0;
+	pr_file_p filep;
+	BIN_CONTENT_CHK(Dir);
+	filep = self->data.ptr;
+	if (parms[1] == OBJ(PR_TRUE)) { 
+		attrs |= APR_FILE_ATTR_READONLY;   attrs_mask |= APR_FILE_ATTR_READONLY;   }
+	if (parms[3] == OBJ(PR_TRUE)) { 
+		attrs |= APR_FILE_ATTR_EXECUTABLE; attrs_mask |= APR_FILE_ATTR_EXECUTABLE; }
+	if (parms[5] == OBJ(PR_TRUE)) {
+		attrs |= APR_FILE_ATTR_HIDDEN;     attrs_mask |= APR_FILE_ATTR_HIDDEN;     }
+	if (parms[1] == OBJ(PR_FALSE)) attrs_mask |= APR_FILE_ATTR_READONLY; 
+	if (parms[3] == OBJ(PR_FALSE)) attrs_mask |= APR_FILE_ATTR_EXECUTABLE;
+	if (parms[5] == OBJ(PR_FALSE)) attrs_mask |= APR_FILE_ATTR_HIDDEN;
+	path = pr2c_strptr(ist, get_attr(ist, self, sym(ist, "path")));
+	aprerr = apr_file_attrs_set(path, attrs, attrs_mask, filep->pool );
+	IF_APR_ERR("setting directory attributes") return NULL;
+	return self;
+}
+
+
+/*
+ * Set the mtime of the specified file.
+ * @param fname The full path to the file (using / on all systems)
+ * @param mtime The mtime to apply to the file.
+ * @param pool The pool to use.
+ * @warning Platforms which do not implement this feature will return
+ *      APR_ENOTIMPL.
+
+APR_DECLARE(apr_status_t) apr_file_mtime_set(const char *fname,
+                                             apr_time_t mtime,
+                                             apr_pool_t *pool);
+
+ */
+
 DEF(Dir, objList_, FORM_RPARAM) {
 	return parms[1];
 }
 
+//*************************** MODULE TempDir **********************************
 
+MODULE_START(TempDir) {
+	apr_pool_t *subpool;
+	char* temp_dir_path;
+
+	TempDir_OBJ = NEW_OBJ(Dir_OBJ);
+	set_obj_doc(TempDir_OBJ, "Temporary directory object prototype");
+
+	apr_pool_create(&subpool, get_pr_head_pool());
+	apr_temp_dir_get(&temp_dir_path, subpool);
+	set_file_obj_data( ist, TempDir_OBJ, NEW_STRING(temp_dir_path), 
+		               NULL, NULL, 0, APR_READ );
+	SET_TYPE_IF_EXC(TempDir_OBJ, TempDir_OBJ, DATA_TYPE_DATAPTR) return;
+	MODULE_ADD_TO_BASE(TempDir);
+	set_unclonable(TempDir_OBJ);
+}
+
+DEF(TempDir, init_, NULL) {
+	BIN_EMPTY_CHK();
+	set_immutable(TempDir_OBJ);
+	return TempDir_OBJ;
+}
+
+DEF(TempDir, str_, NULL) {
+	char buf[300], *path;
+	BIN_STR_CHK(TempDir);
+	path = pr2c_strptr(ist, get_attr(ist, self, sym(ist, "path")));
+	apr_snprintf(buf, sizeof(buf), "<TempDir:'%s'>", path);
+	pr_free(path);
+	return NEW_STRING(buf);
+}
+
+DEF(TempDir, make, FPARM1(uperms, NEW_INT(APR_UREAD|APR_UWRITE|APR_UEXECUTE))) {
+	raise_exception(ist, OBJ(TYPE_EXC), "make() not allowed on TempDir");
+	return NULL;
+}
+DEF(TempDir, rename, FPARM1(name, NULL)) {
+	raise_exception(ist, OBJ(TYPE_EXC), "rename() not allowed on TempDir");
+	return NULL;
+}
+DEF(TempDir, move, FPARM1(dir, NULL)) {
+	raise_exception(ist, OBJ(TYPE_EXC), "move() not allowed on TempDir");
+	return NULL;
+}
+DEF(TempDir, delete, NULL) {
+	raise_exception(ist, OBJ(TYPE_EXC), "delete() not allowed on TempDir");
+	return NULL;
+}
+DEF(TempDir, setUPerms, FPARM1(uperms, NEW_INT(APR_UREAD|APR_UWRITE|APR_UEXECUTE))) {
+	raise_exception(ist, OBJ(TYPE_EXC), "setUPerms() not allowed on TempDir");
+	return NULL;
+}
+DEF(TempDir, setFileAttrs, FPARM3(readOnly, OBJ(NONE), executable, OBJ(NONE), hidden, OBJ(NONE))) {
+	raise_exception(ist, OBJ(TYPE_EXC), "setFileAttrs() not allowed on TempDir");
+	return NULL;
+}
+
 //*************************** MODULE File *************************************
 
 MODULE_START(File)
@@ -1058,9 +1184,22 @@
 	MODULE_ADD_SYM(Dir, rename);
 	MODULE_ADD_SYM(Dir, move);
 	MODULE_ADD_SYM(Dir, copy);
+	MODULE_ADD_SYM(Dir, delete);
 	MODULE_ADD_SYM(Dir, eq__QUES);
+	MODULE_ADD_SYM(Dir, setUPerms);
+	MODULE_ADD_SYM(Dir, setFileAttrs);
 	MODULE_ADD_SYM(Dir, objList_);
 
+	MODULE_SUB_INIT(TempDir);
+	MODULE_ADD_SYM(TempDir, init_);
+	MODULE_ADD_SYM(TempDir, str_);
+	MODULE_ADD_SYM(TempDir, make);
+	MODULE_ADD_SYM(TempDir, rename);
+	MODULE_ADD_SYM(TempDir, move);
+	MODULE_ADD_SYM(TempDir, delete);
+	MODULE_ADD_SYM(TempDir, setUPerms);
+	MODULE_ADD_SYM(TempDir, setFileAttrs);
+
 	MODULE_SUB_INIT(File);
 	MODULE_ADD_SYM(File, init_);
 	MODULE_ADD_SYM(File, str_);