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! */