source: git/Singular/mpsr_Get.cc @ 6ce030f

spielwiese
Last change on this file since 6ce030f was 6ce030f, checked in by Oleksandr Motsak <motsak@…>, 12 years ago
removal of the $Id$ svn tag from everywhere NOTE: the git SHA1 may be used instead (only on special places) NOTE: the libraries Singular/LIB/*.lib still contain the marker due to our current use of svn
  • Property mode set to 100644
File size: 25.7 KB
RevLine 
[32df82]1/****************************************
2*  Computer Algebra System SINGULAR     *
3****************************************/
4
[0e1846]5/***************************************************************
6 *
7 * File:       mpsr_Get.cc
8 * Purpose:    definition of the main Get routine(s)
9 * Author:     Olaf Bachmann (10/95)
10 *
11 * Change History (most recent first):
12 *
13 ***************************************************************/
14
[762407]15#include "config.h"
[b1dfaf]16#include <kernel/mod2.h>
[0e1846]17
18#ifdef HAVE_MPSR
19
20
21#include"mpsr_Get.h"
22#include"mpsr_Tok.h"
23
[599326]24#include <Singular/tok.h>
25#include <kernel/longrat.h>
[0fb34ba]26#include <misc/intvec.h>
[599326]27#include <kernel/ideals.h>
[0fb34ba]28#include <polys/matpol.h>
[599326]29#include <Singular/lists.h>
[0e1846]30
[e7d5ef]31#include <misc/mylimits.h>
[0e1846]32
[c232af]33omBin mpsr_sleftv_bin = omGetSpecBin(sizeof(mpsr_sleftv));
[0e1846]34
35/***************************************************************
36 *
37 * prototypes
38 *
39 ***************************************************************/
40static mpsr_Status_t GetIntVecLeftv(MP_Link_pt link, MPT_Node_pt node,
41                                  mpsr_leftv mlv);
42static mpsr_Status_t GetIntMatLeftv(MP_Link_pt link, MPT_Node_pt node,
43                                  mpsr_leftv mlv);
44static mpsr_Status_t GetRingLeftv(MP_Link_pt link, MPT_Node_pt node,
45                                mpsr_leftv mlv);
46static mpsr_Status_t GetPolyLeftv(MP_Link_pt link, MPT_Node_pt node,
[12310e]47                                mpsr_leftv mlv, BOOLEAN IsUnOrdered);
[0e1846]48static mpsr_Status_t GetPolyVectorLeftv(MP_Link_pt link, MPT_Node_pt node,
[12310e]49                                        mpsr_leftv mlv,
50                                        BOOLEAN IsUnOrdered = FALSE);
[0e1846]51static mpsr_Status_t GetIdealLeftv(MP_Link_pt link, MPT_Node_pt node,
[12310e]52                                 mpsr_leftv mlv, BOOLEAN IsUnOrdered = FALSE);
[0e1846]53static mpsr_Status_t GetModuleLeftv(MP_Link_pt link, MPT_Node_pt node,
[12310e]54                                  mpsr_leftv mlv, BOOLEAN IsUnOrdered = FALSE);
[0e1846]55static mpsr_Status_t GetMatrixLeftv(MP_Link_pt link, MPT_Node_pt node,
[12310e]56                                  mpsr_leftv mlv, BOOLEAN IsUnOrdered = FALSE);
[0e1846]57static mpsr_Status_t GetMapLeftv(MP_Link_pt link, MPT_Node_pt node,
58                               mpsr_leftv mlv);
59static mpsr_Status_t GetCopCommandLeftv(MP_Link_pt link, MPT_Node_pt node,
60                                      mpsr_leftv mlv, short quote);
61
62/***************************************************************
63 *
[a9a7be]64 * Inlines
[0e1846]65 *
66 ***************************************************************/
67
[a9a7be]68//
[0e1846]69// Predicates which examine nodes for primitive Singular types
[a9a7be]70//
[0e1846]71#define fr(cond)    if (! (cond)) return FALSE
72
[40ef69]73static inline BOOLEAN IsIntVecNode(MPT_Node_pt node)
[0e1846]74{
75  fr(NodeCheck(node, MP_MatrixDict, MP_CopMatrixDenseVector));
76
[4a8d95]77  MPT_Tree_pt tree = MPT_ProtoAnnotValue(node);
[0e1846]78  return tree != NULL && NodeCheck(tree->node, MP_CommonMetaType,
[feaddd]79                                   MP_ProtoDict, MP_CmtProtoIMP_Sint32);
[0e1846]80}
81
[40ef69]82static inline BOOLEAN IsIntMatNode(MPT_Node_pt node)
[0e1846]83{
84  fr(NodeCheck(node, MP_MatrixDict, MP_CopMatrixDenseMatrix));
85
[4a8d95]86  MPT_Tree_pt tree = MPT_ProtoAnnotValue(node);
[0e1846]87  return tree != NULL && NodeCheck(tree->node, MP_CommonMetaType,
[feaddd]88                                   MP_ProtoDict, MP_CmtProtoIMP_Sint32);
[0e1846]89}
90
[40ef69]91static inline BOOLEAN IsRingNode(MPT_Node_pt node, ring &r, BOOLEAN &IsUnOrdered)
[0e1846]92{
93  BOOLEAN mv;
94  return
95    NodeCheck(node, MP_PolyDict, MP_CopPolyRing) &&
[4f136d]96    mpsr_GetRingAnnots(node, r, mv, IsUnOrdered) == mpsr_Success;
[0e1846]97}
98
[40ef69]99static inline BOOLEAN IsPolyNode(MPT_Node_pt node, ring &r, BOOLEAN &IsUnOrdered)
[0e1846]100{
101  BOOLEAN mv;
[a9a7be]102
[0e1846]103  //for the timne being, we only accept DDP's
104  return
105    NodeCheck(node, MP_PolyDict, MP_CopPolyDenseDistPoly) &&
[4a8d95]106    MPT_Annot(node, MP_PolyDict, MP_AnnotPolyModuleVector) == NULL &&
[4f136d]107    mpsr_GetRingAnnots(node, r, mv, IsUnOrdered) == mpsr_Success;
[0e1846]108}
109
[40ef69]110static inline BOOLEAN IsPolyVectorNode(MPT_Node_pt node, ring &r,
[12310e]111                                BOOLEAN &IsUnOrdered)
[0e1846]112{
113  BOOLEAN mv;
[a9a7be]114
[0e1846]115  //for the timne being, we only accept DDP's
116  return
117    NodeCheck(node, MP_PolyDict, MP_CopPolyDenseDistPoly) &&
[4a8d95]118    MPT_Annot(node, MP_PolyDict, MP_AnnotPolyModuleVector) != NULL &&
[4f136d]119    mpsr_GetRingAnnots(node, r, mv, IsUnOrdered) == mpsr_Success;
[0e1846]120}
121
[40ef69]122static inline BOOLEAN IsIdealNode(MPT_Node_pt node, ring &r,
[12310e]123                           BOOLEAN &IsUnOrdered)
[0e1846]124{
125  fr(NodeCheck(node, MP_PolyDict, MP_CopPolyIdeal));
[4a8d95]126  MPT_Tree_pt tree = MPT_ProtoAnnotValue(node);
[0e1846]127  fr(tree != NULL);
128  node = tree->node;
129  return
130    node->type == MP_CommonMetaOperatorType &&
131    node->numchild == 0 &&
[12310e]132    IsPolyNode(node, r, IsUnOrdered);
[0e1846]133}
134
[40ef69]135static inline BOOLEAN IsModuleNode(MPT_Node_pt node, ring &r, BOOLEAN &IsUnOrdered)
[0e1846]136{
137  fr(NodeCheck(node, MP_PolyDict, MP_CopPolyModule));
[4a8d95]138  MPT_Tree_pt tree = MPT_ProtoAnnotValue(node);
[0e1846]139  fr(tree != NULL);
140  node = tree->node;
141  return
142    node->type == MP_CommonMetaOperatorType &&
143    node->numchild == 0 &&
[12310e]144    IsPolyVectorNode(node, r, IsUnOrdered);
[0e1846]145}
146
[40ef69]147static inline BOOLEAN IsMatrixNode(MPT_Node_pt node, ring &r, BOOLEAN &IsUnOrdered)
[0e1846]148{
149  fr(NodeCheck(node, MP_MatrixDict, MP_CopMatrixDenseMatrix));
[4a8d95]150  MPT_Tree_pt tree = MPT_ProtoAnnotValue(node);
[0e1846]151  fr(tree != NULL);
152  node = tree->node;
153  return
154    node->type == MP_CommonMetaOperatorType &&
155    node->numchild == 0 &&
[12310e]156    IsPolyNode(node, r, IsUnOrdered);
[0e1846]157}
158
[40ef69]159static inline BOOLEAN IsQuitNode(MPT_Node_pt node)
[feaddd]160{
161  return NodeCheck(node, MP_MpDict, MP_CopMpEndSession);
162}
163
[0e1846]164//
165// Init*Leftv functions
166//
[40ef69]167static inline void InitIntLeftv(mpsr_leftv mlv, int i)
[0e1846]168{
169  mlv->lv = mpsr_InitLeftv(INT_CMD, (void *) i);
170}
171
[40ef69]172static inline void InitApIntLeftv(mpsr_leftv mlv, mpz_ptr apint)
[0e1846]173{
[896561]174  number n = (number) ALLOC_RNUMBER();
[a3bc95e]175#if defined(LDEBUG)
[97454d]176    n->debug=123456;
177#endif
[0e1846]178  mlv->r = mpsr_rDefault(0);
179  n->s = 3;
[0f7301]180  memcpy(&(n->z), apint, sizeof(mpz_t));
[ee10da]181  nlNormalize(n);
[0f7301]182  omFreeSize(apint, sizeof(mpz_t));
[0e1846]183  mlv->lv = mpsr_InitLeftv(NUMBER_CMD, n);
184}
185
[40ef69]186static inline void InitReal32Leftv(mpsr_leftv mlv, MPT_Arg_t r32)
[0e1846]187{
188  number n = (number) r32;
189//  n = Real32_2_Number(r32);
190
191  mlv->r = mpsr_rDefault(-1);
192  mlv->lv = mpsr_InitLeftv(NUMBER_CMD, n);
193}
[a9a7be]194
[40ef69]195static inline void InitIdentifierLeftv(mpsr_leftv mlv, char *name, short quote)
[0e1846]196{
197  int pos;
[a9a7be]198
[0e1846]199  if (quote <= 0)
200  {
201    idhdl h = mpsr_FindIdhdl(name, mlv->r);
202
203    if (h != NULL)
204    {
[e6969d]205      mlv->lv = mpsr_InitLeftv(IDHDL, (void *) h);
[0e1846]206    }
[f9e276]207    else if (strcmp(name, "basering") == 0)
208    {
209      mlv->lv = mpsr_InitLeftv(IDHDL, (void*) currRingHdl);
210      mlv->lv->name=IDID(currRingHdl);
211      mlv->lv->attribute=IDATTR(currRingHdl);
212    }
[0e1846]213    else
214    {
215      poly p;
[a3bc95e]216
[0e1846]217      pos = mpsr_rDefault(0, name, mlv->r);
[2a2c07]218      mpsr_SetCurrRing(mlv->r, TRUE);
[0e1846]219      p = pOne();
[51c163]220      pSetExp(p,pos+1, 1);
[e6969d]221      pSetm(p);
[0e1846]222      mlv->lv = mpsr_InitLeftv(POLY_CMD, (void *) p);
223    }
[c232af]224    omFree(name);
[0e1846]225  }
226  else
227  {
228    mlv->lv = mpsr_InitLeftv(DEF_CMD, NULL);
229    mlv->lv->name = name;
230  }
231}
232
233/* primitive mpsr_Get*Leftv functions */
234
[40ef69]235static inline mpsr_Status_t mpsr_GetIntLeftv(MPT_Node_pt node, mpsr_leftv mlv)
[0e1846]236{
237  mpsr_assume(MP_IsFixedIntegerType(node->type));
238  mlv->lv = mpsr_InitLeftv(INT_CMD, node->nvalue);
239  return mpsr_Success;
240}
241
[40ef69]242static inline mpsr_Status_t mpsr_GetReal32Leftv(MPT_Node_pt node, mpsr_leftv mlv)
[0e1846]243{
244  mpsr_assume(node->type == MP_Real32Type);
245  InitReal32Leftv(mlv, node->nvalue);
246  return mpsr_Success;
247}
248
[40ef69]249static inline mpsr_Status_t mpsr_GetApIntLeftv(MPT_Node_pt node, mpsr_leftv mlv)
[0e1846]250{
251  InitApIntLeftv(mlv, (mpz_ptr)  node->nvalue);
252  node->nvalue = NULL;
253  return mpsr_Success;
254}
255
[40ef69]256static inline mpsr_Status_t mpsr_GetIdentifierLeftv(MPT_Node_pt node, mpsr_leftv mlv,
[0e1846]257                                             short quote)
258{
259  mpsr_assume(MP_IsIdType(node->type));
260  char *id;
[4a8d95]261  MPT_Annot_pt proc_annot = MPT_Annot(node, MP_SingularDict,
[f9e276]262                                      MP_AnnotSingularProcDef);
[0e1846]263
264  if (node->type == MP_CommonGreekIdentifierType ||
265      node->type == MP_CommonGreekIdentifierType)
266  {
[c232af]267    id  = (char *) omAlloc(2*sizeof(char));
[0e1846]268    id[1] = '\0';
269    id[0] = MP_UINT8_T(node->nvalue);
270  }
271  else
272  {
273    id = MP_STRING_T(node->nvalue);
274    node->nvalue = NULL;
275  }
[a9a7be]276
[0e1846]277  InitIdentifierLeftv(mlv, id, quote);
278
[d754b7]279  if (proc_annot != NULL) mlv->lv->rtyp = PROC_CMD;
[a9a7be]280
[0e1846]281  return mpsr_Success;
282}
283
[40ef69]284static inline mpsr_Status_t mpsr_GetStringLeftv(MPT_Node_pt node, mpsr_leftv mlv)
[0e1846]285{
286  mpsr_assume(node->type == MP_StringType);
287  mlv->lv = mpsr_InitLeftv(STRING_CMD, MP_STRING_T(node->nvalue));
288  node->nvalue = NULL;
289  return mpsr_Success;
290}
291
[40ef69]292static inline mpsr_Status_t GetQuitLeftv(mpsr_leftv mlv)
[feaddd]293{
[c232af]294  mlv->lv = mpsr_InitLeftv(STRING_CMD, (void *) omStrDup(MPSR_QUIT_STRING));
[feaddd]295  return mpsr_Success;
296}
297
[0e1846]298/***************************************************************
299 *
300 * The top-level routine for getting a message
301 *
302 ***************************************************************/
303mpsr_Status_t mpsr_GetMsg(MP_Link_pt link, leftv &lv)
304{
305  mpsr_sleftv mlv, mlv1;
306  mpsr_Status_t status = mpsr_Success;
[cc0296]307  mlv.lv = NULL;
308  mlv.r = NULL;
309  mlv1.lv = NULL;
310  mlv1.r = NULL;
[0e1846]311
[feaddd]312  status = (MP_InitMsg(link) == MP_Success ? mpsr_Success : mpsr_MP_Failure);
[a9a7be]313
[feaddd]314  if (status == mpsr_Success && ! MP_TestEofMsg(link))
[0e1846]315    status = mpsr_GetLeftv(link, &mlv, 0);
316  else
317  {
318    lv = mpsr_InitLeftv(NONE, NULL);
[feaddd]319    return status;
[0e1846]320  }
321
322  // handle more than one leftv (ie. chains of leftv's)
323  while (status == mpsr_Success && ! MP_TestEofMsg(link))
324  {
325    // Get next leftv
326    status = mpsr_GetLeftv(link, &mlv1, 0);
327    if (status == mpsr_Success)
328      status = mpsr_MergeLeftv(&mlv, &mlv1);
329  }
330
331  if (status == mpsr_Success)
332  {
333    // Now mlv is our leftv -- check whether r has an ordering set
334    if (mlv.r != NULL && mlv.r->order[0] == ringorder_unspec)
[a9a7be]335    {
[12310e]336        ring r = rCopy(mlv.r);
[4a8d95]337        r->order[0] = ringorder_dp;
[12310e]338        mpsr_rSetOrdSgn(r);
339        mpsr_MapLeftv(mlv.lv, mlv.r, r);
340        rKill(mlv.r);
341        mlv.r = r;
[0e1846]342    }
[a9a7be]343
[a5189b]344    mpsr_SetCurrRingHdl(&mlv);
[0e1846]345
346    lv = mlv.lv;
347  }
[a9a7be]348  else lv = mpsr_InitLeftv(NONE, NULL);
349
[0e1846]350  return status;
351}
352
353/***************************************************************
354 *
355 * Top-level routine for getting a mpsr_leftv
356 *
357 ***************************************************************/
358
359// if quote > 0, then identifiers are not tried to be resolved, or
360// converted into a ring variable
361mpsr_Status_t mpsr_GetLeftv(MP_Link_pt link, mpsr_leftv mlv, short quote)
362{
363  MPT_Node_pt node = NULL;
364  MP_NodeType_t type;
365  mlv->r = NULL;
366  mlv->lv = NULL;
367
368  mpt_failr(MPT_GetNode(link, &node));
369
370  type = node->type;
371
372  if (MP_IsFixedIntegerType(type))
373    failr(mpsr_GetIntLeftv(node, mlv));
374  else if (MP_IsIdType(type))
375    failr(mpsr_GetIdentifierLeftv(node, mlv, quote));
376  else
377  {
378    switch (node->type)
379    {
380        case MP_ApIntType:
381          failr(mpsr_GetApIntLeftv(node, mlv));
[a9a7be]382          break;
[0e1846]383
384        case MP_StringType:
385          failr(mpsr_GetStringLeftv(node, mlv));
[a9a7be]386          break;
[0e1846]387
388        case MP_Real32Type:
389          failr(mpsr_GetReal32Leftv(node, mlv));
[a9a7be]390          break;
391
[0e1846]392        case MP_CommonOperatorType:
393          failr(mpsr_GetCommonOperatorLeftv(link, node, mlv, quote));
[a9a7be]394          break;
[0e1846]395
396        case MP_OperatorType:
397          failr(mpsr_GetOperatorLeftv(link, node, mlv, quote));
[a9a7be]398          break;
[0e1846]399
400        default:
401          MPT_DeleteNode(node);
402          return mpsr_SetError(mpsr_UnknownMPNodeType);
403    }
404  }
[a9a7be]405
[0e1846]406  // everything was ok
407  MPT_DeleteNode(node);
408  return mpsr_Success;
409}
410
411/***************************************************************
412 *
413 * mpsr_Get*Leftv
414 *
415 ***************************************************************/
416mpsr_Status_t mpsr_GetCommonOperatorLeftv(MP_Link_pt link,
[12310e]417                                          MPT_Node_pt node,
418                                          mpsr_leftv mlv,
419                                          short quote)
[0e1846]420{
421  mpsr_assume(node->type == MP_CommonOperatorType);
[12310e]422  BOOLEAN IsUnOrdered;
[a9a7be]423
[0e1846]424  // Check for Singular data types
425  // IntVec
426  if (IsIntVecNode(node))
427    return GetIntVecLeftv(link, node, mlv);
428  // IntMat
429  else if (IsIntMatNode(node))
430    return GetIntMatLeftv(link, node, mlv);
431  // Ring
[12310e]432  else if (IsRingNode(node, mlv->r, IsUnOrdered))
[0e1846]433    return GetRingLeftv(link, node, mlv);
[a9a7be]434  // Poly
[12310e]435  else if (IsPolyNode(node, mlv->r, IsUnOrdered))
436    return GetPolyLeftv(link, node, mlv, IsUnOrdered);
[0e1846]437  // PolyVector
[12310e]438  else if (IsPolyVectorNode(node, mlv->r, IsUnOrdered))
439    return GetPolyVectorLeftv(link, node, mlv, IsUnOrdered);
[0e1846]440  // Ideal
[12310e]441  else if (IsIdealNode(node, mlv->r, IsUnOrdered))
442    return GetIdealLeftv(link, node, mlv, IsUnOrdered);
[0e1846]443  // Module
[12310e]444  else if (IsModuleNode(node, mlv->r, IsUnOrdered))
445    return GetModuleLeftv(link, node, mlv, IsUnOrdered);
[0e1846]446  // Matrix
[12310e]447  else if (IsMatrixNode(node, mlv->r, IsUnOrdered))
448    return GetMatrixLeftv(link, node, mlv, IsUnOrdered);
[feaddd]449  else if (IsQuitNode(node))
450    return GetQuitLeftv(mlv);
[a9a7be]451  // Map
[0e1846]452  else
453    // now it should be a command (which handles Proc, Map and List
454    // seperately)
455    return GetCopCommandLeftv(link, node, mlv, quote);
456}
457
458mpsr_Status_t mpsr_GetOperatorLeftv(MP_Link_pt link,
459                                  MPT_Node_pt node,
460                                  mpsr_leftv mlv,
461                                  short quote)
462{
[b90dfc1]463  mpsr_assume(node->type == MP_OperatorType);
[0e1846]464  MP_NumChild_t nc = node->numchild, i;
465  mpsr_sleftv smlv1, *mlv1 = &smlv1;
[a9a7be]466
[0e1846]467
[4a8d95]468  if (MPT_ProtoAnnotValue(node) != NULL)
[0e1846]469    return mpsr_SetError(mpsr_CanNotHandlePrototype);
470
471  if (nc > 0)
472  {
473    failr(mpsr_GetLeftv(link, mlv, quote));
[b90dfc1]474    for (i=1; i<nc; i++)
[0e1846]475    {
476      failr(mpsr_GetLeftv(link, mlv1, quote));
477      failr(mpsr_MergeLeftv(mlv, mlv1));
478    }
479  }
[a9a7be]480
[c232af]481  command cmd = (command) omAlloc0Bin(sip_command_bin);
[0e1846]482  cmd->op = PROC_CMD;
483  cmd->arg1.rtyp = STRING_CMD;
[c232af]484  cmd->arg1.data = (void *) omStrDup(MP_STRING_T(node->nvalue));
[0e1846]485
486  if (node->numchild > 0)
487  {
488    cmd->argc = 2;
489    memcpy(&(cmd->arg2), mlv->lv, sizeof(sleftv));
[c232af]490    omFreeBin(mlv->lv, sleftv_bin);
[0e1846]491  }
492  else cmd->argc = 1;
493
494  mlv->lv = mpsr_InitLeftv(COMMAND, (void *) cmd);
495  return mpsr_Success;
496}
[a9a7be]497
[0e1846]498/***************************************************************
499 *
500 * Get*Leftv routines
501 *
502 ***************************************************************/
503//
504// Get*Leftv routines
505//
506static mpsr_Status_t GetIntVecLeftv(MP_Link_pt link, MPT_Node_pt node,
507                                  mpsr_leftv mlv)
508{
[c232af]509  intvec *iv = new intvec(node->numchild);
[0e1846]510  int *v = iv->ivGetVec();
511
512  mp_failr(IMP_GetSint32Vector(link, &v, node->numchild));
513  mlv->lv = mpsr_InitLeftv(INTVEC_CMD, (void *) iv);
514  return mpsr_Success;
515}
516
517static mpsr_Status_t GetIntMatLeftv(MP_Link_pt link, MPT_Node_pt node,
518                                  mpsr_leftv mlv)
519{
520  intvec *iv;
521  int row = node->numchild, col = 1, *v;
[4a8d95]522  MPT_Annot_pt annot = MPT_Annot(node, MP_MatrixDict,
[fff984]523                                 MP_AnnotMatrixDimension);
[0e1846]524  if (annot != NULL &&
525      annot->value != NULL &&
526      annot->value->node->numchild == 2 &&
527      NodeCheck(annot->value->node, MP_CommonOperatorType, MP_BasicDict,
528                MP_CopBasicList))
529  {
530    MPT_Tree_pt *tarray = (MPT_Tree_pt *) annot->value->args;
[82dbf50]531    if (tarray[0]->node->type == MP_Sint32Type &&
532        tarray[1]->node->type == MP_Sint32Type)
[0e1846]533    {
[82dbf50]534      row = MP_SINT32_T(tarray[0]->node->nvalue);
535      col = MP_SINT32_T(tarray[1]->node->nvalue);
[0e1846]536    }
537  }
538
[c232af]539  iv = new intvec(row, col, 0);
[0e1846]540  v = iv->ivGetVec();
541  mp_failr(IMP_GetSint32Vector(link, &v, node->numchild));
542  mlv->lv = mpsr_InitLeftv(INTMAT_CMD, (void *) iv);
543  return mpsr_Success;
[a9a7be]544}
[0e1846]545
546static mpsr_Status_t GetRingLeftv(MP_Link_pt link, MPT_Node_pt node,
547                                mpsr_leftv mlv)
548{
549  mpsr_assume(mlv->r != NULL);
550
551  if (node->numchild != 0) mpt_failr(MPT_SkipArgs(link, node));
552
553  mlv->lv = mpsr_InitLeftv(((mlv->r->qideal != NULL) ? (short) QRING_CMD :
554                            (short) RING_CMD),
555                           (void *) mlv->r);
556  mlv->r = NULL;
557  return mpsr_Success;
558}
559
560static mpsr_Status_t GetPolyLeftv(MP_Link_pt link, MPT_Node_pt node,
[12310e]561                                  mpsr_leftv mlv, BOOLEAN IsUnOrdered)
[0e1846]562{
563  poly p;
564
565  mpsr_assume(mlv->r != NULL);
[a9a7be]566
[0e1846]567  failr(mpsr_GetPoly(link, p, node->numchild, mlv->r));
[2f436b]568  if (IsUnOrdered) p = pSort(p);
[12310e]569  pTest(p);
[0e1846]570  mlv->lv = mpsr_InitLeftv(POLY_CMD, (void *) p);
571  return mpsr_Success;
572}
573
574static mpsr_Status_t GetPolyVectorLeftv(MP_Link_pt link, MPT_Node_pt node,
[12310e]575                                      mpsr_leftv mlv, BOOLEAN IsUnOrdered)
[0e1846]576{
577  poly p;
578
579  mpsr_assume(mlv->r != NULL);
[a9a7be]580
[0e1846]581  failr(mpsr_GetPolyVector(link, p, node->numchild, mlv->r));
[2f436b]582  if (IsUnOrdered) p = pSort(p);
[12310e]583  pTest(p);
[0e1846]584  mlv->lv = mpsr_InitLeftv(VECTOR_CMD, (void *) p);
585  return mpsr_Success;
586}
587
588static mpsr_Status_t GetIdealLeftv(MP_Link_pt link, MPT_Node_pt node,
[12310e]589                                 mpsr_leftv mlv, BOOLEAN IsUnOrdered)
[0e1846]590{
591  MP_NumChild_t nc = node->numchild, i;
592  ring r = mlv->r;
593  MP_Uint32_t nmon;
594
595  mpsr_assume(r != NULL);
596  ideal id = idInit(nc,1);
597  for (i=0; i<nc; i++)
598  {
599    mp_failr(IMP_GetUint32(link, &nmon));
600    failr(mpsr_GetPoly(link, id->m[i], nmon, r));
[2f436b]601    if (IsUnOrdered) id->m[i] = pSort(id->m[i]);
[0e1846]602  }
[12310e]603  idTest(id);
[0e1846]604  mlv->lv = mpsr_InitLeftv(IDEAL_CMD, (void *) id);
605  return mpsr_Success;
606}
607
608static mpsr_Status_t GetModuleLeftv(MP_Link_pt link, MPT_Node_pt node,
[12310e]609                                  mpsr_leftv mlv, BOOLEAN IsUnOrdered)
[0e1846]610{
611  MP_NumChild_t nc = node->numchild, i;
612  ring r = mlv->r;
[e51e9b]613  MP_Uint32_t nmon, rank = 1;
[4a8d95]614  MPT_Annot_pt annot = MPT_Annot(node, MP_PolyDict,
[e51e9b]615                                     MP_AnnotPolyModuleRank);
[a9a7be]616  if (annot != NULL &&
[e51e9b]617      annot->value != NULL &&
[a9a7be]618      annot->value->node->type == MP_Uint32Type
[e51e9b]619      )
620    rank = MP_UINT32_T(annot->value->node->nvalue);
[0e1846]621
622  mpsr_assume(r != NULL);
[e51e9b]623  ideal id = idInit(nc,rank);
[0e1846]624  for (i=0; i<nc; i++)
625  {
626    mp_failr(IMP_GetUint32(link, &nmon));
627    failr(mpsr_GetPolyVector(link, id->m[i], nmon, r));
[2f436b]628    if (IsUnOrdered) id->m[i] = pSort(id->m[i]);
[0e1846]629  }
[e51e9b]630  if (rank == 1)
[ca9096f]631    id->rank = id_RankFreeModule(id, currRing);
[12310e]632  idTest(id);
[0e1846]633  mlv->lv = mpsr_InitLeftv(MODUL_CMD, (void *) id);
634  return mpsr_Success;
635}
636
637static mpsr_Status_t GetMatrixLeftv(MP_Link_pt link, MPT_Node_pt node,
[12310e]638                                  mpsr_leftv mlv, BOOLEAN IsUnOrdered)
[0e1846]639{
640  MP_NumChild_t nc = node->numchild, row = nc, col = 1, i;
641  matrix mp;
642  MP_Uint32_t nmon;
[4a8d95]643  MPT_Annot_pt annot = MPT_Annot(node, MP_MatrixDict,
[0e1846]644                                     MP_AnnotMatrixDimension);
645  if (annot != NULL &&
646      annot->value != NULL &&
647      annot->value->node->numchild == 2 &&
648      NodeCheck(annot->value->node, MP_CommonOperatorType, MP_BasicDict,
649               MP_CopBasicList))
650  {
651    MPT_Tree_pt *tarray = (MPT_Tree_pt *) annot->value->args;
[82dbf50]652    if (tarray[0]->node->type == MP_Sint32Type &&
653        tarray[1]->node->type == MP_Sint32Type)
[0e1846]654    {
[82dbf50]655      row = MP_SINT32_T(tarray[0]->node->nvalue);
656      col = MP_SINT32_T(tarray[1]->node->nvalue);
[0e1846]657    }
658  }
659
660  mpsr_assume(mlv->r != NULL);
661  mp = mpNew(row, col);
662  for (i=0; i<nc; i++)
663  {
664    mp_failr(IMP_GetUint32(link, &nmon));
665    failr(mpsr_GetPoly(link, mp->m[i], nmon, mlv->r));
[2f436b]666    if (IsUnOrdered) mp->m[i] = pSort(mp->m[i]);
[0e1846]667  }
668
669  mlv->lv = mpsr_InitLeftv(MATRIX_CMD, (void *) mp);
670  return mpsr_Success;
671}
672
[fff984]673static mpsr_Status_t GetPackageLeftv(MP_Link_pt link, MPT_Node_pt node,
674                                     mpsr_leftv mlv)
675{
[c232af]676  package pack = (package) omAlloc0Bin(sip_package_bin);
[a9a7be]677
[fff984]678  pack->language = LANG_NONE;
[a9a7be]679
[fff984]680  if (node->numchild > 0)
681  {
682    failr(mpsr_GetLeftv(link, mlv, 0));
683    if (mlv->lv->rtyp != STRING_CMD)
684      return mpsr_SetError(mpsr_WrongArgumentType);
685    pack->libname = (char*) mlv->lv->data;
686    mlv->lv->rtyp = PACKAGE_CMD;
687  }
688  else
689    mlv->lv = mpsr_InitLeftv(PACKAGE_CMD, NULL);
690
691  mlv->lv->data = (void*) pack;
692
[a9a7be]693  MPT_Annot_pt annot = MPT_Annot(node, MP_SingularDict,
[fff984]694                                 MP_AnnotSingularPackageType);
695  if (annot != NULL && annot->value != NULL && annot->value->node)
696  {
697    MPT_Node_pt node = annot->value->node;
698    if (node->type == MP_Uint8Type && MP_UINT8_T(node->nvalue) < LANG_MAX)
699      pack->language =  (language_defs) MP_UINT8_T(node->nvalue);
700  }
701  return mpsr_Success;
702}
[a9a7be]703
704
[0e1846]705static mpsr_Status_t GetMapLeftv(MP_Link_pt link, MPT_Node_pt node,
706                               mpsr_leftv mlv)
707{
708  mpsr_sleftv smlv1, smlv2, *mlv1 = &smlv1, *mlv2 = &smlv2;
709
710  if (node->numchild != 3)
711    return mpsr_SetError(mpsr_WrongNumofArgs);
[a9a7be]712
[0e1846]713  failr(mpsr_GetLeftv(link, mlv, 0));
714  failr(mpsr_GetLeftv(link, mlv1, 0));
715  failr(mpsr_GetLeftv(link, mlv2, 0));
716
717  if (mlv->lv->rtyp != RING_CMD ||
718      mlv1->lv->rtyp != STRING_CMD ||
719      mlv2->lv->rtyp != IDEAL_CMD)
720    return mpsr_SetError(mpsr_WrongArgumentType);
721
722  ring r = (ring) mlv->lv->data, r2;
723  char *name = (char *) mlv1->lv->data;
724  ideal id = (ideal) mlv2->lv->data;
725
726  idhdl h = mpsr_FindIdhdl(name, r2);
[63374c]727  if (h == NULL || IDTYP(h) != RING_CMD || ! rEqual(IDRING(h), r))
[0e1846]728  {
729    h = mpsr_InitIdhdl(RING_CMD, r, name);
[46d09b]730    h->next = IDROOT;
731    IDROOT = h;
[0e1846]732  }
733
[995a6a]734  map m = (map) omAlloc0Bin(sip_sideal_bin);
[c232af]735  m->preimage = omStrDup(name);
[0e1846]736  m->m = id->m;
737  m->nrows = id->nrows;
738  m->ncols = id->ncols;
739
[c232af]740  omFreeBin(mlv->lv, sleftv_bin);
[0e1846]741
[c232af]742  omFree(mlv1->lv->data);
743  omFreeBin(mlv1->lv, sleftv_bin);
[a9a7be]744
[c232af]745  omFreeBin(id, sip_sideal_bin);
746  omFreeBin(mlv2->lv, sleftv_bin);
[0e1846]747
748  mlv->r = mlv2->r;
749  mlv->lv = mpsr_InitLeftv(MAP_CMD, (void *) m);
750
751  return mpsr_Success;
752}
753
[a9a7be]754
[0e1846]755static mpsr_Status_t GetCopCommandLeftv(MP_Link_pt link, MPT_Node_pt node,
[92e539]756                                        mpsr_leftv mlv, short quote)
[0e1846]757{
758  short tok;
759  MP_NumChild_t nc = node->numchild, i;
760  mpsr_sleftv smlv1, *mlv1 = &smlv1;
[5615cd9]761  MPT_Tree_pt typespec;
[a9a7be]762
763
[0e1846]764  failr(mpsr_mp2tok(node->dict, MP_COMMON_T(node->nvalue), &tok));
765
[4a8d95]766  if ((typespec = MPT_ProtoAnnotValue(node)) &&
[92e539]767      MPT_IsTrueProtoTypeSpec(typespec))
[0e1846]768    return mpsr_SetError(mpsr_CanNotHandlePrototype);
769
770  if (tok == MAP_CMD) return GetMapLeftv(link, node, mlv);
[fff984]771  if (tok == PACKAGE_CMD) return GetPackageLeftv(link, node, mlv);
772  if (tok == COLONCOLON) quote++;
773
[0e1846]774  if (nc > 0)
775  {
776    if (tok == '=') failr(mpsr_GetLeftv(link, mlv, quote + 1));
777    else failr(mpsr_GetLeftv(link, mlv, quote));
778  }
779
780  for (i=1; i<nc; i++)
781  {
782    failr(mpsr_GetLeftv(link, mlv1, quote));
783    failr(mpsr_MergeLeftv(mlv, mlv1));
784  }
785
[c232af]786  command cmd = (command) omAlloc0Bin(sip_command_bin);
[0e1846]787  cmd->op = tok;
788  cmd->argc = nc;
789
[92e539]790  // check that associative operators are binary
791  if (nc > 2 && (tok == '+' || tok == '*'))
792  {
793    leftv lv = mlv->lv, lv2;
794    command c = cmd, c2;
795
796    for (i=2; i<nc; i++)
797    {
798      c->op = tok;
799      c->argc = 2;
800      memcpy(&(c->arg1), lv, sizeof(sleftv));
801      c->arg1.next = NULL;
802
[c232af]803      c2 = (command) omAlloc0Bin(sip_command_bin);
[92e539]804      c->arg2.data = (void *) c2;
805      c->arg2.rtyp = COMMAND;
806      c = c2;
807      lv2 = lv->next;
[c232af]808      omFreeBin(lv, sleftv_bin);
[92e539]809      lv = lv2;
810    }
811    c->op = tok;
812    c->argc = 2;
813    memcpy(&(c->arg1), lv, sizeof(sleftv));
814    c->arg1.next = NULL;
815    memcpy(&(c->arg2), lv->next, sizeof(sleftv));
[c232af]816    omFreeBin(lv->next, sleftv_bin);
817    omFreeBin(lv, sleftv_bin);
[92e539]818  }
819  else if (nc >= 1)
[0e1846]820  {
821    memcpy(&(cmd->arg1), mlv->lv, sizeof(sleftv));
822    if (nc <= 3)
823    {
824      (cmd->arg1).next = NULL;
825      if (nc >= 2)
826      {
827        memcpy(&(cmd->arg2), mlv->lv->next, sizeof(sleftv));
828        (cmd->arg2).next = NULL;
829
830        if (nc == 3)
831        {
832          memcpy(&(cmd->arg3), mlv->lv->next->next, sizeof(sleftv));
[c232af]833          omFreeBin(mlv->lv->next->next, sleftv_bin);
[0e1846]834        }
[c232af]835        omFreeBin(mlv->lv->next, sleftv_bin);
[0e1846]836      }
837    }
[c232af]838    omFreeBin(mlv->lv, sleftv_bin);
[0e1846]839  }
[92e539]840
841  // Now we perform some tree manipulations
842  if (nc == 0 && tok == LIST_CMD)
[0e1846]843    // Here we work around a Singular bug: It can not handle lists of 0 args
844    // so we construct them explicitely
[92e539]845  {
[c232af]846    lists l = (lists) omAllocBin(slists_bin);
[92e539]847    l->Init(0);
848    mlv->lv = mpsr_InitLeftv(LIST_CMD, (void *) l);
849    return mpsr_Success;
[0e1846]850  }
851  mlv->lv = mpsr_InitLeftv(COMMAND, (void *) cmd);
852  return mpsr_Success;
853}
854
[a9a7be]855
[0e1846]856/***************************************************************
857 *
858 * The routine for Getting External Data
859 *
860 ***************************************************************/
861
862// this is all the data we want to have in directly when MPT_GetTree
863// is called, i.e. when the value of annots is read
864MPT_Status_t mpsr_GetExternalData(MP_Link_pt link,
865                                  MPT_Arg_t *odata,
866                                  MPT_Node_pt node)
867{
868  *odata = NULL;
[a9a7be]869
[0e1846]870  if (node->type == MP_CommonOperatorType)
871  {
872    mpsr_sleftv mlv;
873    mpsr_Status_t status;
[12310e]874    BOOLEAN IsUnOrdered;
[0e1846]875
876    // we would like to get polys and ideals directly
[12310e]877    if (IsPolyNode(node, mlv.r, IsUnOrdered))
878      status = GetPolyLeftv(link, node, &mlv, IsUnOrdered);
[0e1846]879    // Ideal
[12310e]880    else if (IsIdealNode(node, mlv.r, IsUnOrdered))
881      status = GetIdealLeftv(link, node, &mlv, IsUnOrdered);
[0e1846]882    else
883      return MPT_NotExternalData;
884
885    if (status == mpsr_Success)
886    {
[c232af]887      mpsr_leftv mmlv = (mpsr_leftv) omAlloc0Bin(mpsr_sleftv_bin);
[0e1846]888      memcpy(mmlv, &mlv, sizeof(mpsr_sleftv));
889      *odata = (MPT_ExternalData_t) mmlv;
890      return MPT_Success;
891    }
892    else
893      return MPT_Failure;
894  }
895  else
896    return MPT_NotExternalData;
897}
898
[a9a7be]899
[0e1846]900/***************************************************************
[a9a7be]901 *
[286bd57]902 * A routine which gets the previous dump of Singular
[0e1846]903 *
904 ***************************************************************/
905
[286bd57]906mpsr_Status_t mpsr_GetDump(MP_Link_pt link)
[0e1846]907{
908  mpsr_sleftv mlv;
909  mpsr_Status_t status = mpsr_Success;
910
[97454d]911  status = (MP_InitMsg(link) == MP_Success ? mpsr_Success : mpsr_MP_Failure);
912  while ((status == mpsr_Success) && (! MP_TestEofMsg(link)))
[0e1846]913  {
[765fa3]914    memset(&mlv,0,sizeof(mlv));
[0e1846]915    status=mpsr_GetLeftv(link, &mlv, 0);
916
917    if (status == mpsr_Success)
918    {
[a5189b]919#ifdef MPSR_DEBUG_DUMP
920      command cmd = (command) mlv.lv->data;
921      fprintf(stdout, "Dump got %s \n", cmd->arg1.name);
922      fflush(stdout);
[a9a7be]923#endif
[a5189b]924      mpsr_SetCurrRingHdl(&mlv);
[0e1846]925      if (mlv.lv != NULL)
926      {
927        mlv.lv->Eval();
928        mlv.lv->CleanUp();
[c232af]929        omFreeBin(mlv.lv, sleftv_bin);
[0e1846]930      }
931    }
932    else
933      mpsr_PrintError(status);
934  }
[286bd57]935  return status;
[0e1846]936}
937#endif
Note: See TracBrowser for help on using the repository browser.