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) )) {