source: git/libpolys/coeffs/longrat0.cc @ e93b00

spielwiese
Last change on this file since e93b00 was f5f5c9, checked in by Hans Schoenemann <hannes@…>, 7 years ago
fix: include path for julia
  • Property mode set to 100644
File size: 3.1 KB
RevLine 
[35aab3]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>
[d663f2]11
[f5f5c9]12#include "misc/auxiliary.h"
[d2f250]13#include "omalloc/omalloc.h"
[f5f5c9]14#include "reporter/reporter.h"
[d663f2]15
[f5f5c9]16#include "coeffs/coeffs.h"
17#include "coeffs/numbers.h"
18#include "coeffs/longrat.h"
[d663f2]19
[fea494]20omBin rnumber_bin = omGetSpecBin(sizeof(snumber)); // TODO: move this into coeffs-struct (for Q)?!
[d663f2]21
[35aab3]22
23#define SR_HDL(A) ((long)(A))
[2d2326]24//#define SR_INT    1 // already in longrat.h
[f12c611]25//#define INT_TO_SR(INT)  ((number) (((long)INT << 2) + SR_INT))
[35aab3]26#define SR_TO_INT(SR)   (((long)SR) >> 2)
27
28
29/*2
30* extracts a long integer from s, returns the rest
31*/
[8dfe25]32const char * nlEatLong(char *s, mpz_ptr i)
[35aab3]33{
[85e68dd]34  const char * start=s;
[35aab3]35
36  while (*s >= '0' && *s <= '9') s++;
37  if (*s=='\0')
38  {
39    mpz_set_str(i,start,10);
40  }
41  else
42  {
43    char c=*s;
44    *s='\0';
45    mpz_set_str(i,start,10);
46    *s=c;
47  }
48  return s;
49}
50
51/*2
52* extracts the number a from s, returns the rest
53*/
[36f915]54const char * nlRead (const char *s, number *a, const coeffs r)
[35aab3]55{
56  if (*s<'0' || *s>'9')
57  {
[6c9007]58    *a = INT_TO_SR(1); /* nlInit(1) */
[35aab3]59    return s;
60  }
[896561]61  *a=(number)ALLOC_RNUMBER();
[35aab3]62  {
63    (*a)->s = 3;
64#if defined(LDEBUG)
65    (*a)->debug=123456;
66#endif
[a604c3]67    mpz_ptr z=(*a)->z;
68    mpz_ptr n=(*a)->n;
[35aab3]69    mpz_init(z);
[85e68dd]70    s = nlEatLong((char *)s, z);
[35aab3]71    if (*s == '/')
72    {
73      mpz_init(n);
74      (*a)->s = 0;
75      s++;
[85e68dd]76      s = nlEatLong((char *)s, n);
[9b88e6]77      if (mpz_cmp_si(n,0L)==0)
[35aab3]78      {
[7c961ba]79        WerrorS(nDivBy0);
[35aab3]80        mpz_clear(n);
81        (*a)->s = 3;
82      }
[9b88e6]83      else if (mpz_cmp_si(n,1L)==0)
[35aab3]84      {
85        mpz_clear(n);
86        (*a)->s=3;
87      }
88    }
[9b88e6]89    if (mpz_cmp_si(z,0L)==0)
[35aab3]90    {
[f12c611]91      mpz_clear(z);
[896561]92      FREE_RNUMBER(*a);
[35aab3]93      *a=INT_TO_SR(0);
94    }
[9b88e6]95    else if ((*a)->s==3)
[35aab3]96    {
[f12c611]97      number nlShort3_noinline(number x);
98      *a=nlShort3_noinline(*a);
[35aab3]99    }
100    else
[896561]101    {
102      number aa=*a;
[2206753]103      nlNormalize(aa,r); // FIXME? TODO? // extern void     nlNormalize(number &x, const coeffs r);
[896561]104      *a=aa;
105    }
[35aab3]106  }
107  return s;
108}
109
110/*2
111* write a rational number
112*/
[9d19c1]113void nlWrite (number a, const coeffs)
[35aab3]114{
115  char *s,*z;
116  if (SR_HDL(a) & SR_INT)
117  {
[f12c611]118    StringAppend("%ld",SR_TO_INT(a));
[35aab3]119  }
120  else if (a==NULL)
121  {
122    StringAppendS("o");
123  }
124  else
125  {
[a604c3]126    int l=mpz_sizeinbase(a->z,10);
[32c80f]127    if (a->s<2) l=si_max(l,(int)mpz_sizeinbase(a->n,10));
[35aab3]128    l+=2;
129    s=(char*)omAlloc(l);
[a604c3]130    z=mpz_get_str(s,10,a->z);
[35aab3]131    StringAppendS(z);
132    if (a->s!=3)
133    {
134      StringAppendS("/");
[a604c3]135      z=mpz_get_str(s,10,a->n);
[35aab3]136      StringAppendS(z);
137    }
[7d90aa]138    omFreeSize((void *)s,l);
[35aab3]139  }
140}
141
[b1190b]142#if 0
143void nlDebugWrite (number a)
144{
145  char *s,*z;
146  if (SR_HDL(a) & SR_INT)
147  {
148    Print("%ld",SR_TO_INT(a));
149  }
150  else if (a==NULL)
151  {
152    PrintS("o");
153  }
154  else
155  {
156    int l=mpz_sizeinbase(a->z,10);
157    if (a->s<2) l=si_max(l,(int)mpz_sizeinbase(a->n,10));
158    l+=2;
159    s=(char*)omAlloc(l);
160    z=mpz_get_str(s,10,a->z);
161    PrintS(z);
162    if (a->s!=3)
163    {
164      PrintS("/");
165      z=mpz_get_str(s,10,a->n);
166      PrintS(z);
167    }
168    omFreeSize((void *)s,l);
169  }
170}
171#endif
Note: See TracBrowser for help on using the repository browser.