source: git/Singular/mpsr_Get.cc @ 06c0b3

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