rev 747 - in trunk: . src

SVN User <[email protected]> Sat, 17 Jul 2004 03:42:14 -0400
Newsgroups gmane.comp.lang.prothon.cvs
Message-ID <[email protected]>
Author: mark
Date: 2004-07-17 03:42:10 -0400 (Sat, 17 Jul 2004)
New Revision: 747

Modified:
   trunk/STATUS.txt
   trunk/src/builtins-int.c
   trunk/src/console.c
Log:
string.fmt # spec now prints 1xfff and 1o777 for neg numbers

Modified: trunk/STATUS.txt
===================================================================
--- trunk/STATUS.txt	2004-07-16 23:09:32 UTC (rev 746)
+++ trunk/STATUS.txt	2004-07-17 07:42:10 UTC (rev 747)
@@ -23,7 +23,7 @@
 	GeneratorComprehensions 
 	SliceListsAndEllipses 
 	StacklessLanguageFeatures 
-	
+
 --- use special stdout for each Main, replace printf with stdout
 	
 --- call_ does not respect properties

Modified: trunk/src/builtins-int.c
===================================================================
--- trunk/src/builtins-int.c	2004-07-16 23:09:32 UTC (rev 746)
+++ trunk/src/builtins-int.c	2004-07-17 07:42:10 UTC (rev 747)
@@ -159,7 +159,7 @@
 	SET_TYPE_IF_EXC(Int_OBJ, obj, DATA_TYPE_DATAPTR) return NULL;
 	obj->data.ptr  = pr_malloc(len);
 	memcpy(obj->data.ptr, longp, len);
-	long_size(obj) = abs(longp->dsize);
+	long_size(obj) = len;
 	obj->immutable = TRUE;
 	return obj;
 }
@@ -190,7 +190,7 @@
 
 long_p new_longp_non_init(u32_t size) {
 	long_p longp = pr_malloc(sizeof(long_t) + size * sizeof(digit));
-	longp->size = size;
+	longp->size = sizeof(long_t) + size * sizeof(digit);
 	longp->dsize = size;
 	return longp;
 }
@@ -1219,7 +1219,7 @@
 	if (z == NULL)
 		return NULL;
 
-	memset(z->digit, 0, z->size * sizeof(digit));
+	memset(z->digit, 0, abs(z->dsize) * sizeof(digit));
 	for (i = 0; i < size_a; ++i) {
 		twodigits carry = 0;
 		twodigits f = a->digit[i];
@@ -2126,7 +2126,9 @@
 	int oct_flag   = FALSE;
 	int hex_flag   = FALSE;
 	int heX_flag   = FALSE;
-	int i, res_len, self_len, txt_len, width = 0, precision = 0;
+	int hd1_flag   = FALSE;
+	int i, base=10, res_len, self_len, txt_len, width = 0, precision = 0;
+	long_p num;
 	ch3_p res_ptr, self_ptr, ptr;
 	BIN_STR_CHK(Int);
 	STRING_PARAM(1, spec);
@@ -2157,47 +2159,84 @@
 			return NULL;
 		}
 	}
+	base = ((hex_flag|heX_flag) ? 16 : (oct_flag ? 8 : 10));
+	hd1_flag = (base != 10 && hdr_flag);
 	if (chr_flag) {
 		self_str = chr_ch3(ist, self);
 	} else if (self->data_type == DATA_TYPE_IMMDATA) {
-		char str[32], *p, *pend;
+		char str[32], *p, *s=str+1;
 		i64_t val = int2i64t(ist, self);
 		neg_flag = (val < 0);
 		if (oct_flag) {
-			long_p longp = new_longp(val);
-			self_str = long_format(longp, 8, FALSE);
-			pr_free(longp);
+			num = new_longp(val);
+			if (hdr_flag && neg_flag) goto got_num;
+			self_str = long_format(num, base, FALSE);
+			pr_free(num);
 			goto gotstr;
 		}
-		str[0] = '-';
-		if (neg_flag) val = -val;
+		if (!(hdr_flag && (hex_flag || heX_flag))&& neg_flag) val = -val;
 		if (hex_flag || heX_flag)
 			apr_snprintf(str+1, sizeof(str)-1, "%"APR_UINT64_T_HEX_FMT, val);
 		else
 			apr_snprintf(str+1, sizeof(str)-1, "%"APR_INT64_T_FMT, val);
-		if (heX_flag) {
-			pend = str + strlen(str);
-			for (p=str; *p; p++)
-				*p = toupper(*p);
-		}
-		self_str = NEW_STRING(neg_flag ? str : str+1);
-	} else {
-		int base = ((hex_flag|heX_flag) ? 16 : (oct_flag ? 8 : 10));
-		self_str = long_format(self->data.ptr, base, heX_flag);
+		if (hd1_flag && neg_flag)
+			while (*s == 'f') s++;
+		s = max(str+1, s-1);
+		if (neg_flag) *(--s) = '-';
+		if (heX_flag)
+			for (p=s; *p; p++) *p = toupper(*p);
+		self_str = NEW_STRING(s);
+	} else {	
+		if (hdr_flag && base != 10 && long_dsize(self) < 0) {
+			long_p one;
+			num = copy_longp(self->data.ptr, 0);
+got_num:
+			one = (long_p)new_longp(1);
+			num = (long_p)long_add(num, one);
+			pr_free(one);
+			for (i = 0; i < -num->dsize; i++)
+				num->digit[i] ^= 0xffff;
+		} else 
+			num = self->data.ptr;
+		self_str = long_format(num, base, heX_flag);
+		pr_free(num);
 	}
 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);
+	neg_flag = FALSE;
 	if (self_ptr->b0 == (u8_t) '-') {
 		self_ptr++;
 		self_len--;
-		blnk_flag = FALSE;
-		pos_flag  = FALSE;
-		neg_flag  = TRUE;
+		if (!hd1_flag) {
+			blnk_flag = FALSE;
+			pos_flag  = FALSE;
+			neg_flag  = TRUE;
+		}
 	} else
-		neg_flag = FALSE;
+		hd1_flag = FALSE;
+	if (hd1_flag && oct_flag) {
+		if (self_ptr->b0 == (u8_t) '0')
+			self_ptr->b0 = '7';
+		else if (self_ptr->b0 < (u8_t) '2')
+			self_ptr->b0 |= 6;
+		else if (self_ptr->b0 < (u8_t) '4')
+			self_ptr->b0 |= 4;
+		else if (self_ptr->b0 < (u8_t) '7') {
+			self_ptr--;
+			self_len++;
+			self_ptr->b0 = (u8_t) '7';
+		} else {
+			while (self_ptr->b0 == (u8_t) '7') {
+				self_ptr++;
+				self_len--;
+			}
+			self_ptr--;
+			self_len++;
+		}
+	}
 	if (pos_flag) blnk_flag = FALSE;
 	if (!oct_flag && !hex_flag && !heX_flag) hdr_flag = FALSE;
 	if (prec_p)
@@ -2219,11 +2258,11 @@
 	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) (hd1_flag ? '1' : '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) (hd1_flag ? '1' : '0');   ptr->b1 = 0;  ptr->b2 = 0;  ptr++;
 		ptr->b0 = (u8_t) 'x';  ptr->b1 = 0;  ptr->b2 = 0;  ptr++;
 	}
 	if (prec_p)

Modified: trunk/src/console.c
===================================================================
--- trunk/src/console.c	2004-07-16 23:09:32 UTC (rev 746)
+++ trunk/src/console.c	2004-07-17 07:42:10 UTC (rev 747)
@@ -233,6 +233,7 @@
 			colon_flg = (strlen(line) >= 2 && line[strlen(line)-2] == ':');
 		}
 		reset_as_str_stack(ist);
+		ist->frame = NULL;
 		res = exec_string(ist, src, TRUE, &frame);
 		if (check_exceptions(ist)) {
 			ist->frame = NULL;