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 401 of file ipconv.cc.

402 {
403  memset(output,0,sizeof(sleftv));
404  if ((inputType==outputType)
405  || (outputType==DEF_CMD)
406  || ((outputType==IDHDL)&&(input->rtyp==IDHDL)))
407  {
408  memcpy(output,input,sizeof(*output));
409  memset(input,0,sizeof(*input));
410  return FALSE;
411  }
412  else if (outputType==ANY_TYPE)
413  {
414  output->rtyp=ANY_TYPE;
415  output->data=(char *)(long)input->Typ();
416  /* the name of the object:*/
417  if (input->e==NULL)
418  {
419  if (input->rtyp==IDHDL)
420  /* preserve name: copy it */
421  output->name=omStrDup(IDID((idhdl)(input->data)));
422  else if (input->name!=NULL)
423  {
424  if (input->rtyp==ALIAS_CMD)
425  output->name=omStrDup(input->name);
426  else
427  {
428  output->name=input->name;
429  input->name=NULL;
430  }
431  }
432  else if ((input->rtyp==POLY_CMD) && (input->name==NULL))
433  {
434  if (input->data!=NULL)
435  {
436  int nr=pIsPurePower((poly)input->data);
437  if (nr!=0)
438  {
439  if (pGetExp((poly)input->data,nr)==1)
440  {
441  output->name=omStrDup(currRing->names[nr-1]);
442  }
443  else
444  {
445  char *tmp=(char *)omAlloc(4);
446  sprintf(tmp,"%c%d",*(currRing->names[nr-1]),
447  (int)pGetExp((poly)input->data,nr));
448  output->name=tmp;
449  }
450  }
451  else if(pIsConstant((poly)input->data))
452  {
453  StringSetS("");
454  number n=(pGetCoeff((poly)input->data));
455  n_Write(n, currRing->cf);
456  (pGetCoeff((poly)input->data))=n; // n_Write may have changed n
457  output->name=StringEndS();
458  }
459  }
460  }
461  else if ((input->rtyp==NUMBER_CMD) && (input->name==NULL))
462  {
463  StringSetS("");
464  number n=(number)input->data;
465  n_Write(n, currRing->cf);
466  input->data=(void*)n; // n_Write may have changed n
467  output->name=StringEndS();
468  }
469  else
470  {
471  /* no need to preserve name: use it */
472  output->name=input->name;
473  input->name=NULL;
474  }
475  }
476  output->next=input->next;
477  input->next=NULL;
478  if (!errorreported) input->CleanUp();
479  return errorreported;
480  }
481  if (index!=0) /* iiTestConvert does not returned 'failure' */
482  {
483  index--;
484 
485  if((dConvertTypes[index].i_typ==inputType)
486  &&(dConvertTypes[index].o_typ==outputType))
487  {
488  if(traceit&TRACE_CONV)
489  {
490  Print("automatic conversion %s -> %s\n",
491  Tok2Cmdname(inputType),Tok2Cmdname(outputType));
492  }
493  if ((currRing==NULL) && (outputType>BEGIN_RING) && (outputType<END_RING))
494  return TRUE;
495  output->rtyp=outputType;
496  if (dConvertTypes[index].p!=NULL)
497  {
498  output->data=dConvertTypes[index].p(input->CopyD());
499  }
500  else
501  {
502  dConvertTypes[index].pl(output,input);
503  }
504  if ((output->data==NULL)
505  && ((outputType!=INT_CMD)
506  &&(outputType!=POLY_CMD)
507  &&(outputType!=VECTOR_CMD)
508  &&(outputType!=NUMBER_CMD)))
509  {
510  return TRUE;
511  }
512  if (errorreported) return TRUE;
513  output->next=input->next;
514  input->next=NULL;
515  if ((input->rtyp!=IDHDL) && (input->attribute!=NULL))
516  {
517  input->attribute->killAll(currRing);
518  input->attribute=NULL;
519  }
520  if (input->e!=NULL)
521  {
522  Subexpr h;
523  while (input->e!=NULL)
524  {
525  h=input->e->next;
526  omFreeBin((ADDRESS)input->e, sSubexpr_bin);
527  input->e=h;
528  }
529  }
530  //input->Init(); // seems that input (rtyp?) is still needed
531  return FALSE;
532  }
533  }
534  return TRUE;
535 }
#define pIsPurePower(p)
Definition: polys.h:231
Class used for (list of) interpreter objects.
Definition: subexpr.h:82
#define ANY_TYPE
Definition: tok.h:30
#define Print
Definition: emacs.cc:83
Definition: tok.h:95
void killAll(const ring r)
Definition: attrib.cc:194
Subexpr e
Definition: subexpr.h:105
const struct sConvertTypes dConvertTypes[]
Definition: table.h:1186
#define IDID(a)
Definition: ipid.h:119
#define FALSE
Definition: auxiliary.h:94
return P p
Definition: myNF.cc:203
#define TRACE_CONV
Definition: reporter.h:47
#define TRUE
Definition: auxiliary.h:98
void * ADDRESS
Definition: auxiliary.h:115
char * StringEndS()
Definition: reporter.cc:151
static number & pGetCoeff(poly p)
return an alias to the leading coefficient of p assumes that p != NULL NOTE: not copy ...
Definition: monomials.h:51
int traceit
Definition: febase.cc:47
int Typ()
Definition: subexpr.cc:995
#define omAlloc(size)
Definition: omAllocDecl.h:210
Definition: idrec.h:34
#define IDHDL
Definition: tok.h:31
void * data
Definition: subexpr.h:88
ring currRing
Widely used global variable which specifies the current polynomial ring for Singular interpreter and ...
Definition: polys.cc:10
#define pGetExp(p, i)
Exponent.
Definition: polys.h:41
Definition: tok.h:58
const char * name
Definition: subexpr.h:87
void StringSetS(const char *st)
Definition: reporter.cc:128
static FORCE_INLINE void n_Write(number n, const coeffs r, const BOOLEAN bShortOut=TRUE)
Definition: coeffs.h:595
omBin sSubexpr_bin
Definition: subexpr.cc:49
#define pIsConstant(p)
like above, except that Comp might be != 0
Definition: polys.h:221
short errorreported
Definition: feFopen.cc:23
leftv next
Definition: subexpr.h:86
static int index(p_Length length, p_Ord ord)
Definition: p_Procs_Impl.h:592
Definition: tok.h:34
#define NULL
Definition: omList.c:10
const char * Tok2Cmdname(int tok)
Definition: gentable.cc:132
int rtyp
Definition: subexpr.h:91
void CleanUp(ring r=currRing)
Definition: subexpr.cc:332
attr attribute
Definition: subexpr.h:89
polyrec * poly
Definition: hilb.h:10
#define omFreeBin(addr, bin)
Definition: omAllocDecl.h:259
static Poly * h
Definition: janet.cc:978
void * CopyD(int t)
Definition: subexpr.cc:707
#define omStrDup(s)
Definition: omAllocDecl.h:263

◆ iiTestConvert()

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

Definition at line 541 of file ipconv.cc.

542 {
543  if ((inputType==outputType)
544  || (outputType==DEF_CMD)
545  || (outputType==IDHDL)
546  || (outputType==ANY_TYPE))
547  {
548  return -1;
549  }
550  if (inputType==UNKNOWN) return 0;
551 
552  if ((currRing==NULL) && (outputType>BEGIN_RING) && (outputType<END_RING))
553  return 0;
554  //if ((currRing==NULL) && (outputType==CNUMBER_CMD))
555  // return 0;
556 
557  // search the list
558  int i=0;
559  while (dConvertTypes[i].i_typ!=0)
560  {
561  if((dConvertTypes[i].i_typ==inputType)
562  &&(dConvertTypes[i].o_typ==outputType))
563  {
564  //Print("test convert %d to %d (%s -> %s):%d\n",inputType,outputType,
565  //Tok2Cmdname(inputType), Tok2Cmdname(outputType),i+1);
566  return i+1;
567  }
568  i++;
569  }
570  //Print("test convert %d to %d (%s -> %s):0, tested:%d\n",inputType,outputType,
571  // Tok2Cmdname(inputType), Tok2Cmdname(outputType),i);
572  return 0;
573 }
#define ANY_TYPE
Definition: tok.h:30
const struct sConvertTypes dConvertTypes[]
Definition: table.h:1186
#define UNKNOWN
Definition: tok.h:217
#define IDHDL
Definition: tok.h:31
ring currRing
Widely used global variable which specifies the current polynomial ring for Singular interpreter and ...
Definition: polys.cc:10
Definition: tok.h:58
int i
Definition: cfEzgcd.cc:123
#define NULL
Definition: omList.c:10