rev 615 - in trunk: . pr/test src
SVN User <[email protected]> Sat, 12 Jun 2004 22:59:54 -0400
| Newsgroups | gmane.comp.lang.prothon.cvs |
|---|---|
| Message-ID | <[email protected]> |
Author: mark
Date: 2004-06-12 22:59:52 -0400 (Sat, 12 Jun 2004)
New Revision: 615
Added:
trunk/pr/test/intstr.pr
Modified:
trunk/STATUS.txt
trunk/pr/test/test.pr
trunk/src/builtins-int.c
trunk/src/interp.c
trunk/src/prothon.y
Log:
finished Int.str_(spec), added intstr.pr
Modified: trunk/STATUS.txt
===================================================================
--- trunk/STATUS.txt 2004-06-13 00:15:06 UTC (rev 614)
+++ trunk/STATUS.txt 2004-06-13 02:59:52 UTC (rev 615)
@@ -1,12 +1,12 @@
----------------------- TO-DO (highest priority first) ------------------------
---- add int.str_(spec), float.str_(spec), and vars_ default for str.fmt()
+--- float.str_(spec), and vars_ default for str.fmt()
--- support list and dictionary object params in string.fmt() ???
--- add \u0000 \U00000000 and \N{name} esc sequences
---- unicode module
+--- unicode module - codecs
mask off top 3 bits
http://www.prothon.org/pipermail/prothon-user/2004-June/001913.html
http://www.prothon.org/pipermail/prothon-user/2004-June/001895.html
Added: trunk/pr/test/intstr.pr
===================================================================
--- trunk/pr/test/intstr.pr 2004-06-13 00:15:06 UTC (rev 614)
+++ trunk/pr/test/intstr.pr 2004-06-13 02:59:52 UTC (rev 615)
@@ -0,0 +1,44 @@
+#!/usr/bin/env prothon
+
+def test(n, evalstr, exp):
+ exec 'res = ' + evalstr
+ if res != exp:
+ print "test", n, 'failed'
+ print 'evaluating:', evalstr
+ print 'expected: ', exp
+ print 'found: ', res
+ sys.exit(1)
+
+test(1, '"{0}".fmt(1276876)', '1276876')
+test(2, '"{0}".fmt(-1276876)', '-1276876')
+test(3, '"{0:d}".fmt(1276876)', '1276876')
+test(4, '"{0:d}".fmt(-1276876)', '-1276876')
+test(5, '"{0:o}".fmt(1276876)', '4675714')
+test(6, '"{0:o}".fmt(-1276876)', '-4675714')
+test(7, '"{0:#o}".fmt(1276876)', '0o4675714')
+test(8, '"{0:#o}".fmt(-1276876)', '-0o4675714')
+test(9, '"{0:x}".fmt(1276876)', '137bcc')
+test(10, '"{0:x}".fmt(-1276876)', '-137bcc')
+test(11, '"{0:#x}".fmt(1276876)', '0x137bcc')
+test(12, '"{0:#x}".fmt(-1276876)', '-0x137bcc')
+test(13, '"{0:X}".fmt(1276876)', '137BCC')
+test(14, '"{0:X}".fmt(-1276876)', '-137BCC')
+test(15, '"{0:#X}".fmt(1276876)', '0x137BCC')
+test(16, '"{0:#X}".fmt(-1276876)', '-0x137BCC')
+test(17, '"{0}".fmt(12768766576576563764)', '12768766576576563764')
+test(18, '"{0}".fmt(-12768766576576563764)', '-12768766576576563764')
+test(19, '"{0:10}".fmt(12345)', ' 12345')
+test(20, '"{0:-10}".fmt(12345)', '12345 ')
+test(21, '"{0:10.7}".fmt(12345)', ' 0012345')
+test(22, '"{0:10.7}".fmt(-12345)', ' -0012345')
+test(23, '"{0:+10.7}".fmt(12345)', ' +0012345')
+test(24, '"{0:+10.7}".fmt(-12345)', ' -0012345')
+test(25, '"{0: }".fmt(12345)', ' 12345')
+test(26, '"{0: }".fmt(-12345)', '-12345')
+test(27, '"{0:-+10.7}".fmt(-12345)', '-0012345 ')
+test(28, '"{0:2c}".fmt(0x31)', ' 1')
+test(29, '"{0:-2c}".fmt(0x31)', '1 ')
+
+print """
+all tests passed
+"""
\ No newline at end of file
Property changes on: trunk/pr/test/intstr.pr
___________________________________________________________________
Name: svn:eol-style
+ native
Modified: trunk/pr/test/test.pr
===================================================================
--- trunk/pr/test/test.pr 2004-06-13 00:15:06 UTC (rev 614)
+++ trunk/pr/test/test.pr 2004-06-13 02:59:52 UTC (rev 615)
@@ -1,39 +1,42 @@
#!/usr/bin/env prothon
-import re
+def test(n, evalstr, exp):
+ exec 'res = ' + evalstr
+ if res != exp:
+ print "test", n, 'failed'
+ print 'evaluating:', evalstr
+ print 'expected: ', exp
+ print 'found: ', res
+ sys.exit(1)
-def findAll(r,s):
- result=[]
- def foundOne(mo):
- outer.result.append!(mo.group())
- return ''
- r.sub(foundOne, s)
- return result
+test(1, '"{0}".fmt(1276876)', '1276876')
+test(2, '"{0}".fmt(-1276876)', '-1276876')
+test(3, '"{0:d}".fmt(1276876)', '1276876')
+test(4, '"{0:d}".fmt(-1276876)', '-1276876')
+test(5, '"{0:o}".fmt(1276876)', '4675714')
+test(6, '"{0:o}".fmt(-1276876)', '-4675714')
+test(7, '"{0:#o}".fmt(1276876)', '0o4675714')
+test(8, '"{0:#o}".fmt(-1276876)', '-0o4675714')
+test(9, '"{0:x}".fmt(1276876)', '137bcc')
+test(10, '"{0:x}".fmt(-1276876)', '-137bcc')
+test(11, '"{0:#x}".fmt(1276876)', '0x137bcc')
+test(12, '"{0:#x}".fmt(-1276876)', '-0x137bcc')
+test(13, '"{0:X}".fmt(1276876)', '137BCC')
+test(14, '"{0:X}".fmt(-1276876)', '-137BCC')
+test(15, '"{0:#X}".fmt(1276876)', '0x137BCC')
+test(16, '"{0:#X}".fmt(-1276876)', '-0x137BCC')
+test(17, '"{0}".fmt(12768766576576563764)', '12768766576576563764')
+test(18, '"{0}".fmt(-12768766576576563764)', '-12768766576576563764')
+test(19, '"{0:10}".fmt(12345)', ' 12345')
+test(20, '"{0:-10}".fmt(12345)', '12345 ')
+test(21, '"{0:10.7}".fmt(12345)', ' 0012345')
+test(22, '"{0:10.7}".fmt(-12345)', ' -0012345')
+test(23, '"{0:+10.7}".fmt(12345)', ' +0012345')
+test(24, '"{0:+10.7}".fmt(-12345)', ' -0012345')
+test(25, '"{0: }".fmt(12345)', ' 12345')
+test(26, '"{0: }".fmt(-12345)', '-12345')
+test(27, '"{0:-+10.7}".fmt(-12345)', '-0012345 ')
-re = re.compile("m..k")
-
-s = 'this mark likes to muck around in minks'
-
-print findAll(re, s)
-
-print re.findAll(s)
-
-print re.split(s, 2)
-
-mo = re.search(s, 10)
-
-print mo.group(), mo.groups()
-
-re = re.compile(" (m..k) (l..e)")
-
-mo = re.search(s, 2, 20)
-
-print mo.group(), mo.groups(), mo.expand(r'grp1:<\1> grp2:<\2>')
-
-print "\n-------- above should look like ... -------------\n"
-
-print "['mark', 'muck', 'mink']"
-print "['mark', 'muck', 'mink']"
-print "['this ', ' likes to ', ' around in minks']"
-print "mark ('mark')"
-print " mark like (' mark like', 'mark', 'like') grp1:<mark> grp2:<like>"
+print """
+all tests passed
+"""
\ No newline at end of file
Modified: trunk/src/builtins-int.c
===================================================================
--- trunk/src/builtins-int.c 2004-06-13 00:15:06 UTC (rev 614)
+++ trunk/src/builtins-int.c 2004-06-13 02:59:52 UTC (rev 615)
@@ -80,7 +80,6 @@
#endif
#define Py_IS_INFINITY(X) ((X) && (X)*0.5 == (X))
-
#ifdef WIN32
#define MAX32 0x000000003fffffff
#define MAX64 0x3fffffffffffffff
@@ -2116,25 +2115,26 @@
}
DEF(Int, str_, FPARM1(spec, NEW_STRING(""))) {
- obj_p self_str;
+ obj_p res, self_str;
char *spec, *wid_p = NULL, *prec_p = NULL, *p;
+ int neg_flag;
int left_align = FALSE;
- int num_flag = FALSE;
+ int hdr_flag = FALSE;
int blnk_flag = FALSE;
- int sign_flag = FALSE;
+ int pos_flag = FALSE;
int chr_flag = FALSE;
int oct_flag = FALSE;
int hex_flag = FALSE;
int heX_flag = FALSE;
- int self_len;
- ch3_p self_ptr;
+ int i, res_len, self_len, txt_len, width, precision;
+ ch3_p res_ptr, self_ptr, ptr;
BIN_STR_CHK(Int);
STRING_PARAM(1, spec);
for(p=spec; *p; p++) {
if (!wid_p && !prec_p && *p == '-') left_align = TRUE;
- else if (!wid_p && !prec_p && *p == '#') num_flag = TRUE;
+ else if (!wid_p && !prec_p && *p == '#') hdr_flag = TRUE;
else if (!wid_p && !prec_p && *p == ' ') blnk_flag = TRUE;
- else if (!wid_p && !prec_p && *p == '+') sign_flag = TRUE;
+ else if (!wid_p && !prec_p && *p == '+') pos_flag = TRUE;
else if (!wid_p && !prec_p && *p > '0' && *p <= '9') wid_p = p;
else if (!prec_p && *p == '.') { prec_p = p+1; *p = 0; }
else if ( *p == 'd' || *p == 'D' || *p == 'i' || *p == 'I' ||
@@ -2146,9 +2146,9 @@
return NULL;
}
if (*p == 'c' || *p == 'C') chr_flag = TRUE;
- if (*p == 'o' || *p == 'O') oct_flag = TRUE;
- if (*p == 'x') hex_flag = TRUE;
- if (*p == 'X') heX_flag = TRUE;
+ else if (*p == 'o' || *p == 'O') oct_flag = TRUE;
+ else if (*p == 'x') hex_flag = TRUE;
+ else if (*p == 'X') heX_flag = TRUE;
*p = 0;
break;
} else if (*p < '0' || *p > '9') {
@@ -2162,7 +2162,13 @@
} else if (self->data_type == DATA_TYPE_IMMDATA) {
char str[32], *p, *pend;
i64_t val = int2i64t(ist, self);
- int neg_flag = (val < 0);
+ neg_flag = (val < 0);
+ if (oct_flag) {
+ long_p longp = new_longp(val);
+ self_str = long_format(longp, 8, FALSE);
+ pr_free(longp);
+ goto gotstr;
+ }
str[0] = '-';
if (neg_flag) val = -val;
if (hex_flag || heX_flag)
@@ -2179,9 +2185,63 @@
int base = ((hex_flag|heX_flag) ? 16 : (oct_flag ? 8 : 10));
self_str = long_format(self->data.ptr, base, heX_flag);
}
+gotstr:
+ if (wid_p) width = atoi(wid_p);
+ if (prec_p) precision = atoi(prec_p);
self_ptr = pr_ch3ptr(self_str);
self_len = pr_strlen(self_str);
- return self_str;
+ if (self_ptr->b0 == (u8_t) '-') {
+ self_ptr++;
+ self_len--;
+ blnk_flag = FALSE;
+ pos_flag = FALSE;
+ neg_flag = TRUE;
+ } else
+ neg_flag = FALSE;
+ if (pos_flag) blnk_flag = FALSE;
+ if (!oct_flag && !hex_flag && !heX_flag) hdr_flag = FALSE;
+ if (prec_p)
+ txt_len = max(self_len, precision);
+ else
+ txt_len = self_len;
+ if (pos_flag || neg_flag || blnk_flag) txt_len++;
+ if (hdr_flag) txt_len += 2;
+ if (wid_p)
+ res_len = max(txt_len, width);
+ else
+ res_len = txt_len;
+ ptr = res_ptr = pr_malloc(res_len*3);
+ if (!left_align)
+ for (i=0; i < res_len-txt_len; i++, ptr++) {
+ ptr->b0 = (u8_t) ' '; ptr->b1 = 0; ptr->b2 = 0;
+ }
+ if (pos_flag) { ptr->b0 = (u8_t) '+'; ptr->b1 = 0; ptr->b2 = 0; ptr++; }
+ if (neg_flag) { ptr->b0 = (u8_t) '-'; ptr->b1 = 0; ptr->b2 = 0; ptr++; }
+ if (blnk_flag) { ptr->b0 = (u8_t) ' '; ptr->b1 = 0; ptr->b2 = 0; ptr++; }
+ if (hdr_flag & oct_flag) {
+ ptr->b0 = (u8_t) '0'; ptr->b1 = 0; ptr->b2 = 0; ptr++;
+ ptr->b0 = (u8_t) 'o'; ptr->b1 = 0; ptr->b2 = 0; ptr++;
+ }
+ if (hdr_flag & (hex_flag|heX_flag)) {
+ ptr->b0 = (u8_t) '0'; ptr->b1 = 0; ptr->b2 = 0; ptr++;
+ ptr->b0 = (u8_t) 'x'; ptr->b1 = 0; ptr->b2 = 0; ptr++;
+ }
+ if (prec_p)
+ for (i=0; i < (precision-self_len); i++, ptr++) {
+ ptr->b0 = (u8_t) '0'; ptr->b1 = 0; ptr->b2 = 0;
+ }
+ for (i=0; i < self_len; i++, ptr++, self_ptr++) {
+ ptr->b0 = self_ptr->b0;
+ ptr->b1 = self_ptr->b1;
+ ptr->b2 = self_ptr->b2;
+ }
+ if (left_align)
+ for (i=0; i < res_len-txt_len; i++, ptr++) {
+ ptr->b0 = (u8_t) ' '; ptr->b1 = 0; ptr->b2 = 0;
+ }
+ res = new_string_ch3_obj(ist, res_ptr, res_len);
+ pr_free(res_ptr);
+ return res;
}
DEF(Int, bool__QUES, NULL) {
Modified: trunk/src/interp.c
===================================================================
--- trunk/src/interp.c 2004-06-13 00:15:06 UTC (rev 614)
+++ trunk/src/interp.c 2004-06-13 02:59:52 UTC (rev 615)
@@ -1165,7 +1165,6 @@
new_frame->prev_frame = frame;
frame->next_frame = new_frame;
switch_frame = new_frame;
- fr_push(OBJ(NONE));
} break;
case OP_OBJBIND: {
obj_p bindee, bound_meth;
Modified: trunk/src/prothon.y
===================================================================
--- trunk/src/prothon.y 2004-06-13 00:15:06 UTC (rev 614)
+++ trunk/src/prothon.y 2004-06-13 02:59:52 UTC (rev 615)
@@ -1221,14 +1221,33 @@
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));
+ long_p longp = cstr2longp(IST, str_ptr+2, NULL, 16);
+ if (IST->exception_obj) {
+ IST->exception_obj = NULL;
+ printf("Lexical error: invalid hex number\n");
+ return ERR;
+ }
+ lvalp->int_type = new_int_long_obj(IST, longp);
} else if (octal_flag) {
- lvalp->int_type = new_int_long_obj(IST, cstr2longp(IST, str_ptr+2, NULL, 8));
+ long_p longp = cstr2longp(IST, str_ptr+2, NULL, 8);
+ if (IST->exception_obj) {
+ IST->exception_obj = NULL;
+ printf("Lexical error: invalid octal number\n");
+ return ERR;
+ }
+ lvalp->int_type = new_int_long_obj(IST, longp);
} 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));
+ else {
+ long_p longp = cstr2longp(IST, str_ptr, NULL, 10);
+ if (IST->exception_obj) {
+ IST->exception_obj = NULL;
+ printf("Lexical error: invalid integer number\n");
+ return ERR;
+ }
+ lvalp->int_type = new_int_long_obj(IST, longp);
+ }
}
if (nonzero_flag && int_is_zero(lvalp->int_type)){
printf("Lexical error: invalid integer number format\n");
@@ -1239,7 +1258,7 @@
else
return INT_;
}
- }
+ }
if (imag_flag)
str_index--;
else {