File: HOWTO-libsingular

package info (click to toggle)
singular 1%3A4.4.1%2Bds-2
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 47,520 kB
  • sloc: cpp: 319,164; ansic: 42,206; perl: 5,855; sh: 5,524; lisp: 4,241; python: 2,101; makefile: 1,890; yacc: 1,651; pascal: 1,411; lex: 1,367; tcl: 1,024; xml: 182
file content (102 lines) | stat: -rw-r--r-- 3,040 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
The following is valid for Singular 4-x-x:
(for technical details see https://www.singular.uni-kl.de/Manual/modules.pdf)

./configure --disable-static ....

make install

---------------------------------------
how to compile and run the the example:
libsingular-config --libs: gives the correct arguments for linking
libsingular-config --cflags: gives the correct arguments for compiling
g++ ...... -o tt tt.cc ....

./tt
--------------------------------------
the example:
#include <Singular/libsingular.h>
main()
{
  // init path names etc.
  siInit((char *)"/...lib/libSingular.so");

  // construct the ring Z/32003[x,y,z]
  // the variable names
  char **n=(char**)omalloc(3*sizeof(char*));
  n[0]=omStrDup("x");
  n[1]=omStrDup("y");
  n[2]=omStrDup("z2");

  ring R=rDefault(32003,3,n);
  // make R the default ring:
  rChangeCurrRing(R);

  // create the polynomial 1
  poly p1=p_ISet(1,R);

  // creat the polynomial 2*x^3*z^2
  poly p2=p_ISet(2,R);
  pSetExp(p2,1,3);
  pSetExp(p2,3,2);
  pSetm(p2);

  // print p1 + p2
  pWrite(p1); printf(" + \n"); pWrite(p2); printf("\n");

  // compute p1+p2
  p1=p_Add_q(p1,p2,R); p2=NULL;
  pWrite(p1);

  // clean up:
  pDelete(&p1);
  rKill(R);

  currentVoice=feInitStdin(NULL);
  // hook for error handling:
  // WerrorS_callback=......; of type p(const char *)
  int err=iiAllStart(NULL,"int ver=system(\"version\");\n",BT_proc,0);
  if (err) errorreported = 0; // reset error handling
  printf("interpreter returns %d\n",err);
  idhdl h=ggetid("ver");
  if (h!=NULL)
    printf("singular variable ver of type %d contains %d\n",h->typ,(int)(long)IDDATA(h));
  else
    printf("variable ver does not exist\n");

  // calling a singular-library function
  idhdl datetime=ggetid("datetime");
  if (datetime==NULL)
    printf("datetime not found\n");
  else
  {
    BOOLEAN res=iiMake_proc(datetime,NULL,NULL);
    if (res) { printf("datetime return an error\n"); errorreported = 0; }
    else      printf("datetime returned type %d, >>%s<<\n",iiRETURNEXPR.Typ(),(char *)iiRETURNEXPR.Data());
  }

  // changing a ring for the interpreter
  // re-using n and R from above
  R=rDefault(32003,3,n);
  idhdl newRingHdl=enterid("R" /* ring name*/,
                           0, /*nesting level, 0=global*/
                           RING_CMD,
                           &IDROOT,
                           FALSE);
   IDRING(newRingHdl)=R;
   // make R the default ring (include rChangeCurrRing):
   rSetHdl(newRingHdl);
   myynest=1; /* <=0: interactive at eof/ >=1: non-interactive */
   err=iiAllStart(NULL,"poly p=x;listvar();return();\n",BT_proc,0);

  // calling a kernel function via the interpreter interface
  sleftv r1; memset(&r1,0,sizeof(r1));
  sleftv arg; memset(&arg,0,sizeof(r1));
  arg.rtyp=STRING_CMD;
  arg.data=omStrDup("huhu");
  err=iiExprArith1(&r1,&arg,TYPEOF_CMD);
  printf("interpreter returns %d\n",err);
  if (err) errorreported = 0; // reset error handling
  else printf("typeof returned type %d, >>%s<<\n",r1.Typ(),r1.Data());
  // clean up r1:
  r1.CleanUp();
}