rev 354 - in trunk: . src
SVN User <[email protected]>
| Newsgroups | gmane.comp.lang.prothon.cvs |
|---|---|
| Message-ID | <[email protected]> |
Author: mark
Date: 2004-04-14 17:52:31 -0400 (Wed, 14 Apr 2004)
New Revision: 354
Modified:
trunk/STATUS.txt
trunk/src/builtins-string.c
Log:
added half-finished string.__mod__() ("x: %d" % 5)
Modified: trunk/STATUS.txt
===================================================================
--- trunk/STATUS.txt 2004-04-14 19:10:53 UTC (rev 353)
+++ trunk/STATUS.txt 2004-04-14 21:52:31 UTC (rev 354)
@@ -3,7 +3,7 @@
--- change all varnames to var_names
---- add list comprehension, list.sort!(), string %
+--- add list comprehension, string %
--- add support for APR_BINARY in File.c ('b' flag)
--- support any object that supports file methods in stdxxx (duck std)
Modified: trunk/src/builtins-string.c
===================================================================
--- trunk/src/builtins-string.c 2004-04-14 19:10:53 UTC (rev 353)
+++ trunk/src/builtins-string.c 2004-04-14 21:52:31 UTC (rev 354)
@@ -110,6 +110,7 @@
return obj;
}
+//********************************* STRING MODULE *****************************
MODULE_DECLARE(String);
MODULE_DECLARE(StringGen);
@@ -136,10 +137,6 @@
return self;
}
-DEF(String, __cdatalen__, NULL) {
- return new_int_obj(ist, sizeof(pr_str_t) + pr_strlen(self) + 1);
-}
-
DEF(String, __hash__, NULL) {
i32_t res = 0x9a7c5e3;
char *p;
@@ -235,6 +232,44 @@
return obj;
}
+typedef union {
+ i64_t i64;
+ double f64;
+ char* str;
+} arg_t;
+
+typedef arg_t* arg_p;
+
+DEF(String, __mod__, FORM_RPARAM) {
+ obj_p argv_obj = parms[1];
+ size_t i, argc;
+ arg_p argv;
+ char* fmt_str = strch(self);
+
+ if ( has_proto_QUES(ist, argv_obj, OBJ(STRING_PROTO)) ||
+ !has_proto_QUES(ist, argv_obj, OBJ(SEQ_PROTO)) ) {
+ argv_obj = new_list_obj(ist, 1);
+ list_append(ist, argv_obj, parms[1]);
+ }
+ argc = list_len(ist, argv_obj);
+ argv = pr_malloc(argc * sizeof(arg_t));
+ for (i=0; i < argc; i++) {
+ obj_p arg_obj = list_item(ist, argv_obj, (int) i);
+ if (has_proto_QUES(ist, arg_obj, OBJ(INT_PROTO)))
+ argv[i].i64 = arg_obj->data.i64;
+ else if (has_proto_QUES(ist, arg_obj, OBJ(FLOAT_PROTO)))
+ argv[i].f64 = arg_obj->data.f64;
+ else if (has_proto_QUES(ist, arg_obj, OBJ(STRING_PROTO)))
+ argv[i].str = strch(arg_obj);
+ else {
+ raise_exception(ist, OBJ(TYPE_EXC), "invalid type for string (%) format");
+ return NULL;
+ }
+ }
+ // ben: your argc and argv are ready for use on fmt_str and return resulting string
+ return self;
+}
+
DEF(String, __gen__, NULL) {
obj_p gen_obj = new_object(ist, StringGen_OBJ);
gen_obj->data_type = DATA_TYPE_DATAPTR;
@@ -323,6 +358,13 @@
else return OBJ(PR_FALSE);
}
+DEF(String, __cdatalen__, NULL) {
+ return new_int_obj(ist, sizeof(pr_str_t) + pr_strlen(self) + 1);
+}
+
+
+//********************************* STRINGGEN MODULE **************************
+
MODULE_START(StringGen)
{
StringGen_OBJ = new_object(ist, NULL);
@@ -347,6 +389,8 @@
+//********************************* MODULES INIT ******************************
+
MAIN_MODULE_INIT(String)
{
MODULE_SUB_INIT(String);
@@ -354,13 +398,13 @@
MODULE_ADD_SYM(String, __bool__QUES);
MODULE_ADD_SYM(String, __str__);
MODULE_ADD_SYM(String, __hash__);
- MODULE_ADD_SYM(String, __cdatalen__);
MODULE_ADD_SYM(String, cmp);
MODULE_ADD_SYM(String, ord);
MODULE_ADD_SYM(String, len);
MODULE_ADD_SYM(String, __getitem__);
MODULE_ADD_SYM(String, __add__);
MODULE_ADD_SYM(String, __mul__);
+ MODULE_ADD_SYM(String, __mod__);
MODULE_ADD_SYM(String, __gen__);
MODULE_ADD_SYM(String, join);
MODULE_ADD_SYM(String, __in__QUES);
@@ -368,6 +412,7 @@
MODULE_ADD_SYM(String, __setitem__);
MODULE_ADD_SYM(String, __delitem__);
MODULE_ADD_SYM(String, __objlist__);
+ MODULE_ADD_SYM(String, __cdatalen__);
MODULE_SUB_INIT(StringGen);
MODULE_ADD_SYM(StringGen, next);