rev 603 - in trunk: . src

SVN User <[email protected]> Fri, 11 Jun 2004 19:57:49 -0400
Newsgroups gmane.comp.lang.prothon.cvs
Message-ID <[email protected]>
Author: mark
Date: 2004-06-11 19:57:46 -0400 (Fri, 11 Jun 2004)
New Revision: 603

Modified:
   trunk/STATUS.txt
   trunk/src/builtins-string.c
   trunk/src/prothon.y
Log:
chnaged octal constant format from 0377 to 0c377

Modified: trunk/STATUS.txt
===================================================================
--- trunk/STATUS.txt	2004-06-11 20:09:25 UTC (rev 602)
+++ trunk/STATUS.txt	2004-06-11 23:57:46 UTC (rev 603)
@@ -6,7 +6,6 @@
 --- unicode module
 		http://www.prothon.org/pipermail/prothon-user/2004-June/001895.html
 		
-
 --- implement new string.fmt(): 
 		"abc{var:spec}def{0:spec}ghi".fmt('posvalue', var='kwvalue')
 

Modified: trunk/src/builtins-string.c
===================================================================
--- trunk/src/builtins-string.c	2004-06-11 20:09:25 UTC (rev 602)
+++ trunk/src/builtins-string.c	2004-06-11 23:57:46 UTC (rev 603)
@@ -82,6 +82,13 @@
 		(((ch3p1)->b1)==((ch3p2)->b1)) &&	\
 		(((ch3p1)->b2)==((ch3p2)->b2))   )
 
+// only valid for Unicode 3.0 and prior versions
+#define IF_NO_CASE(ch)							\
+	if ( ((0x2500 <= ch) && (ch <= 0xFEFF)) ||	\
+		 ((0x0600 <= ch) && (ch <= 0x1DFF)) ||	\
+		 ((0x2000 <= ch) && (ch <= 0x20FF)) ||	\
+		 ((0x2200 <= ch) && (ch <= 0x23FF)) ) 
+
 MODULE_DECLARE(String);
 MODULE_DECLARE(StringGen);
 
@@ -259,21 +266,31 @@
 }
 
 //********************************* pr_tolower ********************************
-void pr_tolower(ch3_p ch3p) {
-	if (ch3p->b0 > 127 || ch3p->b1 || ch3p->b2) return;
+void pr_tolower(isp ist, ch3_p ch3p) {
+	if (ch3p->b1 || ch3p->b2) {
+		u32_t ch = ORD(ch3p);
+		IF_NO_CASE(ch) return;
+		raise_exception(ist, OBJ(VALUE_EXC), "lower case unknown for this character value: 0x%x", ch);
+		return;
+	}
 	ch3p->b0 = (u8_t) tolower((char)(ch3p->b0));
 }
 
 //********************************* pr_toupper ********************************
-void pr_toupper(ch3_p ch3p) {
-	if (ch3p->b0 > 127 || ch3p->b1 || ch3p->b2) return;
+void pr_toupper(isp ist, ch3_p ch3p) {
+	if (ch3p->b1 || ch3p->b2) {
+		u32_t ch = ORD(ch3p);
+		IF_NO_CASE(ch) return;
+		raise_exception(ist, OBJ(VALUE_EXC), "upper case unknown for this character value: 0x%x", ch);
+		return;
+	}
 	ch3p->b0 = (u8_t) toupper((char)(ch3p->b0));
 }
 
 //********************************* changeCase ********************************
 // Generic case-changer function.
 #define AT_WORD_START -1
-static obj_p changeCase(isp ist,obj_p self, void (*changer)(ch3_p), size_t howMany) {
+static obj_p changeCase(isp ist, obj_p self, void (*changer)(isp, ch3_p), size_t howMany) {
 	size_t str_len = pr_strlen(self), i;
 	ch3_p src_ptr;
 	int atStart = 1;
@@ -281,10 +298,10 @@
 	src_ptr  = pr_ch3ptr(res);
 	for (i=0; i < str_len; ++i) {
 		if (howMany == AT_WORD_START) {
-			if (atStart) (*changer)(src_ptr+i);
+			if (atStart) (*changer)(ist, src_ptr+i); if_exc_return NULL;
 			if (IS_SPACE(src_ptr+i)) atStart = 1; else atStart = 0;
 		} else {
-			if (i<howMany) (*changer)(src_ptr+i);
+			if (i<howMany) (*changer)(ist, src_ptr+i); if_exc_return NULL;
 		}
 	}
 	return res;
@@ -324,8 +341,7 @@
 
 //********************************* STRING MODULE *****************************
 
-MODULE_START(String)
-{
+MODULE_START(String) {
 	String_OBJ = OBJ(STRING_PROTO);
 	MODULE_SET_DOC(String, "string object prototype");
 	set_obj_id(String_OBJ, *, String);

Modified: trunk/src/prothon.y
===================================================================
--- trunk/src/prothon.y	2004-06-11 20:09:25 UTC (rev 602)
+++ trunk/src/prothon.y	2004-06-11 23:57:46 UTC (rev 603)
@@ -1172,7 +1172,7 @@
 	/* process dot, int, or float */
 	if (c == '.'  || (c >= '0' && c <= '9') ) {
 		int imag_flag=0, nonzero_flag=0, past_e_flag=0;
-		int hex_flag=0, int_dot_flag=0;
+		int octal_flag=0, hex_flag=0, int_dot_flag=0;
 		int str_index=0, cur_size=INITIAL_STRING_ALLOC;
 		char* str_ptr = pr_malloc(cur_size);
 		
@@ -1192,18 +1192,21 @@
 			if (!(c2 >= '0' && c2 <= '9') )
 				return '.';
 		} else {
-			while ( ((c=getch(state)) >= '0' && c <= '9')				 ||
-				(hex_flag && ((c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F'))) ||
+			while ( ((c=getch(state)) >= '0' && c <= '9')				             ||
+				    (hex_flag && ((c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F'))) ||
 			        (str_index == 1 && str_ptr[0] == '0' && (c == 'x' || c == 'X'))	 ||
-			         c == 'l' || c == 'L' || c == 'j' || c == 'J' || c == '_' ) {
+			        (str_index == 1 && str_ptr[0] == '0' && (c == 'c' || c == 'C'))	 ||
+			                                       c == 'j' || c == 'J' || c == '_' ) {
 			    if (c != '_')
 					add_string(c, &str_ptr, &str_index, &cur_size);
-				if (c == 'x' || c == 'X')
+				if (c == 'c' || c == 'C')
+					octal_flag = 1;
+				else if (c == 'x' || c == 'X')
 					hex_flag = 1;
+				else if (c != '0')
+					nonzero_flag = 1;
 				if ((imag_flag = (c == 'j' || c == 'J')))
 					break;
-				if (c != '0' && c != 'x' && c != 'X')
-					nonzero_flag = 1;
 			}
 			if (c == '.') {
 				if ((c=getch(state)) < '0' || c > '9')
@@ -1211,21 +1214,21 @@
 				ungetch(c, state);
 				c = '.';
 			}
-			if (hex_flag || int_dot_flag || (c != '.' && c != 'e' && c != 'E')){
+			if (octal_flag || hex_flag || int_dot_flag || (c != '.' && c != 'e' && c != 'E')){
 				if (imag_flag)
 					str_index--;
 				else
 					ungetch(c, state);
 				str_ptr[str_index++] = 0;
 				if (hex_flag) {
-					lvalp->int_type = new_int_long_obj( IST, cstr2longp(IST, str_ptr+2, NULL, 16) );
-				} else if (str_ptr[0] == '0' && strlen(str_ptr) > 2) {
-					lvalp->int_type = new_int_long_obj( IST, cstr2longp(IST, str_ptr+1, NULL, 8) );
+					lvalp->int_type = new_int_long_obj(IST, cstr2longp(IST, str_ptr+2, NULL, 16));
+				} else if (octal_flag) {
+					lvalp->int_type = new_int_long_obj(IST, cstr2longp(IST, str_ptr+2, NULL, 8));
 				} else {
 					if (strlen(str_ptr) < 16)
 						lvalp->int_type = new_int_obj(IST, apr_atoi64(str_ptr));
 					else
-						lvalp->int_type = new_int_long_obj( IST, cstr2longp(IST, str_ptr, NULL, 10) );
+						lvalp->int_type = new_int_long_obj(IST, cstr2longp(IST, str_ptr, NULL, 10));
 				}
 				if (nonzero_flag && int_is_zero(lvalp->int_type)){
 					printf("Lexical error: invalid integer number format\n");