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");