[Python-checkins] r51414 - sandbox/trunk/decimal-c/_decimal.c
mateusz.rukowicz
python-checkins at python.org
Sun Aug 20 02:50:35 CEST 2006
Author: mateusz.rukowicz
Date: Sun Aug 20 02:50:34 2006
New Revision: 51414
Modified:
sandbox/trunk/decimal-c/_decimal.c
Log:
Now decimal compiles under Visual Studio, and passes all tests under windows.
Modified: sandbox/trunk/decimal-c/_decimal.c
==============================================================================
--- sandbox/trunk/decimal-c/_decimal.c (original)
+++ sandbox/trunk/decimal-c/_decimal.c Sun Aug 20 02:50:34 2006
@@ -104,8 +104,8 @@
static void
_limb_move_left(long *self, long limbs, long count)
{
- assert(count >= 0);
long i;
+ assert(count >= 0);
for (i = limbs - 1; i - count >= 0; i--)
self[i] = self[i-count];
@@ -124,6 +124,8 @@
long new_mult = 1;
long last_digit = 0; /* digit from start_pos -1 */
long i;
+ long diff;
+ long actual_limb;
for (i = 0; i < new_digits; i += LOG)
new[i/LOG] = 0;
@@ -147,7 +149,7 @@
pos ++;
}
- long diff = start_pos;
+ diff = start_pos;
while (diff < 0) /* put 0s to new */
{
new[new_limb] = 0;
@@ -161,16 +163,17 @@
}
/* now we will just copy from self to digit */
- long actual_limb = self[self_limb];
+ actual_limb = self[self_limb];
actual_limb /= self_mult;
/* while don't go out of self and new */
while (pos < ndigits && pos - start_pos < new_digits)
{
+ long x;
if (self_mult == 1)
actual_limb = self[self_limb];
- long x = actual_limb % 10;
+ x = actual_limb % 10;
new[new_limb] += x * new_mult;
new_mult *= 10;
if (new_mult == BASE)
@@ -215,13 +218,14 @@
long full_limb = 0;
long mult = 1;
long i;
+ long limbs;
while(mult != BASE)
{
full_limb += x * mult;
mult *= 10;
}
- long limbs = ndigits / LOG;
+ limbs = ndigits / LOG;
for(i = 0;i<limbs;i++)
self[i] = full_limb;
@@ -241,14 +245,15 @@
static long
_limb_get_digit(long *self, long ndigits, long i)
{
- if(i >= ndigits || i < 0)
- return 0;
long pos = ndigits - i - 1;
long limb = pos / LOG;
+ long tmp; /* = self[limb]; */
pos %= LOG;
- long tmp = self[limb];
- while(pos)
- {
+ if (i >= ndigits || i < 0)
+ return 0;
+
+ tmp = self[limb];
+ while (pos) {
tmp/=10;
pos --;
}
@@ -261,8 +266,9 @@
{
long limbs = (size + LOG -1)/ LOG;
long slimbs;
+ long size_at_most;
slimbs = _limb_size(self, limbs);
- long size_at_most = slimbs * LOG;
+ size_at_most = slimbs * LOG;
while(_limb_get_digit(self, size_at_most, 0) == 0 && size_at_most > 1) size_at_most --;
@@ -349,6 +355,8 @@
long blimbs = (bsize + LOG -1)/LOG;
long slimbs = (ssize + LOG -1)/LOG;
long i;
+ long left_limbs;
+ long left_digits;
for(i=0;i<blimbs;i++)
out[i] = big[i];
@@ -365,10 +373,10 @@
}
}
- long left_limbs = blimbs-1;
+ left_limbs = blimbs-1;
while(!out[left_limbs]) left_limbs --;
- long left_digits = (left_limbs+1) * LOG;
+ left_digits = (left_limbs+1) * LOG;
while(_limb_get_digit(out, left_digits, 0) == 0) left_digits --;
@@ -488,6 +496,11 @@
long out_pos = prec - 1; /* where we write result starts at prec - 1 stops at 0*/
long new_pos = flimbs - 2; /* where is new digit to add at the end of rest,
if new_pos<0 add 0 */
+ long *tmp = (long*)malloc(sizeof(long) * (slimbs+1));
+ if (!tmp) {
+ PyErr_NoMemory();
+ return 0;
+ }
rest[0] = first[flimbs-1];
@@ -499,7 +512,8 @@
down = 0;
while(1) {
- long tmp[slimbs+1];
+
+/* long tmp[slimbs+1]; */
long tmp_limbs;
long diff;
long mid;
@@ -566,11 +580,13 @@
out[i] = out[i+last_written];
for (i = prec - last_written; i < prec ;i++)
out[i] = 0;
+ free(tmp);
return new_pos;
}
new_pos --;
}
+ free(tmp);
return new_pos;
}
/*
@@ -4641,7 +4657,7 @@
return ans;
}
-DECIMAL_UNARY_FUNC(exponent);
+DECIMAL_UNARY_FUNC(exponent)
static PyObject *
_do_decimal_exp(decimalobject *self, contextobject *ctx) {
@@ -4655,7 +4671,7 @@
return (PyObject*)_do_decimal_exponent(self, ctx);
}
-DECIMAL_UNARY_FUNC(exp);
+DECIMAL_UNARY_FUNC(exp)
int ln_lookup[] = {9016, 8652, 8316, 8008, 7724, 7456, 7208,
6972, 6748, 6540, 6340, 6148, 5968, 5792, 5628, 5464, 5312,
@@ -4887,7 +4903,7 @@
return NULL;
}
-DECIMAL_UNARY_FUNC(_ln);
+DECIMAL_UNARY_FUNC(_ln)
static PyObject *
_do_decimal_ln(decimalobject *self, contextobject *ctx) {
@@ -4896,7 +4912,7 @@
return (PyObject*)_do_decimal__ln(self, ctx);
}
-DECIMAL_UNARY_FUNC(ln);
+DECIMAL_UNARY_FUNC(ln)
static decimalobject *
_do_decimal_log10(decimalobject *self, contextobject *ctx) {
@@ -5022,7 +5038,7 @@
}
}
-DECIMAL_UNARY_FUNC(log10);
+DECIMAL_UNARY_FUNC(log10)
/* due to some nasty special cases, this code looks quite ugly */
@@ -5149,7 +5165,7 @@
return (decimalobject*)decimal_from_long(self->ob_type, res);
}
-DECIMAL_BINARY_FUNC(comparetotal);
+DECIMAL_BINARY_FUNC(comparetotal)
static PyMethodDef decimal_methods[] = {
{"comparetotal", (PyCFunction)decimal_comparetotal,
@@ -5301,12 +5317,14 @@
_do_decimal_add(decimalobject *self, decimalobject *other,
contextobject *ctx)
{
- assert(PyDecimal_Check(other));
- assert(PyDecimal_Check(self));
int shouldround, sign, negativezero = 0;
exp_t exp, oexp;
long prec,cmp;
decimalobject *res, *res2, *ret, *o1, *o2;
+ decimalobject *tmp, *oother;
+ long numdigits;
+ assert(PyDecimal_Check(other));
+ assert(PyDecimal_Check(self));
prec = ctx->prec;
if (ISSPECIAL(self) || ISSPECIAL(other)) {
@@ -5376,19 +5394,15 @@
}
}
- decimalobject *tmp; /* we borrow refference */
- decimalobject *oother;
- long numdigits = exp_to_i(exp_sub(self->exp, other->exp));
+ numdigits = exp_to_i(exp_sub(self->exp, other->exp));
- if(numdigits < 0)
- {
+ if (numdigits < 0) {
numdigits *= -1;
tmp = other;
oother = self;
}
- else
- {
+ else {
tmp = self;
oother = other;
}
@@ -5708,6 +5722,7 @@
contextobject *ctx)
{
decimalobject *ret;
+ PyObject *seq;
if (ISSPECIAL(self) || ISSPECIAL(other)) {
decimalobject *nan;
if (_check_nans(self, other, ctx, &nan))
@@ -5717,7 +5732,7 @@
if (decimal_nonzero(self) && !decimal_nonzero(other)) {
return handle_InvalidOperation(self->ob_type, ctx, "x % 0", NULL);
}
- PyObject *seq = _do_decimal__divide(self, other, 3, ctx);
+ seq = _do_decimal__divide(self, other, 3, ctx);
if (!seq)
return NULL;
@@ -5795,12 +5810,13 @@
{
contextobject *ctx2;
decimalobject *one;
+ PyObject *flags;
ctx2 = context_copy(ctx);
if (!ctx2)
return NULL;
- PyObject *flags = context_ignore_all_flags(ctx2);
+ flags = context_ignore_all_flags(ctx2);
if (!flags){
Py_DECREF(ctx2);
return NULL;
@@ -5942,10 +5958,10 @@
/* non-integer case */
/* we calculate it using exp(ln(self) * other) */
if (use_exp) {
- if (!check_ctx(self, ctx))
- return handle_InvalidContext(self->ob_type, ctx, NULL);
decimalobject *tmp;
contextobject *ctx2;
+ if (!check_ctx(self, ctx))
+ return handle_InvalidContext(self->ob_type, ctx, NULL);
ctx2 = context_shallow_copy(ctx);
if (!ctx2)
return NULL;
@@ -6497,6 +6513,8 @@
decimalobject *new;
long size = 0, i;
char *start = NULL, *p;
+ long mult;
+ long limb;
if (len < 3)
return NULL;
@@ -6548,8 +6566,8 @@
for(i=0;i<new->limb_count;i++)
new->limbs[i] = 0;
- long mult = 1;
- long limb = 0;
+ mult = 1;
+ limb = 0;
for(i = size -1; i>=0; i--)
{
assert(limb < new->limb_count);
@@ -6578,11 +6596,24 @@
_decimal_fromliteralinfinity(PyTypeObject *type, char *str)
{
decimalobject *new;
+ long i;
char **p = infinities;
char sign = 0;
+ char *str2;
+
+ str2 = (char*)malloc(strlen(str) + 1);
+ if (!str2) {
+ PyErr_NoMemory();
+ return NULL;
+ }
+
+ for (i = 0 ; i < strlen(str) ; i++) {
+ str2[i] = tolower(str[i]);
+ }
+ str2[strlen(str)] = '\0';
do {
- if (strcasecmp(str, *p) == 0) {
- if (str[0] == '-')
+ if (strcmp(str2, *p) == 0) {
+ if (str2[0] == '-')
sign = SIGN_NEGINF;
else
sign = SIGN_POSINF;
@@ -6594,8 +6625,10 @@
if (!new)
return NULL;
new->limbs[0] = 0;
+ free(str2);
return new;
}
+ free(str2);
return NULL;
}
@@ -6616,6 +6649,7 @@
int any_digit = 0;
char *c;
long i;
+ long mult, limb;
decimalobject *new;
if(!len)
@@ -6727,8 +6761,8 @@
return new;
}
- long mult = 1; /* now we just read integer till '\0' or 'e'/'E', dont care about '.' */
- long limb = 0;
+ mult = 1; /* now we just read integer till '\0' or 'e'/'E', dont care about '.' */
+ limb = 0;
for(c = last_digit; c >= first_digit; c--)
{
@@ -6831,6 +6865,7 @@
PyObject *tup, *digits, *digtup = NULL, *item;
int sign;
long i;
+ long mult, limb;
exp_t exp;
PyObject *tmp_exp;
@@ -6868,13 +6903,14 @@
for(i = 0;i < new->limb_count;i++)
new->limbs[i] = 0;
- long mult = 1;
- long limb = 0;
+ mult = 1;
+ limb = 0;
new->limbs[0] = 0;
for(i = new->ob_size-1; i>=0; i--) /* limb[0] keeps least significant limb */
{
- item = PyTuple_GET_ITEM(digtup, i);
long x;
+ item = PyTuple_GET_ITEM(digtup, i);
+
if(PyInt_Check(item))
x = PyInt_AsLong(item);
else if (PyLong_Check(item)) {
@@ -7008,11 +7044,12 @@
/* try buffer interface (e.g. strings and unicode) */
if (PyObject_AsCharBuffer(value, (const char **)&buffer, &buf_len) == 0) {
+ PyObject *res;
if (buf_len > LONG_MAX) {
PyErr_NoMemory();
return NULL;
}
- PyObject *res = (PyObject *)decimal_from_string(type, buffer, buf_len, ctx);
+ res = (PyObject *)decimal_from_string(type, buffer, buf_len, ctx);
return res;
}
@@ -7554,9 +7591,9 @@
CONTEXT_UNARY_FUNC(sqrt, sqrt)
CONTEXT_UNARY_FUNC(to_eng_string, to_eng_string)
CONTEXT_UNARY_FUNC(exp, exp)
-CONTEXT_UNARY_FUNC(ln, ln);
-CONTEXT_UNARY_FUNC(log10, log10);
-CONTEXT_BINARY_FUNC(comparetotal, comparetotal);
+CONTEXT_UNARY_FUNC(ln, ln)
+CONTEXT_UNARY_FUNC(log10, log10)
+CONTEXT_BINARY_FUNC(comparetotal, comparetotal)
/* Unfortunately, the following methods are non-standard and can't
@@ -7567,6 +7604,8 @@
{
static char *kwlist[] = {"a", 0};
decimalobject *a;
+ decimalobject *tmp;
+ PyObject *ret;
if(!PyArg_ParseTupleAndKeywords(args, kwds, "O:_apply", kwlist, &a))
return NULL;
@@ -7577,11 +7616,11 @@
return NULL;
}
- decimalobject *tmp = _decimal_fix(a, self);
+ tmp = _decimal_fix(a, self);
if(!tmp)
return NULL;
- PyObject *ret = decimal_str(tmp);
+ ret = decimal_str(tmp);
Py_DECREF(tmp);
return ret;
More information about the Python-checkins
mailing list