source: git/libpolys/coeffs/longrat0.cc @ 6d92ca

spielwiese
Last change on this file since 6d92ca was 6d92ca, checked in by Hans Schoenemann <hannes@…>, 9 years ago
chg: n_write does not call n_Normalize any more
  • Property mode set to 100644
File size: 2.8 KB
Line 
1/****************************************
2*  Computer Algebra System SINGULAR     *
3****************************************/
4/*
5* ABSTRACT -
6* IO for long rational numbers (Hubert Grassmann)
7*/
8
9#include <stdio.h>
10#include <string.h>
11
12#include <misc/auxiliary.h>
13#include <omalloc/omalloc.h>
14#include <reporter/reporter.h>
15
16#include "coeffs.h"
17#include "numbers.h"
18#include "longrat.h"
19
20/// Our Type!
21static const n_coeffType ID = n_Q;
22
23omBin rnumber_bin = omGetSpecBin(sizeof(snumber)); // TODO: move this into coeffs-struct (for Q)?!
24
25
26#define SR_HDL(A) ((long)(A))
27//#define SR_INT    1 // already in longrat.h
28//#define INT_TO_SR(INT)  ((number) (((long)INT << 2) + SR_INT))
29#define SR_TO_INT(SR)   (((long)SR) >> 2)
30
31
32/*2
33* extracts a long integer from s, returns the rest
34*/
35static const char * nlEatLong(char *s, mpz_ptr i)
36{
37  const char * start=s;
38
39  while (*s >= '0' && *s <= '9') s++;
40  if (*s=='\0')
41  {
42    mpz_set_str(i,start,10);
43  }
44  else
45  {
46    char c=*s;
47    *s='\0';
48    mpz_set_str(i,start,10);
49    *s=c;
50  }
51  return s;
52}
53
54/*2
55* extracts the number a from s, returns the rest
56*/
57const char * nlRead (const char *s, number *a, const coeffs r)
58{
59  if (*s<'0' || *s>'9')
60  {
61    *a = INT_TO_SR(1); /* nlInit(1) */
62    return s;
63  }
64  *a=(number)ALLOC_RNUMBER();
65  {
66    (*a)->s = 3;
67#if defined(LDEBUG)
68    (*a)->debug=123456;
69#endif
70    mpz_ptr z=(*a)->z;
71    mpz_ptr n=(*a)->n;
72    mpz_init(z);
73    s = nlEatLong((char *)s, z);
74    if (*s == '/')
75    {
76      mpz_init(n);
77      (*a)->s = 0;
78      s++;
79      s = nlEatLong((char *)s, n);
80      if (mpz_cmp_si(n,(long)0)==0)
81      {
82        WerrorS(nDivBy0);
83        mpz_clear(n);
84        (*a)->s = 3;
85      }
86      else if (mpz_cmp_si(n,(long)1)==0)
87      {
88        mpz_clear(n);
89        (*a)->s=3;
90      }
91    }
92    if (mpz_cmp_si(z,(long)0)==0)
93    {
94      mpz_clear(z);
95      FREE_RNUMBER(*a);
96      *a=INT_TO_SR(0);
97    }
98    else
99    if ((*a)->s==3)
100    {
101      number nlShort3_noinline(number x);
102      *a=nlShort3_noinline(*a);
103    }
104    else
105    {
106      number aa=*a;
107      nlNormalize(aa,r); // FIXME? TODO? // extern void     nlNormalize(number &x, const coeffs r);
108      *a=aa;
109    }
110  }
111  return s;
112}
113
114/*2
115* write a rational number
116*/
117void nlWrite (number a, const coeffs r)
118{
119  char *s,*z;
120  if (SR_HDL(a) & SR_INT)
121  {
122    StringAppend("%ld",SR_TO_INT(a));
123  }
124  else if (a==NULL)
125  {
126    StringAppendS("o");
127  }
128  else
129  {
130    if (a->s==0)
131    {
132      nlNormalize(a,r); // FIXME? TODO? // extern void     nlNormalize(number &x, const coeffs r);
133      nlWrite(a,r);
134      return;
135    }
136    int l=mpz_sizeinbase(a->z,10);
137    if (a->s<2) l=si_max(l,(int)mpz_sizeinbase(a->n,10));
138    l+=2;
139    s=(char*)omAlloc(l);
140    z=mpz_get_str(s,10,a->z);
141    StringAppendS(z);
142    if (a->s!=3)
143    {
144      StringAppendS("/");
145      z=mpz_get_str(s,10,a->n);
146      StringAppendS(z);
147    }
148    omFreeSize((void *)s,l);
149  }
150}
151
152
Note: See TracBrowser for help on using the repository browser.