rev 601 - in trunk: . src

SVN User <[email protected]> Fri, 11 Jun 2004 05:23:55 -0400
Newsgroups gmane.comp.lang.prothon.cvs
Message-ID <[email protected]>
Author: mark
Date: 2004-06-11 05:23:52 -0400 (Fri, 11 Jun 2004)
New Revision: 601

Modified:
   trunk/STATUS.txt
   trunk/src/builtins-string.c
Log:
added 24-bit char support to cmp(a,b) and case methods

Modified: trunk/STATUS.txt
===================================================================
--- trunk/STATUS.txt	2004-06-11 08:36:24 UTC (rev 600)
+++ trunk/STATUS.txt	2004-06-11 09:23:52 UTC (rev 601)
@@ -1,7 +1,6 @@
 
 ----------------------- TO-DO (highest priority first) ------------------------
 
---- support 24-bit chars in cmp, case methods
 --- 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 08:36:24 UTC (rev 600)
+++ trunk/src/builtins-string.c	2004-06-11 09:23:52 UTC (rev 601)
@@ -75,12 +75,12 @@
 	  (((ch3p)->b1)==0)                                 && \
 	  (((ch3p)->b2)==0)  )
 
-#define ORD(ch3p)  (((u32_t)(ch3p)->b0)+((((u32_t)(ch3p)->b1)+(((u32_t)(ch3p)->b2)*256))*256))
+#define ORD(ch3p) ((((((u32_t)(ch3p)->b2)<<8)|((ch3p)->b1))<<8)|((ch3p)->b0))
 
 #define CH3EQ(ch3p1, ch3p2)					\
 	(	(((ch3p1)->b0)==((ch3p2)->b0)) &&	\
 		(((ch3p1)->b1)==((ch3p2)->b1)) &&	\
-		(((ch3p1)->b2)==((ch3p2)->b2))  )
+		(((ch3p1)->b2)==((ch3p2)->b2))   )
 
 MODULE_DECLARE(String);
 MODULE_DECLARE(StringGen);
@@ -257,29 +257,37 @@
 		}
 	}
 }
+
+//********************************* pr_tolower ********************************
+void pr_tolower(ch3_p ch3p) {
+	if (ch3p->b0 > 127 || ch3p->b1 || ch3p->b2) 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;
+	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, int (*changer)(int), size_t howMany) {
-	size_t str_len = pr_strlen(self), ii = 0;
-	char *src_ptr, *dest_ptr = 0;
+static obj_p changeCase(isp ist,obj_p self, void (*changer)(ch3_p), size_t howMany) {
+	size_t str_len = pr_strlen(self), i;
+	ch3_p src_ptr;
 	int atStart = 1;
-
-	dest_ptr = pr2c_strptr(ist, self);
-
-	// Change the copy.
-	src_ptr  = pr2c_strptr(ist, self);
-	for (ii=0; ii<str_len; ++ii) {
+	obj_p res = copy_object(ist, self);
+	src_ptr  = pr_ch3ptr(res);
+	for (i=0; i < str_len; ++i) {
 		if (howMany == AT_WORD_START) {
-			if (atStart)
-				dest_ptr[ii] = (char)(*changer)(src_ptr[ii]);
-			if (isspace(src_ptr[ii])) atStart = 1; else atStart = 0;
+			if (atStart) (*changer)(src_ptr+i);
+			if (IS_SPACE(src_ptr+i)) atStart = 1; else atStart = 0;
 		} else {
-			if (ii<howMany)
-				dest_ptr[ii] = (char)(*changer)(src_ptr[ii]);
+			if (i<howMany) (*changer)(src_ptr+i);
 		}
 	}
-	return NEW_STRING(dest_ptr);
+	return res;
 }
 
 //********************************* ch3_strstr ********************************
@@ -412,6 +420,9 @@
 
 DEF(String, cmp, FORM_RPARAM){
 	obj_p other = parms[1];
+	data_size_t i, slen, olen, len;
+	ch3_p sptr, optr;
+
 	BIN_CONTENT_CHK(String);
 	if (self == other)
 		return NEW_INT(0);
@@ -419,7 +430,18 @@
 		raise_exception(ist, OBJ(TYPE_EXC), "Cannot compare a string and non-string");
 		return NULL;
 	}
-	return NEW_INT(strcmp(pr2c_strptr(ist, self), pr2c_strptr(ist, other)));
+	slen = pr_strlen(self);
+	olen = pr_strlen(other);
+	sptr = pr_ch3ptr(self);
+	optr = pr_ch3ptr(other);
+	len = min(slen, olen);
+	for (i=0; i < len; i++) {
+		if (ORD(sptr+i) < ORD(optr+i)) return NEW_INT(-1);
+		if (ORD(sptr+i) > ORD(optr+i)) return NEW_INT(+1);
+	}
+	if (slen == olen) return NEW_INT(0);
+	if (slen < olen)  return NEW_INT(-1);
+	return NEW_INT(+1);
 }
 
 DEF(String, add_, FORM_RPARAM){
@@ -613,22 +635,22 @@
 
 DEF(String, lower, NULL) {
 	BIN_CONTENT_CHK(String);
-	return changeCase(ist,self,&tolower,pr_strlen(self));
+	return changeCase(ist,self,&pr_tolower,pr_strlen(self));
 }
 
 DEF(String, upper, NULL) {
 	BIN_CONTENT_CHK(String);
-	return changeCase(ist,self,&toupper,pr_strlen(self));
+	return changeCase(ist,self,&pr_toupper,pr_strlen(self));
 }
 
 DEF(String, capitalize, NULL) {
 	BIN_CONTENT_CHK(String);
-	return changeCase(ist,self,&toupper,1);
+	return changeCase(ist,self,&pr_toupper,1);
 }
 
 DEF(String, capWords, NULL) {
 	BIN_CONTENT_CHK(String);
-	return changeCase(ist,self,&toupper,AT_WORD_START);
+	return changeCase(ist,self,&pr_toupper,AT_WORD_START);
 }
 
 DEF(String, find, FPARM2( stringToFind, NULL, indexToStartLooking, NEW_INT(0) )) {