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_);