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;