My Project  UNKNOWN_GIT_VERSION
Functions
ipconv.h File Reference
#include "kernel/structs.h"
#include "Singular/table.h"

Go to the source code of this file.

Functions

int iiTestConvert (int inputType, int outputType, const struct sConvertTypes *dCT=dConvertTypes)
 
BOOLEAN iiConvert (int inputType, int outputType, int index, leftv input, leftv output, const struct sConvertTypes *dCT=dConvertTypes)
 

Function Documentation

◆ iiConvert()

BOOLEAN iiConvert ( int  inputType,
int  outputType,
int  index,
leftv  input,
leftv  output,
const struct sConvertTypes dCT = dConvertTypes 
)

Definition at line 436 of file ipconv.cc.

437 {
438  memset(output,0,sizeof(sleftv));
439  if ((inputType==outputType)
440  || (outputType==DEF_CMD)
441  || ((outputType==IDHDL)&&(input->rtyp==IDHDL)))
442  {
443  memcpy(output,input,sizeof(*output));
444  memset(input,0,sizeof(*input));
445  return FALSE;
446  }
447  else if (outputType==ANY_TYPE)
448  {
449  output->rtyp=ANY_TYPE;
450  output->data=(char *)(long)input->Typ();
451  /* the name of the object:*/
452  if (input->e==NULL)
453  {
454  if (input->rtyp==IDHDL)
455  /* preserve name: copy it */
456  output->name=omStrDup(IDID((idhdl)(input->data)));
457  else if (input->name!=NULL)
458  {
459  if (input->rtyp==ALIAS_CMD)
460  output->name=omStrDup(input->name);
461  else
462  {
463  output->name=input->name;
464  input->name=NULL;
465  }
466  }
467  else if ((input->rtyp==POLY_CMD) && (input->name==NULL))
468  {
469  if (input->data!=NULL)
470  {
471  int nr=pIsPurePower((poly)input->data);
472  if (nr!=0)
473  {
474  if (pGetExp((poly)input->data,nr)==1)
475  {
476  output->name=omStrDup(currRing->names[nr-1]);
477  }
478  else
479  {
480  char *tmp=(char *)omAlloc(4);
481  sprintf(tmp,"%c%d",*(currRing->names[nr-1]),
482  (int)pGetExp((poly)input->data,nr));
483  output->name=tmp;
484  }
485  }
486  else if(pIsConstant((poly)input->data))
487  {
488  StringSetS("");
489  number n=(pGetCoeff((poly)input->data));
490  n_Write(n, currRing->cf);
491  (pGetCoeff((poly)input->data))=n; // n_Write may have changed n
492  output->name=StringEndS();
493  }
494  }
495  }
496  else if ((input->rtyp==NUMBER_CMD) && (input->name==NULL))
497  {
498  StringSetS("");
499  number n=(number)input->data;
500  n_Write(n, currRing->cf);
501  input->data=(void*)n; // n_Write may have changed n
502  output->name=StringEndS();
503  }
504  else
505  {
506  /* no need to preserve name: use it */
507  output->name=input->name;
508  input->name=NULL;
509  }
510  }
511  output->next=input->next;
512  input->next=NULL;
513  if (!errorreported) input->CleanUp();
514  return errorreported;
515  }
516  if (index!=0) /* iiTestConvert does not returned 'failure' */
517  {
518  index--;
519 
520  if((dConvertTypes[index].i_typ==inputType)
521  &&(dConvertTypes[index].o_typ==outputType))
522  {
523  if(traceit&TRACE_CONV)
524  {
525  Print("automatic conversion %s -> %s\n",
526  Tok2Cmdname(inputType),Tok2Cmdname(outputType));
527  }
528  if ((currRing==NULL) && (outputType>BEGIN_RING) && (outputType<END_RING))
529  return TRUE;
530  output->rtyp=outputType;
531  if (dConvertTypes[index].p!=NULL)
532  {
533  output->data=dConvertTypes[index].p(input->CopyD());
534  }
535  else
536  {
537  dConvertTypes[index].pl(output,input);
538  }
539  if ((output->data==NULL)
540  && ((outputType!=INT_CMD)
541  &&(outputType!=POLY_CMD)
542  &&(outputType!=VECTOR_CMD)
543  &&(outputType!=NUMBER_CMD)))
544  {
545  return TRUE;
546  }
547  if (errorreported) return TRUE;
548  output->next=input->next;
549  input->next=NULL;
550  if ((input->rtyp!=IDHDL) && (input->attribute!=NULL))
551  {
552  input->attribute->killAll(currRing);
553  input->attribute=NULL;
554  }
555  if (input->e!=NULL)
556  {
557  Subexpr h;
558  while (input->e!=NULL)
559  {
560  h=input->e->next;
561  omFreeBin((ADDRESS)input->e, sSubexpr_bin);
562  input->e=h;
563  }
564  }
565  //input->Init(); // seems that input (rtyp?) is still needed
566  return FALSE;
567  }
568  }
569  return TRUE;
570 }

◆ iiTestConvert()

int iiTestConvert ( int  inputType,
int  outputType,
const struct sConvertTypes dCT = dConvertTypes 
)

Definition at line 576 of file ipconv.cc.

577 {
578  if ((inputType==outputType)
579  || (outputType==DEF_CMD)
580  || (outputType==IDHDL)
581  || (outputType==ANY_TYPE))
582  {
583  return -1;
584  }
585  if (inputType==UNKNOWN) return 0;
586 
587  if ((currRing==NULL) && (outputType>BEGIN_RING) && (outputType<END_RING))
588  return 0;
589  //if ((currRing==NULL) && (outputType==CNUMBER_CMD))
590  // return 0;
591 
592  // search the list
593  int i=0;
594  while (dConvertTypes[i].i_typ!=0)
595  {
596  if((dConvertTypes[i].i_typ==inputType)
597  &&(dConvertTypes[i].o_typ==outputType))
598  {
599  //Print("test convert %d to %d (%s -> %s):%d\n",inputType,outputType,
600  //Tok2Cmdname(inputType), Tok2Cmdname(outputType),i+1);
601  return i+1;
602  }
603  i++;
604  }
605  //Print("test convert %d to %d (%s -> %s):0, tested:%d\n",inputType,outputType,
606  // Tok2Cmdname(inputType), Tok2Cmdname(outputType),i);
607  return 0;
608 }
FALSE
#define FALSE
Definition: auxiliary.h:94
sConvertTypes::p
int p
Definition: gentable.cc:122
pIsConstant
#define pIsConstant(p)
like above, except that Comp might be != 0
Definition: polys.h:233
sattr::killAll
void killAll(const ring r)
Definition: attrib.cc:188
errorreported
short errorreported
Definition: feFopen.cc:23
NUMBER_CMD
@ NUMBER_CMD
Definition: grammar.cc:288
pGetExp
#define pGetExp(p, i)
Exponent.
Definition: polys.h:41
ADDRESS
void * ADDRESS
Definition: auxiliary.h:133
TRACE_CONV
#define TRACE_CONV
Definition: reporter.h:47
omStrDup
#define omStrDup(s)
Definition: omAllocDecl.h:263
DEF_CMD
@ DEF_CMD
Definition: tok.h:58
sleftv::attribute
attr attribute
Definition: subexpr.h:89
StringEndS
char * StringEndS()
Definition: reporter.cc:151
sleftv
Class used for (list of) interpreter objects.
Definition: subexpr.h:83
ANY_TYPE
#define ANY_TYPE
Definition: tok.h:30
currRing
ring currRing
Widely used global variable which specifies the current polynomial ring for Singular interpreter and ...
Definition: polys.cc:13
BEGIN_RING
@ BEGIN_RING
Definition: grammar.cc:282
sleftv::name
const char * name
Definition: subexpr.h:87
sSubexpr_bin
omBin sSubexpr_bin
Definition: subexpr.cc:46
TRUE
#define TRUE
Definition: auxiliary.h:98
i
int i
Definition: cfEzgcd.cc:125
INT_CMD
@ INT_CMD
Definition: tok.h:96
n_Write
static FORCE_INLINE void n_Write(number n, const coeffs r, const BOOLEAN bShortOut=TRUE)
Definition: coeffs.h:591
h
static Poly * h
Definition: janet.cc:972
sleftv::data
void * data
Definition: subexpr.h:88
omAlloc
#define omAlloc(size)
Definition: omAllocDecl.h:210
END_RING
@ END_RING
Definition: grammar.cc:310
VECTOR_CMD
@ VECTOR_CMD
Definition: grammar.cc:292
sleftv::CleanUp
void CleanUp(ring r=currRing)
Definition: subexpr.cc:354
sleftv::e
Subexpr e
Definition: subexpr.h:105
UNKNOWN
#define UNKNOWN
Definition: tok.h:220
idrec
Definition: idrec.h:35
ALIAS_CMD
@ ALIAS_CMD
Definition: tok.h:34
StringSetS
void StringSetS(const char *st)
Definition: reporter.cc:128
Print
#define Print
Definition: emacs.cc:80
sConvertTypes::pl
int pl
Definition: gentable.cc:123
pIsPurePower
#define pIsPurePower(p)
Definition: polys.h:243
IDHDL
#define IDHDL
Definition: tok.h:31
sleftv::Typ
int Typ()
Definition: subexpr.cc:1039
sleftv::rtyp
int rtyp
Definition: subexpr.h:91
NULL
#define NULL
Definition: omList.c:10
sleftv::CopyD
void * CopyD(int t)
Definition: subexpr.cc:745
traceit
int traceit
Definition: febase.cc:42
dConvertTypes
const struct sConvertTypes dConvertTypes[]
Definition: table.h:1251
p
int p
Definition: cfModGcd.cc:4019
POLY_CMD
@ POLY_CMD
Definition: grammar.cc:289
Tok2Cmdname
const char * Tok2Cmdname(int tok)
Definition: gentable.cc:140
IDID
#define IDID(a)
Definition: ipid.h:117
pGetCoeff
static number & pGetCoeff(poly p)
return an alias to the leading coefficient of p assumes that p != NULL NOTE: not copy
Definition: monomials.h:45
omFreeBin
#define omFreeBin(addr, bin)
Definition: omAllocDecl.h:259
index
static int index(p_Length length, p_Ord ord)
Definition: p_Procs_Impl.h:592
sleftv::next
leftv next
Definition: subexpr.h:86