rev 635 - in trunk: . include/prothon pr/test src

SVN User <[email protected]> Fri, 18 Jun 2004 19:56:01 -0400
Newsgroups gmane.comp.lang.prothon.cvs
Message-ID <[email protected]>
Author: mark
Date: 2004-06-18 19:55:59 -0400 (Fri, 18 Jun 2004)
New Revision: 635

Modified:
   trunk/STATUS.txt
   trunk/include/prothon/prothon.h
   trunk/pr/test/test.pr
   trunk/src/builtins-core.c
   trunk/src/src.vcproj
Log:
added object.range() (which doesn't work yet)

Modified: trunk/STATUS.txt
===================================================================
--- trunk/STATUS.txt	2004-06-18 06:05:25 UTC (rev 634)
+++ trunk/STATUS.txt	2004-06-18 23:55:59 UTC (rev 635)
@@ -9,13 +9,17 @@
 --- support any object that supports file methods in stdxxx (duck std)
 		http://www.prothon.org/pipermail/prothon-user/2004-June/001769.html	
 
+--- range function
+
 --- += --> = a + b,  +! --> .append!()
 
---- CThread & UThread
+--- OSThread, Thread, and Gate
 
 --- Python regrets from Paul and print proposal
 	http://www.prothon.org/pipermail/prothon-user/2004-June/001970.html
 	http://www.prothon.org/pipermail/prothon-user/2004-June/001991.html
+--- pretty print
+	http://www.prothon.org/pipermail/prothon-user/2004-June/002112.html
 
 --- implement 1xc3fe ?
 

Modified: trunk/include/prothon/prothon.h
===================================================================
--- trunk/include/prothon/prothon.h	2004-06-18 06:05:25 UTC (rev 634)
+++ trunk/include/prothon/prothon.h	2004-06-18 23:55:59 UTC (rev 635)
@@ -987,12 +987,14 @@
 i32_t int2i32t(isp ist, obj_p self);
 
 #define INT_64_PARAM(index, var)	/* i64_t var; */						\
-{	if (!has_proto(ist, (index > 0 ? parms[((index)-1)*2+1] : list_item(ist, parms[1], -index)), OBJ(INT_PROTO))) {						\
-		raise_exception(ist, OBJ(TYPE_EXC),									\
-				"expected a integer in parameter " #index);					\
-		return (index > 0 ? parms[((index)-1)*2+1] : list_item(ist, parms[1], -index));														\
-	}																		\
-	(var) = int2i64t(ist, index > 0 ? parms[((index)-1)*2+1] : list_item(ist, parms[1], -index)); }
+do { obj_p item = index > 0 ? parms[((index)-1)*2+1] :                      \
+                              list_item(ist, parms[1], -index);             \
+     if (!has_proto(ist, item, OBJ(INT_PROTO))) {                           \
+		 raise_exception(ist, OBJ(TYPE_EXC),							    \
+				             "expected a integer in parameter " #index);    \
+		 return NULL; }  (var) = int2i64t(ist, item);                       \
+} while (FALSE)
+
 i64_t int2i64t(isp ist, obj_p self);
 
 #define BYTES__PARAM(index, var)	/* obj_p var; */						\

Modified: trunk/pr/test/test.pr
===================================================================
--- trunk/pr/test/test.pr	2004-06-18 06:05:25 UTC (rev 634)
+++ trunk/pr/test/test.pr	2004-06-18 23:55:59 UTC (rev 635)
@@ -1,54 +1,19 @@
 #!/usr/bin/env prothon
 
-print TempDir
-print TempDir(), TempDir
+def f():
+    if 'static' not in f.attrs_:
+        f.static = 0
+    f.static += 1
+    
+    tmp = f.static
+    def outer.f():
+        f.static += 1
+        return f.static
+    f.static = tmp
+    
+    return f.static
 
-/*
-d = Dir()
-print 'dir:',d, ' len:', len(d), d.path, d.name
-print
-print '--- dirs ---'
-dirs = d.dirs()
-for i in d.numDirs():
-	print "{0:-60.60} {1:17.17}".fmt(dirs[i].path, dirs[i].name)
-print
-print '--- files ---'
-files = d.files()
-for i in d.numFiles():
-	print "{0:-60.60} {1:17.17}".fmt(files[i].path, files[i].name)
-print
+print f()
+print f()
+print f()
 
-files[2].open('r')
-print files[2].read()
-files[2].close()
-
-File("abc/test").delete()
-f = File("abc/test.txt")
-print f, f.exists?(), f.open?()
-f.open('w')
-print f, f.exists?(), f.open?()
-f.write(x"303132")
-print f, f.exists?(), f.open?()
-f.close()
-print f, f.exists?(), f.open?()
-
-d = Dir()
-print d, d.modTime()
-print d, ' len:', len(d), d.path, d.name
-
-files = Dir().files()
-f = files[0]
-print f, f.modTime(), f.size()
-f.setModTime(Time(1080000000000000))
-print f, f.modTime(), f.size()
-f.setModTime(Time(1090000000000000))
-print f, f.modTime(), f.size()
-
-t = TempFile(delOnClose=False)
-print t, t.open?(), t.exists?()
-t.close()
-print t, t.open?(), t.exists?()
-t.delete()
-print t, t.open?(), t.exists?()
-
-*/
\ No newline at end of file

Modified: trunk/src/builtins-core.c
===================================================================
--- trunk/src/builtins-core.c	2004-06-18 06:05:25 UTC (rev 634)
+++ trunk/src/builtins-core.c	2004-06-18 23:55:59 UTC (rev 635)
@@ -76,6 +76,7 @@
 MODULE_DECLARE(Seq);
 MODULE_DECLARE(Func);
 MODULE_DECLARE(Method);
+MODULE_DECLARE(RangeGen);
 
 // ***************************** Object *********************************
 
@@ -827,7 +828,64 @@
 DEF(Func, objList_, FORM_RPARAM) {
 	return parms[1];
 }
+// ***************************** RANGE ****************************************
 
+typedef struct {
+	data_size_t	size;
+	i64_t		value;
+	i64_t		stop;
+	i64_t		step;
+} range_t;
+
+typedef	range_t*	range_p;
+
+MODULE_START(RangeGen)
+{
+	RangeGen_OBJ = NEW_OBJ(Gen_OBJ);
+	MODULE_ADD_TO_OBJ(RangeGen, OBJ(OBJECT), "Range");
+	MODULE_SET_DOC(RangeGen, "range generator object prototype");
+	set_obj_id(RangeGen_OBJ, *, RangeGen);
+}
+
+DEF(Object, range, FPARM3(start, NEW_INT(0), stop, OBJ(NONE), step, OBJ(NONE))) {
+	obj_p range_obj;
+	range_p rangep;
+	i64_t start, stop, step=1;
+
+	INT_64_PARAM(1, start);
+	if (parms[3] != OBJ(NONE)) INT_64_PARAM(2, stop);
+	else { stop = start; start = 0; }
+	if (parms[5] != OBJ(NONE)) INT_64_PARAM(3, step);
+	if (!step) {
+		raise_exception(ist, OBJ(VALUE_EXC), "range increment must be non-zero");
+		return NULL;
+	}
+	range_obj = NEW_OBJ(RangeGen_OBJ);
+	range_obj->data.ptr = rangep = (range_p) pr_malloc(sizeof(range_t));
+	rangep->size  = sizeof(range_t);
+	rangep->value = start;
+	rangep->stop  = stop;
+	rangep->step  = step;
+	return range_obj;
+}
+
+DEF(RangeGen, next, NULL) {
+	obj_p res;
+	range_p rangep;
+	BIN_CONTENT_CHK(RangeGen);
+	rangep = self->data.ptr;
+	if ( rangep->step > 0 && rangep->value >= rangep->stop ||
+		 rangep->step < 0 && rangep->value <= rangep->stop ) {
+		raise_exception(ist, OBJ(STOP_ITERATION_EXC), NULL);
+		return NULL;
+	}
+	res = NEW_INT(rangep->value);
+	rangep->value += rangep->step;
+	return res;
+}
+
+// ***************************** MAIN_MODULE_INIT *****************************
+
 MAIN_MODULE_INIT(Core)
 {
 	MODULE_SUB_INIT(Object);
@@ -872,6 +930,7 @@
 	MODULE_ADD_SYM(Object, notIn__QUES);
 	MODULE_ADD_SYM(Object, CurrentThread);
 	MODULE_ADD_SYM(Object, Sleep);
+	MODULE_ADD_SYM(Object, range);
 	MODULE_ADD_SYM(Object, toStorProxy_);
 	MODULE_ADD_SYM(Object, fromStorProxy_);
 
@@ -918,5 +977,8 @@
 	MODULE_ADD_SYM(Func, unbind);
 	MODULE_ADD_SYM(Func, objList_);
 
+	MODULE_SUB_INIT(RangeGen);
+	MODULE_ADD_SYM(RangeGen, next);
+
 	check_exceptions(ist);
 }

Modified: trunk/src/src.vcproj
===================================================================
--- trunk/src/src.vcproj	2004-06-18 06:05:25 UTC (rev 634)
+++ trunk/src/src.vcproj	2004-06-18 23:55:59 UTC (rev 635)
@@ -92,7 +92,7 @@
 				Name="VCCustomBuildTool"/>
 			<Tool
 				Name="VCLinkerTool"
-				AdditionalDependencies="apr.lib aprutil.lib wsock32.lib"
+				AdditionalDependencies="apr.lib aprutil.lib wsock32.lib Rpcrt4.lib"
 				OutputFile="$(OutDir)/prothon.exe"
 				LinkIncremental="1"
 				AdditionalLibraryDirectories="..\apr\apr\LibR;..\apr\apr-util\LibR"