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 {