rev 525 - in trunk: docs/tutorial src

SVN User <[email protected]> Fri, 21 May 2004 00:25:34 -0400
Newsgroups gmane.comp.lang.prothon.cvs
Message-ID <[email protected]>
Author: mark
Date: 2004-05-21 00:25:31 -0400 (Fri, 21 May 2004)
New Revision: 525

Modified:
   trunk/docs/tutorial/index.htm
   trunk/src/builtins-core.c
   trunk/src/builtins-string.c
   trunk/src/symbol.c
Log:
Added Symbol.init_() and changed String.init_() so you can 
do Symbol("abc") and String(`abc)

Modified: trunk/docs/tutorial/index.htm
===================================================================
--- trunk/docs/tutorial/index.htm	2004-05-21 02:44:32 UTC (rev 524)
+++ trunk/docs/tutorial/index.htm	2004-05-21 04:25:31 UTC (rev 525)
@@ -59,7 +59,19 @@
         <p>Like Prothon itself, the tutorial is not finished. The following topics 
           are not covered yet: print statement, import, modules, packages, list 
           comprehensions, try/finally, security system, files, console line editing. 
-          Email <a href="mailto:[email protected]">me</a> about any things I've 
+          Email 
+		  
+		  <script language="javascript">
+
+	var name = "mark@";
+
+	var domain = "prothon.org";
+
+	document.write ("<a href=mailto:" + name + domain + ">me</a>");
+
+</script>
+		  
+		   about any things I've 
           not covered that aren't on this list.</p>
         <p align="center"><font size="-1">This tutorial is copyright Mark Hahn, 
           2004, all rights reserved. </font></p>
Modified: trunk/src/builtins-core.c
===================================================================
--- trunk/src/builtins-core.c	2004-05-21 02:44:32 UTC (rev 524)
+++ trunk/src/builtins-core.c	2004-05-21 04:25:31 UTC (rev 525)
@@ -400,9 +400,18 @@
 	set_obj_id(Symbol_OBJ, *, Symbol);
 }
 
+DEF(Symbol, init_,  FORM_RPARAM) {
+	char* str;
+	BIN_EMPTY_CHK();
+	STRING_PARAM(1, str);
+	del_unlock(self);
+	return sym(ist, str); 
+}
+
 DEF(Symbol, str_,  NULL) { 
 	obj_p str_obj = get_attr(ist, self, SYM(STRING_));
 	char buf[512];
+	BIN_STR_CHK(Symbol);
 	apr_snprintf(buf, sizeof(buf), "`%s", pr_strptr(str_obj));
 	return NEW_STRING(buf); 
 }
@@ -838,6 +847,7 @@
 	MODULE_ADD_SYM(Object, fromStorProxy_);
 
 	MODULE_SUB_INIT(Symbol);
+	MODULE_ADD_SYM(Symbol, init_);
 	MODULE_ADD_SYM(Symbol, str_);
 
 	MODULE_SUB_INIT(Seq);

Modified: trunk/src/builtins-string.c
===================================================================
--- trunk/src/builtins-string.c	2004-05-21 02:44:32 UTC (rev 524)
+++ trunk/src/builtins-string.c	2004-05-21 04:25:31 UTC (rev 525)
@@ -211,8 +211,13 @@
 	BIN_EMPTY_CHK();
 	if (!list_len(ist, parms[1])) 
 		s = "";
-	else
-		s = as_str(ist, list_item(ist, parms[1], 0));
+	else {
+		obj_p obj = list_item(ist, parms[1], 0);
+		if (has_proto_QUES(ist, obj, OBJ(SYMBOL_PROTO)))
+			s = symch(ist, obj);
+		else
+			s = as_str(ist, obj);
+	}
 	set_string_data(ist, self, s, strlen(s));
 	return OBJ(NONE);
 }

Modified: trunk/src/symbol.c
===================================================================
--- trunk/src/symbol.c	2004-05-21 02:44:32 UTC (rev 524)
+++ trunk/src/symbol.c	2004-05-21 04:25:31 UTC (rev 525)
@@ -224,10 +224,26 @@
 	obj_p sym;
 	int i;
 	size_t len = strlen(s_in);
-	char* s = pr_malloc(len+1);
+	char *p, *s = pr_malloc(len+1);
 	strcpy(s, s_in);
 	if (!strcmp(s+len-5, "_BANG")) strcpy(s+len-5, "!");
 	if (!strcmp(s+len-5, "_QUES")) strcpy(s+len-5, "?");
+	if (!*s) goto bad_sym;
+	if (! ( *s >= 'a' && *s <= 'z' || 
+		    *s >= 'A' && *s <= 'Z' || *s == '_' ) ) goto bad_sym;
+	for (p=s+1; *p; p++) {
+		if (! ( *p >= 'a' && *p <= 'z' || 
+				*p >= 'A' && *p <= 'Z' || 
+				*p >= '0' && *p <= '9' || 
+				*p == '_' || *p == '!' || *p == '?' ) ) goto bad_sym;
+		if ((*p == '!' || *p == '?') && *(p+1)) goto bad_sym;
+	}
+	goto good_sym;
+bad_sym:
+	raise_exception(ist, OBJ(INTERPRETER_EXC), "invalid symbol: '%s'", s);
+	pr_free(s);
+	return NULL;
+good_sym:
 	pr_lock(&symbol_tree_lock);
 	sym = search_trie(symbol_tree, s);
 	if (sym) {