My Project
Loading...
Searching...
No Matches
ssiLink.cc
Go to the documentation of this file.
1/****************************************
2 * Computer Algebra System SINGULAR *
3 ****************************************/
4/***************************************************************
5 * File: ssiLink.h
6 * Purpose: declaration of sl_link routines for ssi
7 ***************************************************************/
8#define TRANSEXT_PRIVATES 1 /* allow access to transext internals */
9
10#include "kernel/mod2.h"
11
12#include "misc/intvec.h"
13#include "misc/options.h"
14
15#include "reporter/si_signals.h"
16#include "reporter/s_buff.h"
17#include "reporter/si_signals.h"
18
19#include "coeffs/bigintmat.h"
20#include "coeffs/longrat.h"
21
25#include "polys/simpleideals.h"
26#include "polys/matpol.h"
27
32
33#include "Singular/tok.h"
34#include "Singular/ipid.h"
35#include "Singular/ipshell.h"
36#include "Singular/subexpr.h"
38#include "Singular/cntrlc.h"
39#include "Singular/feOpt.h"
40#include "Singular/lists.h"
41#include "Singular/blackbox.h"
43
44#ifdef HAVE_SIMPLEIPC
46#endif
47
48#include <errno.h>
49#include <sys/types.h> /* for portability */
50#include <ctype.h> /*for isdigit*/
51#include <netdb.h>
52#include <netinet/in.h> /* for htons etc.*/
53
54
55#define SSI_VERSION 15
56// 5->6: changed newstruct representation
57// 6->7: attributes
58// 7->8: qring
59// 8->9: module: added rank
60// 9->10: tokens in grammar.h/tok.h reorganized
61// 10->11: extended ring descr. for named coeffs (not in used until 4.1)
62// 11->12: add rank to ideal/module, add smatrix
63// 12->13: NC rings
64// 13->14: ring references
65// 14->15: bigintvec, prune_map, mres_map
66
70
71// forward declarations:
72static void ssiWritePoly_R(const ssiInfo *d, poly p, const ring r);
73static void ssiWritePoly_R_S(poly p, const ring r);
74static void ssiWriteIdeal_R(const ssiInfo *d, int typ,const ideal I, const ring r);
75static poly ssiReadPoly_R(const ssiInfo *D, const ring r);
76static poly ssiReadPoly_R_S(char **s, const ring r);
77static ideal ssiReadIdeal_R(const ssiInfo *d,const ring r);
78
79// the helper functions:
80static BOOLEAN ssiSetCurrRing(const ring r) /* returned: not accepted */
81{
82 // if (currRing!=NULL)
83 // Print("need to change the ring, currRing:%s, switch to: ssiRing%d\n",IDID(currRingHdl),nr);
84 // else
85 // Print("no ring, switch to ssiRing%d\n",nr);
86 if (r==currRing)
87 {
88 rIncRefCnt(r);
90 return TRUE;
91 }
92 else if ((currRing==NULL) || (!rEqual(r,currRing,1)))
93 {
94 char name[20];
95 int nr=0;
96 idhdl h=NULL;
97 loop
98 {
99 snprintf(name,20,"ssiRing%d",nr); nr++;
100 h=IDROOT->get(name, 0);
101 if (h==NULL)
102 {
104 IDRING(h)=rIncRefCnt(r);
105 r->ref=2;/*ref==2: d->r and h */
106 break;
107 }
108 else if ((IDTYP(h)==RING_CMD)
109 && (rEqual(r,IDRING(h),1)))
110 {
112 break;
113 }
114 }
115 rSetHdl(h);
116 return FALSE;
117 }
118 else
119 {
120 rKill(r);
122 return TRUE;
123 }
124}
125static void ssiCheckCurrRing(const ring r)
126{
127 if ((r!=currRing)
128 ||(currRingHdl==NULL)
129 ||(IDRING(currRingHdl)!=r))
130 {
131 char name[20];
132 int nr=0;
133 idhdl h=NULL;
134 loop
135 {
136 snprintf(name,20,"ssiRing%d",nr); nr++;
137 h=IDROOT->get(name, 0);
138 if (h==NULL)
139 {
141 IDRING(h)=rIncRefCnt(r);
142 r->ref=2;/*ref==2: d->r and h */
143 break;
144 }
145 else if ((IDTYP(h)==RING_CMD)
146 && (rEqual(r,IDRING(h),1)))
147 {
148 break;
149 }
150 }
151 rSetHdl(h);
152 }
153 assume((currRing==r) || rEqual(r,currRing));
154}
155// the implementation of the functions:
156void ssiWriteInt(const ssiInfo *d,const int i)
157{
158 fprintf(d->f_write,"%d ",i);
159}
160void ssiWriteInt_S(const int i)
161{
162 StringAppend("%d ",i);
163}
164
165static void ssiWriteString(const ssiInfo *d,const char *s)
166{
167 fprintf(d->f_write,"%d %s ",(int)strlen(s),s);
168}
169static void ssiWriteString_S(const char *s)
170{
171 StringAppend("%d %s ",(int)strlen(s),s);
172}
173
174static void ssiWriteBigInt(const ssiInfo *d, const number n)
175{
177}
178static void ssiWriteBigInt_S(const number n)
179{
181}
182
183static void ssiWriteNumber_CF(const ssiInfo *d, const number n, const coeffs cf)
184{
185 // syntax is as follows:
186 // case 1 Z/p: 3 <int>
187 // case 2 Q: 3 4 <int>
188 // or 3 0 <mpz_t nominator> <mpz_t denominator>
189 // or 3 1 dto.
190 // or 3 3 <mpz_t nominator>
191 // or 3 5 <mpz_t raw nom.> <mpz_t raw denom.>
192 // or 3 6 <mpz_t raw nom.> <mpz_t raw denom.>
193 // or 3 8 <mpz_t raw nom.>
195 {
196 fraction f=(fraction)n;
197 ssiWritePoly_R(d,NUM(f),cf->extRing);
198 ssiWritePoly_R(d,DEN(f),cf->extRing);
199 }
200 else if (getCoeffType(cf)==n_algExt)
201 {
202 ssiWritePoly_R(d,(poly)n,cf->extRing);
203 }
204 else if (cf->cfWriteFd!=NULL)
205 {
206 n_WriteFd(n,d,cf);
207 }
208 else WerrorS("coeff field not implemented");
209}
210
211static void ssiWriteNumber_CF_S(const number n, const coeffs cf)
212{
213 // syntax is as follows:
214 // case 1 Z/p: 3 <int>
215 // case 2 Q: 3 4 <int>
216 // or 3 0 <mpz_t nominator> <mpz_t denominator>
217 // or 3 1 dto.
218 // or 3 3 <mpz_t nominator>
219 // or 3 5 <mpz_t raw nom.> <mpz_t raw denom.>
220 // or 3 6 <mpz_t raw nom.> <mpz_t raw denom.>
221 // or 3 8 <mpz_t raw nom.>
223 {
224 fraction f=(fraction)n;
225 ssiWritePoly_R_S(NUM(f),cf->extRing);
226 ssiWritePoly_R_S(DEN(f),cf->extRing);
227 }
228 else if (getCoeffType(cf)==n_algExt)
229 {
230 ssiWritePoly_R_S((poly)n,cf->extRing);
231 }
232 else if (cf->cfWriteFd_S!=NULL)
233 {
234 n_WriteFd_S(n,cf);
235 }
236 else WerrorS("coeff field not implemented");
237}
238
239static void ssiWriteNumber(const ssiInfo *d, const number n)
240{
241 ssiWriteNumber_CF(d,n,d->r->cf);
242}
243
244static void ssiWriteRing_R(ssiInfo *d,const ring r)
245{
246 /* 5 <ch> <N> <l1> <v1> ...<lN> <vN> <number of orderings> <ord1> <block0_1> <block1_1> .... <extRing> <Q-ideal> */
247 /* ch=-1: transext, coeff ring follows */
248 /* ch=-2: algext, coeff ring and minpoly follows */
249 /* ch=-3: cf name follows */
250 /* ch=-4: NULL*/
251 /* ch=-5: reference <int> */
252 /* ch=-6: new reference <int> <ring> */
253 if (r!=NULL)
254 {
255 for(int i=0;i<SI_RING_CACHE;i++)
256 {
257 if (d->rings[i]==r)
258 {
259 fprintf(d->f_write,"-5 %d ",i);
260 return;
261 }
262 }
263 for(int i=0;i<SI_RING_CACHE;i++)
264 {
265 if (d->rings[i]==NULL)
266 {
267 d->rings[i]=rIncRefCnt(r);
268 fprintf(d->f_write,"-6 %d ",i);
269 break;
270 }
271 }
272 if (rField_is_Q(r) || rField_is_Zp(r))
273 fprintf(d->f_write,"%d %d ",n_GetChar(r->cf),r->N);
274 else if (rFieldType(r)==n_transExt)
275 fprintf(d->f_write,"-1 %d ",r->N);
276 else if (rFieldType(r)==n_algExt)
277 fprintf(d->f_write,"-2 %d ",r->N);
278 else /*dummy*/
279 {
280 fprintf(d->f_write,"-3 %d ",r->N);
281 ssiWriteString(d,nCoeffName(r->cf));
282 }
283
284 int i;
285 for(i=0;i<r->N;i++)
286 {
287 fprintf(d->f_write,"%d %s ",(int)strlen(r->names[i]),r->names[i]);
288 }
289 /* number of orderings:*/
290 i=0;
291 // remember dummy ring: everything 0:
292 if (r->order!=NULL) while (r->order[i]!=0) i++;
293 fprintf(d->f_write,"%d ",i);
294 /* each ordering block: */
295 i=0;
296 if (r->order!=NULL) while(r->order[i]!=0)
297 {
298 fprintf(d->f_write,"%d %d %d ",r->order[i],r->block0[i], r->block1[i]);
299 switch(r->order[i])
300 {
301 case ringorder_a:
302 case ringorder_wp:
303 case ringorder_Wp:
304 case ringorder_ws:
305 case ringorder_Ws:
306 case ringorder_aa:
307 {
308 int s=r->block1[i]-r->block0[i]+1; // #vars
309 for(int ii=0;ii<s;ii++)
310 fprintf(d->f_write,"%d ",r->wvhdl[i][ii]);
311 }
312 break;
313 case ringorder_M:
314 {
315 int s=r->block1[i]-r->block0[i]+1; // #vars
316 for(int ii=0;ii<s*s;ii++)
317 {
318 fprintf(d->f_write,"%d ",r->wvhdl[i][ii]);
319 }
320 }
321 break;
322
323 case ringorder_a64:
324 case ringorder_L:
325 case ringorder_IS:
326 Werror("ring oder not implemented for ssi:%d",r->order[i]);
327 break;
328
329 default: break;
330 }
331 i++;
332 }
333 if ((rFieldType(r)==n_transExt)
334 || (rFieldType(r)==n_algExt))
335 {
336 ssiWriteRing_R(d,r->cf->extRing); /* includes alg.ext if rFieldType(r)==n_algExt */
337 }
338 /* Q-ideal :*/
339 if (r->qideal!=NULL)
340 {
341 ssiWriteIdeal_R(d,IDEAL_CMD,r->qideal,r);
342 }
343 else
344 {
345 fputs("0 ",d->f_write/*ideal with 0 entries */);
346 }
347 }
348 else /* dummy ring r==NULL*/
349 {
350 fputs("0 0 0 0 "/*,r->ch,r->N, blocks, q-ideal*/,d->f_write);
351 }
352 if (rIsLPRing(r)) // cannot be combined with 23 2
353 {
354 fprintf(d->f_write,"23 1 %d %d ",SI_LOG2(r->bitmask),r->isLPring);
355 }
356 else
357 {
358 unsigned long bm=0;
359 int b=0;
360 bm=rGetExpSize(bm,b,r->N);
361 if (r->bitmask!=bm)
362 {
363 fprintf(d->f_write,"23 0 %d ",SI_LOG2(r->bitmask));
364 }
365 if (rIsPluralRing(r))
366 {
367 fputs("23 2 ",d->f_write);
368 ssiWriteIdeal(d,MATRIX_CMD,(ideal)r->GetNC()->C);
369 ssiWriteIdeal(d,MATRIX_CMD,(ideal)r->GetNC()->D);
370 }
371 }
372}
373
374static void ssiWriteIdeal_R_S(int typ,const ideal I, const ring R);
375static void ssiWriteRing_R_S(ring r)
376{
377 /* 5 <ch> <N> <l1> <v1> ...<lN> <vN> <number of orderings> <ord1> <block0_1> <block1_1> .... <extRing> <Q-ideal> */
378 /* ch=-1: transext, coeff ring follows */
379 /* ch=-2: algext, coeff ring and minpoly follows */
380 /* ch=-3: cf name follows */
381 /* ch=-4: NULL*/
382 /* ch=-5: reference <int> */
383 /* ch=-6: new reference <int> <ring> */
384 if (r!=NULL)
385 {
386 if (rField_is_Q(r) || rField_is_Zp(r))
387 StringAppend("%d %d ",n_GetChar(r->cf),r->N);
388 else if (rFieldType(r)==n_transExt)
389 StringAppend("-1 %d ",r->N);
390 else if (rFieldType(r)==n_algExt)
391 StringAppend("-2 %d ",r->N);
392 else /*dummy*/
393 {
394 StringAppend("-3 %d ",r->N);
396 }
397
398 int i;
399 for(i=0;i<r->N;i++)
400 {
401 StringAppend("%d %s ",(int)strlen(r->names[i]),r->names[i]);
402 }
403 /* number of orderings:*/
404 i=0;
405 // remember dummy ring: everything 0:
406 if (r->order!=NULL) while (r->order[i]!=0) i++;
407 StringAppend("%d ",i);
408 /* each ordering block: */
409 i=0;
410 if (r->order!=NULL) while(r->order[i]!=0)
411 {
412 StringAppend("%d %d %d ",r->order[i],r->block0[i], r->block1[i]);
413 switch(r->order[i])
414 {
415 case ringorder_a:
416 case ringorder_wp:
417 case ringorder_Wp:
418 case ringorder_ws:
419 case ringorder_Ws:
420 case ringorder_aa:
421 {
422 int s=r->block1[i]-r->block0[i]+1; // #vars
423 for(int ii=0;ii<s;ii++)
424 StringAppend("%d ",r->wvhdl[i][ii]);
425 }
426 break;
427 case ringorder_M:
428 {
429 int s=r->block1[i]-r->block0[i]+1; // #vars
430 for(int ii=0;ii<s*s;ii++)
431 {
432 StringAppend("%d ",r->wvhdl[i][ii]);
433 }
434 }
435 break;
436
437 case ringorder_a64:
438 case ringorder_L:
439 case ringorder_IS:
440 Werror("ring oder not implemented for ssi:%d",r->order[i]);
441 break;
442
443 default: break;
444 }
445 i++;
446 }
447 if ((rFieldType(r)==n_transExt)
448 || (rFieldType(r)==n_algExt))
449 {
450 ssiWriteRing_R_S(r->cf->extRing); /* includes alg.ext if rFieldType(r)==n_algExt */
451 }
452 /* Q-ideal :*/
453 if (r->qideal!=NULL)
454 {
455 ssiWriteIdeal_R_S(IDEAL_CMD,r->qideal,r);
456 }
457 else
458 {
459 StringAppendS("0 "/*ideal with 0 entries */);
460 }
461 }
462 else /* dummy ring r==NULL*/
463 {
464 StringAppendS("0 0 0 0 "/*,r->ch,r->N, blocks, q-ideal*/);
465 }
466 if (rIsLPRing(r)) // cannot be combined with 23 2
467 {
468 StringAppend("23 1 %d %d ",SI_LOG2(r->bitmask),r->isLPring);
469 }
470 else
471 {
472 unsigned long bm=0;
473 int b=0;
474 bm=rGetExpSize(bm,b,r->N);
475 if (r->bitmask!=bm)
476 {
477 StringAppend("23 0 %d ",SI_LOG2(r->bitmask));
478 }
479 if (rIsPluralRing(r))
480 {
481 StringAppendS("23 2 ");
482 ssiWriteIdeal_R_S(MATRIX_CMD,(ideal)r->GetNC()->C,r);
483 ssiWriteIdeal_R_S(MATRIX_CMD,(ideal)r->GetNC()->D,r);
484 }
485 }
486}
487
488static void ssiWriteRing(ssiInfo *d,const ring r)
489{
490 /* 5 <ch> <N> <l1> <v1> ...<lN> <vN> <number of orderings> <ord1> <block0_1> <block1_1> .... <extRing> <Q-ideal> */
491 /* ch=-1: transext, coeff ring follows */
492 /* ch=-2: algext, coeff ring and minpoly follows */
493 /* ch=-3: cf name follows */
494 /* ch=-4: NULL */
495 /* ch=-5: reference <int> */
496 /* ch=-6: new reference <int> <ring> */
497 if ((r==NULL)||(r->cf==NULL))
498 {
499 fputs("-4 ",d->f_write);
500 return;
501 }
502 if (r==currRing) // see recursive calls for transExt/algExt
503 {
504 if (d->r!=NULL) rKill(d->r);
505 d->r=r;
506 }
507 if (r!=NULL)
508 {
509 /*d->*/rIncRefCnt(r);
510 }
511 ssiWriteRing_R(d,r);
512}
513
514char* ssiWriteRing_S(const ring r)
515{
516 StringSetS("");
518 return StringEndS();
519}
520static void ssiWritePoly_R(const ssiInfo *d, poly p, const ring r)
521{
522 fprintf(d->f_write,"%d ",pLength(p));//number of terms
523
524 while(p!=NULL)
525 {
526 ssiWriteNumber_CF(d,pGetCoeff(p),r->cf);
527 //nWrite(fich,pGetCoeff(p));
528 fprintf(d->f_write,"%ld ",p_GetComp(p,r));//component
529
530 for(int j=1;j<=rVar(r);j++)
531 {
532 fprintf(d->f_write,"%ld ",p_GetExp(p,j,r ));//x^j
533 }
534 pIter(p);
535 }
536}
537static void ssiWritePoly_R_S(poly p, const ring r)
538{
539 StringAppend("%d ",pLength(p));//number of terms
540
541 while(p!=NULL)
542 {
544 //nWrite(fich,pGetCoeff(p));
545 StringAppend("%ld ",p_GetComp(p,r));//component
546
547 for(int j=1;j<=rVar(r);j++)
548 {
549 StringAppend("%ld ",p_GetExp(p,j,r ));//x^j
550 }
551 pIter(p);
552 }
553}
554
555static void ssiWritePoly(const ssiInfo *d, poly p)
556{
557 ssiWritePoly_R(d,p,d->r);
558}
559
560char* ssiWritePoly_S(poly p, const ring r)
561{
562 StringSetS("");
564 return StringEndS();
565}
566static void ssiWriteIdeal_R(const ssiInfo *d, int typ,const ideal I, const ring R)
567{
568 // syntax: 7 # of elements <poly 1> <poly2>.....(ideal,module,smatrix)
569 // syntax: 8 <rows> <cols> <poly 1> <poly2>.....(matrix)
570 // syntax
571 matrix M=(matrix)I;
572 int mn;
573 if (typ==MATRIX_CMD)
574 {
575 mn=MATROWS(M)*MATCOLS(M);
576 fprintf(d->f_write,"%d %d ", MATROWS(M),MATCOLS(M));
577 }
578 else
579 {
580 mn=IDELEMS(I);
581 fprintf(d->f_write,"%d ",IDELEMS(I));
582 }
583
584 for(int i=0;i<mn;i++)
585 {
586 ssiWritePoly_R(d,I->m[i],R);
587 }
588}
589static void ssiWriteIdeal_R_S(int typ,const ideal I, const ring R)
590{
591 // syntax: 7 # of elements <poly 1> <poly2>.....(ideal,module,smatrix)
592 // syntax: 8 <rows> <cols> <poly 1> <poly2>.....(matrix)
593 // syntax
594 matrix M=(matrix)I;
595 int mn;
596 if (typ==MATRIX_CMD)
597 {
598 mn=MATROWS(M)*MATCOLS(M);
599 StringAppend("%d %d ", MATROWS(M),MATCOLS(M));
600 }
601 else
602 {
603 mn=IDELEMS(I);
604 StringAppend("%d ",IDELEMS(I));
605 }
606
607 for(int i=0;i<mn;i++)
608 {
609 ssiWritePoly_R_S(I->m[i],R);
610 }
611}
612void ssiWriteIdeal(const ssiInfo *d, int typ,const ideal I)
613{
614 ssiWriteIdeal_R(d,typ,I,d->r);
615}
616char* ssiWriteIdeal_S(const ideal I, const ring R)
617{
618 StringSetS("");
620 return StringEndS();
621}
622char* ssiWriteMatrix_S(const matrix M, const ring R)
623{
624 StringSetS("");
626 return StringEndS();
627}
628char* ssiWriteModule_S(const ideal M, const ring R) /* also for smatrix*/
629{
630 StringSetS("");
632 return StringEndS();
633}
634
636{
637 ssiInfo *d=(ssiInfo*)l->data;
638 // syntax: <num ops> <operation> <op1> <op2> ....
639 fprintf(d->f_write,"%d %d ",D->argc,D->op);
640 if (D->argc >0) ssiWrite(l, &(D->arg1));
641 if (D->argc < 4)
642 {
643 if (D->argc >1) ssiWrite(l, &(D->arg2));
644 if (D->argc >2) ssiWrite(l, &(D->arg3));
645 }
646}
647
648static void ssiWriteProc(const ssiInfo *d,procinfov p)
649{
650 if (p->data.s.body==NULL)
652 if (p->data.s.body!=NULL)
653 ssiWriteString(d,p->data.s.body);
654 else
655 ssiWriteString(d,"");
656}
658{
659 if (p->data.s.body==NULL)
661 if (p->data.s.body!=NULL)
662 ssiWriteString_S(p->data.s.body);
663 else
665}
666
668{
669 ssiInfo *d=(ssiInfo*)l->data;
670 int Ll=dd->nr;
671 fprintf(d->f_write,"%d ",Ll+1);
672 int i;
673 for(i=0;i<=Ll;i++)
674 {
675 ssiWrite(l,&(dd->m[i]));
676 }
677}
678static void ssiWriteList_S(lists dd, const ring R)
679{
680 int Ll=dd->nr;
681 StringAppend("%d ",Ll+1);
682 int i;
683 for(i=0;i<=Ll;i++)
684 {
685 ssiWrite_S(&(dd->m[i]),R);
686 }
687}
688static void ssiWriteIntvec(const ssiInfo *d,intvec * v)
689{
690 fprintf(d->f_write,"%d ",v->length());
691 int i;
692 for(i=0;i<v->length();i++)
693 {
694 fprintf(d->f_write,"%d ",(*v)[i]);
695 }
696}
698{
699 StringAppend("%d ",v->length());
700 int i;
701 for(i=0;i<v->length();i++)
702 {
703 StringAppend("%d ",(*v)[i]);
704 }
705}
706static void ssiWriteIntmat(const ssiInfo *d,intvec * v)
707{
708 fprintf(d->f_write,"%d %d ",v->rows(),v->cols());
709 int i;
710 for(i=0;i<v->length();i++)
711 {
712 fprintf(d->f_write,"%d ",(*v)[i]);
713 }
714}
716{
717 StringAppend("%d %d ",v->rows(),v->cols());
718 int i;
719 for(i=0;i<v->length();i++)
720 {
721 StringAppend("%d ",(*v)[i]);
722 }
723}
724
725static void ssiWriteBigintmat(const ssiInfo *d,bigintmat * v)
726{
727 fprintf(d->f_write,"%d %d ",v->rows(),v->cols());
728 int i;
729 for(i=0;i<v->length();i++)
730 {
731 ssiWriteBigInt(d,(*v)[i]);
732 }
733}
735{
736 StringAppend("%d %d ",v->rows(),v->cols());
737 int i;
738 for(i=0;i<v->length();i++)
739 {
740 ssiWriteBigInt_S((*v)[i]);
741 }
742}
743
744static void ssiWriteBigintvec(const ssiInfo *d,bigintmat * v)
745{
746 fprintf(d->f_write,"%d ",v->cols());
747 int i;
748 for(i=0;i<v->length();i++)
749 {
750 ssiWriteBigInt(d,(*v)[i]);
751 }
752}
754{
755 StringAppend("%d ",v->cols());
756 int i;
757 for(i=0;i<v->length();i++)
758 {
759 ssiWriteBigInt_S((*v)[i]);
760 }
761}
762
763static char *ssiReadString(const ssiInfo *d)
764{
765 char *buf;
766 int l;
767 l=s_readint(d->f_read);
768 buf=(char*)omAlloc0(l+1);
769 int throwaway =s_getc(d->f_read); /* skip ' '*/
770 throwaway=s_readbytes(buf,l,d->f_read);
771 //if (throwaway!=l) printf("want %d, got %d bytes\n",l,throwaway);
772 buf[l]='\0';
773 return buf;
774}
775static char *ssiReadString_S(char** s)
776{
777 char *buf;
778 int l;
779 l=s_readint_S(s);
780 buf=(char*)omAlloc0(l+1);
781 (*s)++; /* skip ' '*/
782 for(int i=0;i<l;i++) { buf[i]=(**s); (*s)++; }
783 buf[l]='\0';
784 return buf;
785}
786
787int ssiReadInt(const ssiInfo *d)
788{
789 return s_readint(d->f_read);
790}
791int ssiReadInt_S(char **s)
792{
793 return s_readint_S(s);
794}
795
796static number ssiReadNumber_CF(const ssiInfo *d, const coeffs cf)
797{
798 if (cf->cfReadFd!=ndReadFd)
799 {
800 return n_ReadFd(d,cf);
801 }
802 else if (getCoeffType(cf) == n_transExt)
803 {
804 // poly poly
805 fraction f=(fraction)n_Init(1,cf);
806 p_Delete(&NUM(f),cf->extRing);
807 NUM(f)=ssiReadPoly_R(d,cf->extRing);
808 DEN(f)=ssiReadPoly_R(d,cf->extRing);
809 return (number)f;
810 }
811 else if (getCoeffType(cf) == n_algExt)
812 {
813 // poly
814 return (number)ssiReadPoly_R(d,cf->extRing);
815 }
816 else WerrorS("coeffs not implemented in ssiReadNumber");
817 return NULL;
818}
819
820static number ssiReadNumber_CF_S(char **s, const coeffs cf)
821{
822 if (cf->cfReadFd_S!=ndReadFd_S)
823 {
824 return n_ReadFd_S(s,cf);
825 }
826 else if (getCoeffType(cf) == n_transExt)
827 {
828 // poly poly
829 fraction f=(fraction)n_Init(1,cf);
830 p_Delete(&NUM(f),cf->extRing);
831 NUM(f)=ssiReadPoly_R_S(s,cf->extRing);
832 DEN(f)=ssiReadPoly_R_S(s,cf->extRing);
833 return (number)f;
834 }
835 else if (getCoeffType(cf) == n_algExt)
836 {
837 // poly
838 return (number)ssiReadPoly_R_S(s,cf->extRing);
839 }
840 else WerrorS("coeffs not implemented in ssiReadNumber");
841 return NULL;
842}
843
844static number ssiReadBigInt(const ssiInfo *d)
845{
847 if ((SR_HDL(n) & SR_INT)==0)
848 {
849 if (n->s!=3) Werror("invalid sub type in bigint:%d",n->s);
850 }
851 return n;
852}
853static number ssiReadBigInt_S(char**s)
854{
856 if ((SR_HDL(n) & SR_INT)==0)
857 {
858 if (n->s!=3) Werror("invalid sub type in bigint:%d",n->s);
859 }
860 return n;
861}
862
863static number ssiReadNumber(ssiInfo *d)
864{
865 return ssiReadNumber_CF(d,d->r->cf);
866}
867
868static ring ssiReadRing(ssiInfo *d)
869{
870/* syntax is <ch> <N> <l1> <v1> ...<lN> <vN> <number of orderings> <ord1> <block0_1> <block1_1> .... <Q-ideal> */
871 int ch;
872 int new_ref=-1;
873 ch=s_readint(d->f_read);
874 if (ch==-6)
875 {
876 new_ref=s_readint(d->f_read);
877 ch=s_readint(d->f_read);
878 }
879 if (ch==-5)
880 {
881 int index=s_readint(d->f_read);
882 ring r=d->rings[index];
883 rIncRefCnt(r);
884 return r;
885 }
886 if (ch==-4)
887 return NULL;
888 int N=s_readint(d->f_read);
889 char **names;
890 coeffs cf=NULL;
891 if (ch==-3)
892 {
893 char *cf_name=ssiReadString(d);
894 cf=nFindCoeffByName(cf_name);
895 if (cf==NULL)
896 {
897 Werror("cannot find cf:%s",cf_name);
898 omFreeBinAddr(cf_name);
899 return NULL;
900 }
901 }
902 if (N!=0)
903 {
904 names=(char**)omAlloc(N*sizeof(char*));
905 for(int i=0;i<N;i++)
906 {
907 names[i]=ssiReadString(d);
908 }
909 }
910 // read the orderings:
911 int num_ord; // number of orderings
912 num_ord=s_readint(d->f_read);
913 rRingOrder_t *ord=(rRingOrder_t *)omAlloc0((num_ord+1)*sizeof(rRingOrder_t));
914 int *block0=(int *)omAlloc0((num_ord+1)*sizeof(int));
915 int *block1=(int *)omAlloc0((num_ord+1)*sizeof(int));
916 int **wvhdl=(int**)omAlloc0((num_ord+1)*sizeof(int*));
917 for(int i=0;i<num_ord;i++)
918 {
919 ord[i]=(rRingOrder_t)s_readint(d->f_read);
920 block0[i]=s_readint(d->f_read);
921 block1[i]=s_readint(d->f_read);
922 switch(ord[i])
923 {
924 case ringorder_a:
925 case ringorder_wp:
926 case ringorder_Wp:
927 case ringorder_ws:
928 case ringorder_Ws:
929 case ringorder_aa:
930 {
931 int s=block1[i]-block0[i]+1; // #vars
932 wvhdl[i]=(int*)omAlloc(s*sizeof(int));
933 for(int ii=0;ii<s;ii++)
934 wvhdl[i][ii]=s_readint(d->f_read);
935 }
936 break;
937 case ringorder_M:
938 {
939 int s=block1[i]-block0[i]+1; // #vars
940 wvhdl[i]=(int*)omAlloc(s*s*sizeof(int));
941 for(int ii=0;ii<s*s;ii++)
942 {
943 wvhdl[i][ii]=s_readint(d->f_read);
944 }
945 }
946 break;
947 case ringorder_a64:
948 case ringorder_L:
949 case ringorder_IS:
950 Werror("ring order not implemented for ssi:%d",ord[i]);
951 break;
952
953 default: break;
954 }
955 }
956 if (N==0)
957 {
958 omFree(ord);
959 omFree(block0);
960 omFree(block1);
961 omFree(wvhdl);
962 return NULL;
963 }
964 else
965 {
966 ring r=NULL;
967 if (ch>=0) /* Q, Z/p */
968 r=rDefault(ch,N,names,num_ord,ord,block0,block1,wvhdl);
969 else if (ch==-1) /* trans ext. */
970 {
972 T.r=ssiReadRing(d);
973 if (T.r==NULL) return NULL;
975 r=rDefault(cf,N,names,num_ord,ord,block0,block1,wvhdl);
976 }
977 else if (ch==-2) /* alg ext. */
978 {
980 T.r=ssiReadRing(d); /* includes qideal */
981 if (T.r==NULL) return NULL;
983 r=rDefault(cf,N,names,num_ord,ord,block0,block1,wvhdl);
984 }
985 else if (ch==-3)
986 {
987 r=rDefault(cf,N,names,num_ord,ord,block0,block1,wvhdl);
988 }
989 else
990 {
991 Werror("ssi: read unknown coeffs type (%d)",ch);
992 for(int i=0;i<N;i++)
993 {
994 omFree(names[i]);
995 }
996 omFreeSize(names,N*sizeof(char*));
997 return NULL;
998 }
999 ideal q=ssiReadIdeal_R(d,r);
1000 if (IDELEMS(q)==0) omFreeBin(q,sip_sideal_bin);
1001 else r->qideal=q;
1002 for(int i=0;i<N;i++)
1003 {
1004 omFree(names[i]);
1005 }
1006 omFreeSize(names,N*sizeof(char*));
1007 rIncRefCnt(r);
1008 // check if such ring already exist as ssiRing*
1009 char name[20];
1010 int nr=0;
1011 idhdl h=NULL;
1012 loop
1013 {
1014 snprintf(name,20,"ssiRing%d",nr); nr++;
1015 h=IDROOT->get(name, 0);
1016 if (h==NULL)
1017 {
1018 break;
1019 }
1020 else if ((IDTYP(h)==RING_CMD)
1021 && (r!=IDRING(h))
1022 && (rEqual(r,IDRING(h),1)))
1023 {
1024 rDelete(r);
1025 r=rIncRefCnt(IDRING(h));
1026 break;
1027 }
1028 }
1029 if (new_ref!=-1)
1030 {
1031 d->rings[new_ref]=r;
1032 rIncRefCnt(r);
1033 }
1034 return r;
1035 }
1036}
1037static ideal ssiReadIdeal_R_S(char** s,const ring r);
1038static ring ssiReadRing_R_S(char **s)
1039{
1040/* syntax is <ch> <N> <l1> <v1> ...<lN> <vN> <number of orderings> <ord1> <block0_1> <block1_1> .... <Q-ideal> */
1041 int ch;
1042 int new_ref=-1;
1043 ch=s_readint_S(s);
1044 if (ch==-4)
1045 return NULL;
1046 int N=s_readint_S(s);
1047 char **names;
1048 coeffs cf=NULL;
1049 if (ch==-3)
1050 {
1051 char *cf_name=ssiReadString_S(s);
1052 cf=nFindCoeffByName(cf_name);
1053 if (cf==NULL)
1054 {
1055 Werror("cannot find cf:%s",cf_name);
1056 omFreeBinAddr(cf_name);
1057 return NULL;
1058 }
1059 }
1060 if (N!=0)
1061 {
1062 names=(char**)omAlloc(N*sizeof(char*));
1063 for(int i=0;i<N;i++)
1064 {
1065 names[i]=ssiReadString_S(s);
1066 }
1067 }
1068 // read the orderings:
1069 int num_ord; // number of orderings
1070 num_ord=s_readint_S(s);
1071 rRingOrder_t *ord=(rRingOrder_t *)omAlloc0((num_ord+1)*sizeof(rRingOrder_t));
1072 int *block0=(int *)omAlloc0((num_ord+1)*sizeof(int));
1073 int *block1=(int *)omAlloc0((num_ord+1)*sizeof(int));
1074 int **wvhdl=(int**)omAlloc0((num_ord+1)*sizeof(int*));
1075 for(int i=0;i<num_ord;i++)
1076 {
1077 ord[i]=(rRingOrder_t)s_readint_S(s);
1078 block0[i]=s_readint_S(s);
1079 block1[i]=s_readint_S(s);
1080 switch(ord[i])
1081 {
1082 case ringorder_a:
1083 case ringorder_wp:
1084 case ringorder_Wp:
1085 case ringorder_ws:
1086 case ringorder_Ws:
1087 case ringorder_aa:
1088 {
1089 int ss=block1[i]-block0[i]+1; // #vars
1090 wvhdl[i]=(int*)omAlloc(ss*sizeof(int));
1091 for(int ii=0;ii<ss;ii++)
1092 wvhdl[i][ii]=s_readint_S(s);
1093 }
1094 break;
1095 case ringorder_M:
1096 {
1097 int ss=block1[i]-block0[i]+1; // #vars
1098 wvhdl[i]=(int*)omAlloc(ss*ss*sizeof(int));
1099 for(int ii=0;ii<ss*ss;ii++)
1100 {
1101 wvhdl[i][ii]=s_readint_S(s);
1102 }
1103 }
1104 break;
1105 case ringorder_a64:
1106 case ringorder_L:
1107 case ringorder_IS:
1108 Werror("ring order not implemented for ssi:%d",ord[i]);
1109 break;
1110
1111 default: break;
1112 }
1113 }
1114 if (N==0)
1115 {
1116 omFree(ord);
1117 omFree(block0);
1118 omFree(block1);
1119 omFree(wvhdl);
1120 return NULL;
1121 }
1122 else
1123 {
1124 ring r=NULL;
1125 if (ch>=0) /* Q, Z/p */
1126 r=rDefault(ch,N,names,num_ord,ord,block0,block1,wvhdl);
1127 else if (ch==-1) /* trans ext. */
1128 {
1130 T.r=ssiReadRing_R_S(s);
1131 if (T.r==NULL) return NULL;
1133 r=rDefault(cf,N,names,num_ord,ord,block0,block1,wvhdl);
1134 }
1135 else if (ch==-2) /* alg ext. */
1136 {
1138 T.r=ssiReadRing_R_S(s); /* includes qideal */
1139 if (T.r==NULL) return NULL;
1141 r=rDefault(cf,N,names,num_ord,ord,block0,block1,wvhdl);
1142 }
1143 else if (ch==-3)
1144 {
1145 r=rDefault(cf,N,names,num_ord,ord,block0,block1,wvhdl);
1146 }
1147 else
1148 {
1149 Werror("ssi: read unknown coeffs type (%d)",ch);
1150 for(int i=0;i<N;i++)
1151 {
1152 omFree(names[i]);
1153 }
1154 omFreeSize(names,N*sizeof(char*));
1155 return NULL;
1156 }
1157 ideal q=ssiReadIdeal_R_S(s,r);
1158 if (IDELEMS(q)==0) omFreeBin(q,sip_sideal_bin);
1159 else r->qideal=q;
1160 for(int i=0;i<N;i++)
1161 {
1162 omFree(names[i]);
1163 }
1164 omFreeSize(names,N*sizeof(char*));
1165 return r;
1166 }
1167}
1168ring ssiReadRing_S(char *s)
1169{
1170 ring r=ssiReadRing_R_S(&s);
1171 // check if such ring already exist as ssiRing*
1172 char name[20];
1173 int nr=0;
1174 idhdl h=NULL;
1175 loop // already defined?
1176 {
1177 snprintf(name,20,"ssiRing%d",nr); nr++;
1178 h=IDROOT->get(name, 0);
1179 if (h==NULL)
1180 {
1181 break;
1182 }
1183 else if ((IDTYP(h)==RING_CMD)
1184 && (r!=IDRING(h))
1185 && (rEqual(r,IDRING(h),1)))
1186 {
1187 rDelete(r);
1188 r=rIncRefCnt(IDRING(h));
1189 break;
1190 }
1191 }
1192 if ((h==NULL) && ((currRing==NULL) || (!rEqual(r,currRing,1))))
1193 {
1194 char name[20];
1195 int nr=0;
1196 idhdl hh=NULL;
1197 loop
1198 {
1199 snprintf(name,20,"ssiRing%d",nr); nr++;
1200 hh=IDROOT->get(name, 0);
1201 if (hh==NULL)
1202 {
1204 break;
1205 }
1206 else if ((IDTYP(hh)==RING_CMD)
1207 && (rEqual(r,IDRING(hh),1)))
1208 {
1209 break;
1210 }
1211 }
1212 rSetHdl(hh);
1213 }
1214 else
1215 rSetHdl(h);
1216 return r;
1217}
1218
1219static poly ssiReadPoly_R(const ssiInfo *d, const ring r)
1220{
1221// < # of terms> < term1> < .....
1222 int n,i,l;
1223 n=ssiReadInt(d); // # of terms
1224 //Print("poly: terms:%d\n",n);
1225 poly p;
1226 poly ret=NULL;
1227 poly prev=NULL;
1228 for(l=0;l<n;l++) // read n terms
1229 {
1230// coef,comp.exp1,..exp N
1231 p=p_Init(r,r->PolyBin);
1232 pSetCoeff0(p,ssiReadNumber_CF(d,r->cf));
1233 int D;
1234 D=s_readint(d->f_read);
1235 p_SetComp(p,D,r);
1236 for(i=1;i<=rVar(r);i++)
1237 {
1238 D=s_readint(d->f_read);
1239 p_SetExp(p,i,D,r);
1240 }
1241 p_Setm(p,r);
1242 p_Test(p,r);
1243 if (ret==NULL) ret=p;
1244 else pNext(prev)=p;
1245 prev=p;
1246 }
1247 return ret;
1248}
1249
1250static poly ssiReadPoly_R_S(char **s, const ring r)
1251{
1252// < # of terms> < term1> < .....
1253 int n,i,l;
1254 char* c=*s;
1255 n=s_readint_S(&c); // # of terms
1256 poly p;
1257 poly ret=NULL;
1258 poly prev=NULL;
1259 for(l=0;l<n;l++) // read n terms
1260 {
1261// coef,comp.exp1,..exp N
1262 p=p_Init(r,r->PolyBin);
1263 number cf=ssiReadNumber_CF_S(&c,r->cf);
1264 pSetCoeff0(p,cf);
1265 int D;
1266 D=s_readint_S(&c);
1267 p_SetComp(p,D,r);
1268 for(i=1;i<=rVar(r);i++)
1269 {
1270 D=s_readint_S(&c);
1271 p_SetExp(p,i,D,r);
1272 }
1273 p_Setm(p,r);
1274 p_Test(p,r);
1275 if (ret==NULL) ret=p;
1276 else pNext(prev)=p;
1277 prev=p;
1278 }
1279 *s=c;
1280 return ret;
1281}
1282
1283static poly ssiReadPoly(ssiInfo *d)
1284{
1285 return ssiReadPoly_R(d,d->r);
1286}
1287
1288poly ssiReadPoly_S(char *s, const ring r)
1289{
1290 return ssiReadPoly_R_S(&s,r);
1291}
1292static ideal ssiReadIdeal_R(const ssiInfo *d,const ring r)
1293{
1294// < # of terms> < term1> < .....
1295 int n,i;
1296 ideal I;
1297 n=s_readint(d->f_read);
1298 I=idInit(n,1); // will be fixed later for module/smatrix
1299 for(i=0;i<IDELEMS(I);i++) // read n terms
1300 {
1301 I->m [i]=ssiReadPoly_R(d,r);
1302 }
1303 return I;
1304}
1305static ideal ssiReadIdeal_R_S(char** s,const ring r)
1306{
1307// < # of terms> < term1> < .....
1308 int n,i;
1309 ideal I;
1310 n=s_readint_S(s);
1311 I=idInit(n,1); // will be fixed later for module/smatrix
1312 for(i=0;i<IDELEMS(I);i++) // read n terms
1313 {
1314 I->m [i]=ssiReadPoly_R_S(s,r);
1315 }
1316 return I;
1317}
1318
1320{
1321 return ssiReadIdeal_R(d,d->r);
1322}
1323
1324ideal ssiReadIdeal_S(char *s, const ring R)
1325{
1326 return ssiReadIdeal_R_S(&s,R);
1327}
1328
1330{
1331 int n,m;
1332 m=s_readint(d->f_read);
1333 n=s_readint(d->f_read);
1334 matrix M=mpNew(m,n);
1335 poly p;
1336 for(int i=1;i<=MATROWS(M);i++)
1337 for(int j=1;j<=MATCOLS(M);j++)
1338 {
1339 p=ssiReadPoly(d);
1340 MATELEM(M,i,j)=p;
1341 }
1342 return M;
1343}
1344static matrix ssiReadMatrix_R_S(char** s, const ring R)
1345{
1346 int n,m;
1347 m=s_readint_S(s);
1348 n=s_readint_S(s);
1349 matrix M=mpNew(m,n);
1350 poly p;
1351 for(int i=1;i<=MATROWS(M);i++)
1352 for(int j=1;j<=MATCOLS(M);j++)
1353 {
1355 MATELEM(M,i,j)=p;
1356 }
1357 return M;
1358}
1359matrix ssiReadMatrix_R_S(char* s, const ring R)
1360{
1361 return ssiReadMatrix_R_S(&s,R);
1362}
1363
1365{
1366 ssiInfo *d=(ssiInfo*)l->data;
1367 // syntax: <num ops> <operation> <op1> <op2> ....
1368 command D=(command)omAlloc0(sizeof(*D));
1369 int argc,op;
1370 argc=s_readint(d->f_read);
1371 op=s_readint(d->f_read);
1372 D->argc=argc; D->op=op;
1373 leftv v;
1374 if (argc >0)
1375 {
1376 v=ssiRead1(l);
1377 memcpy(&(D->arg1),v,sizeof(*v));
1379 }
1380 if (argc <4)
1381 {
1382 if (D->argc >1)
1383 {
1384 v=ssiRead1(l);
1385 memcpy(&(D->arg2),v,sizeof(*v));
1387 }
1388 if (D->argc >2)
1389 {
1390 v=ssiRead1(l);
1391 memcpy(&(D->arg3),v,sizeof(*v));
1393 }
1394 }
1395 else
1396 {
1397 leftv prev=&(D->arg1);
1398 argc--;
1399 while(argc >0)
1400 {
1401 v=ssiRead1(l);
1402 prev->next=v;
1403 prev=v;
1404 argc--;
1405 }
1406 }
1407 return D;
1408}
1409
1411{
1412 char *s=ssiReadString(d);
1414 p->language=LANG_SINGULAR;
1415 p->libname=omStrDup("");
1416 p->procname=omStrDup("");
1417 p->data.s.body=s;
1418 return p;
1419}
1421{
1422 char *st=ssiReadString_S(s);
1424 p->language=LANG_SINGULAR;
1425 p->libname=omStrDup("");
1426 p->procname=omStrDup("");
1427 p->data.s.body=st;
1428 return p;
1429}
1431{
1432 ssiInfo *d=(ssiInfo*)l->data;
1433 int nr;
1434 nr=s_readint(d->f_read);
1436 L->Init(nr);
1437
1438 int i;
1439 leftv v;
1440 for(i=0;i<=L->nr;i++)
1441 {
1442 v=ssiRead1(l);
1443 memcpy(&(L->m[i]),v,sizeof(*v));
1445 }
1446 return L;
1447}
1448static lists ssiReadList_S(char**s, const ring R)
1449{
1450 int nr;
1451 nr=s_readint_S(s);
1453 L->Init(nr);
1454
1455 int i;
1456 leftv v;
1457 for(i=0;i<=L->nr;i++)
1458 {
1459 v=ssiRead1_S(s,R);
1460 memcpy(&(L->m[i]),v,sizeof(*v));
1462 }
1463 return L;
1464}
1466{
1467 int nr;
1468 nr=s_readint(d->f_read);
1469 intvec *v=new intvec(nr);
1470 for(int i=0;i<nr;i++)
1471 {
1472 (*v)[i]=s_readint(d->f_read);
1473 }
1474 return v;
1475}
1477{
1478 int nr;
1479 nr=s_readint_S(s);
1480 intvec *v=new intvec(nr);
1481 for(int i=0;i<nr;i++)
1482 {
1483 (*v)[i]=s_readint_S(s);
1484 }
1485 return v;
1486}
1488{
1489 int r,c;
1490 r=s_readint(d->f_read);
1491 c=s_readint(d->f_read);
1492 intvec *v=new intvec(r,c,0);
1493 for(int i=0;i<r*c;i++)
1494 {
1495 (*v)[i]=s_readint(d->f_read);
1496 }
1497 return v;
1498}
1500{
1501 int r,c;
1502 r=s_readint_S(s);
1503 c=s_readint_S(s);
1504 intvec *v=new intvec(r,c,0);
1505 for(int i=0;i<r*c;i++)
1506 {
1507 (*v)[i]=s_readint_S(s);
1508 }
1509 return v;
1510}
1512{
1513 int r,c;
1514 r=s_readint(d->f_read);
1515 c=s_readint(d->f_read);
1517 for(int i=0;i<r*c;i++)
1518 {
1519 (*v)[i]=ssiReadBigInt(d);
1520 }
1521 return v;
1522}
1524{
1525 int r,c;
1526 r=s_readint_S(s);
1527 c=s_readint_S(s);
1529 for(int i=0;i<r*c;i++)
1530 {
1531 (*v)[i]=ssiReadBigInt_S(s);
1532 }
1533 return v;
1534}
1536{
1537 int c;
1538 c=s_readint(d->f_read);
1540 for(int i=0;i<c;i++)
1541 {
1542 (*v)[i]=ssiReadBigInt(d);
1543 }
1544 return v;
1545}
1547{
1548 int c;
1549 c=s_readint_S(s);
1551 for(int i=0;i<c;i++)
1552 {
1553 (*v)[i]=ssiReadBigInt_S(s);
1554 }
1555 return v;
1556}
1557
1559{
1560 leftv lv=ssiRead1(l);
1561 char *name=(char*)lv->data;
1563 int tok;
1564 blackboxIsCmd(name,tok);
1565 if (tok>MAX_TOK)
1566 {
1567 ring save_ring=currRing;
1568 idhdl save_hdl=currRingHdl;
1569 blackbox *b=getBlackboxStuff(tok);
1570 res->rtyp=tok;
1571 b->blackbox_deserialize(&b,&(res->data),l);
1572 if (save_ring!=currRing)
1573 {
1574 rChangeCurrRing(save_ring);
1575 if (save_hdl!=NULL) rSetHdl(save_hdl);
1576 else currRingHdl=NULL;
1577 }
1578 }
1579 else
1580 {
1581 Werror("blackbox %s not found",name);
1582 }
1583 omFree(name);
1584}
1585
1587{
1588 ssiInfo *d=(ssiInfo*)l->data;
1589 BITSET fl=(BITSET)s_readint(d->f_read);
1590 int nr_of_attr=s_readint(d->f_read);
1591 if (nr_of_attr>0)
1592 {
1593 for(int i=1;i<nr_of_attr;i++)
1594 {
1595 }
1596 }
1597 leftv tmp=ssiRead1(l);
1598 memcpy(res,tmp,sizeof(sleftv));
1599 memset(tmp,0,sizeof(sleftv));
1600 omFreeBin(tmp,sleftv_bin);
1601 if (nr_of_attr>0)
1602 {
1603 }
1604 res->flag=fl;
1605}
1607{
1608 ssiInfo *d=(ssiInfo*)l->data;
1609 int what=s_readint(d->f_read);
1610 switch(what)
1611 {
1612 case 0: // bitmask
1613 {
1614 int lb=s_readint(d->f_read);
1615 unsigned long bm=~0L;
1616 bm=bm<<lb;
1617 bm=~bm;
1618 rUnComplete(d->r);
1619 d->r->bitmask=bm;
1620 rComplete(d->r);
1621 break;
1622 }
1623 case 1: // LPRing
1624 {
1625 int lb=s_readint(d->f_read);
1626 int isLPring=s_readint(d->f_read);
1627 unsigned long bm=~0L;
1628 bm=bm<<lb;
1629 bm=~bm;
1630 rUnComplete(d->r);
1631 d->r->bitmask=bm;
1632 d->r->isLPring=isLPring;
1633 rComplete(d->r);
1634 break;
1635 }
1636 case 2: // Plural rings
1637 {
1638 matrix C=ssiReadMatrix(d);
1640 nc_CallPlural(C,D,NULL,NULL,d->r,true,true,false,d->r,false);
1641 break;
1642 }
1643 }
1644}
1645//**************************************************************************/
1646
1648{
1649 if (l!=NULL)
1650 {
1651 const char *mode;
1652 if (flag & SI_LINK_OPEN)
1653 {
1654 if (strcmp(l->mode, "r") == 0)
1655 flag = SI_LINK_READ;
1656 else if (strcmp(l->mode,"string")==0)
1657 {
1659 return FALSE;
1660 }
1661 else flag = SI_LINK_WRITE;
1662 }
1663 if (((flag == SI_LINK_READ)
1664 || (flag == SI_LINK_WRITE))
1665 && (strcmp(l->mode,"string")==0))
1666 {
1668 return FALSE;
1669 }
1670
1671 if (flag == SI_LINK_READ) mode = "r";
1672 else if (strcmp(l->mode, "w") == 0) mode = "w";
1673 else if (strcmp(l->mode, "fork") == 0) mode = "fork";
1674 else if (strcmp(l->mode, "tcp") == 0) mode = "tcp";
1675 else if (strcmp(l->mode, "connect") == 0) mode = "connect";
1676 else mode = "a";
1677
1678
1679 SI_LINK_SET_OPEN_P(l, flag);
1680 if(l->data!=NULL) omFreeSize(l->data,sizeof(ssiInfo));
1681 omFreeBinAddr(l->mode);
1682 l->mode = omStrDup(mode);
1683
1684 ssiInfo *d=(ssiInfo*)omAlloc0(sizeof(ssiInfo));
1685 l->data=d;
1686 if (l->name[0] == '\0')
1687 {
1688 if (strcmp(mode,"fork")==0)
1689 {
1690 int cpus = (long) feOptValue(FE_OPT_CPUS);
1691 if (cpus<1)
1692 {
1693 WerrorS("no sub-processes allowed");
1694 l->flags=0;
1695 l->data=NULL;
1696 omFreeSize(d,sizeof(ssiInfo));
1697 return TRUE;
1698 }
1699 int pc[2];
1700 int cp[2];
1701 int err1=pipe(pc);
1702 int err2=pipe(cp);
1703 if (err1 || err2)
1704 {
1705 Werror("pipe failed with %d\n",errno);
1706 l->flags=0;
1707 l->data=NULL;
1708 omFreeSize(d,sizeof(ssiInfo));
1709 return TRUE;
1710 }
1712 n->u=u;
1713 n->l=l;
1714 n->next=(void *)ssiToBeClosed;
1715 ssiToBeClosed=n;
1716
1717 pid_t pid = fork();
1718 if (pid == -1 && errno == EAGAIN) // RLIMIT_NPROC too low?
1719 {
1721 pid = fork();
1722 }
1723 if (pid == -1)
1724 {
1725 WerrorS("could not fork");
1726 l->flags=0;
1727 l->data=NULL;
1728 omFreeSize(d,sizeof(ssiInfo));
1729 return TRUE;
1730 }
1731 if (pid==0) /*fork: child*/
1732 {
1733 /* block SIGINT */
1734 sigset_t sigint;
1735 sigemptyset(&sigint);
1736 sigaddset(&sigint, SIGINT);
1737 sigprocmask(SIG_BLOCK, &sigint, NULL);
1738 si_set_signal(SIGTERM,sig_term_hdl);
1739 /* set #cpu to 1 for the child:*/
1740 feSetOptValue(FE_OPT_CPUS,1);
1741
1743 /* we know: l is the first entry in ssiToBeClosed-list */
1744 while(hh!=NULL)
1745 {
1747 ssiInfo *dd=(ssiInfo*)hh->l->data;
1748 s_close(dd->f_read);
1749 fclose(dd->f_write);
1750 if (dd->r!=NULL) rKill(dd->r);
1751 omFreeSize((ADDRESS)dd,(sizeof *dd));
1752 hh->l->data=NULL;
1753 link_list nn=(link_list)hh->next;
1754 omFree(hh);
1755 hh=nn;
1756 }
1757 ssiToBeClosed->next=NULL;
1758#ifdef HAVE_SIMPLEIPC
1759 memset(sem_acquired, 0, SIPC_MAX_SEMAPHORES*sizeof(sem_acquired[0]));
1760#endif // HAVE_SIMPLEIPC
1761 si_close(pc[1]); si_close(cp[0]);
1762 d->f_write=fdopen(cp[1],"w");
1763 d->f_read=s_open(pc[0]);
1764 d->fd_read=pc[0];
1765 d->fd_write=cp[1];
1766 //d->r=currRing;
1767 //if (d->r!=NULL) d->r->ref++;
1768 l->data=d;
1769 omFreeBinAddr(l->mode);
1770 l->mode = omStrDup(mode);
1773 //myynest=0;
1775 if ((u!=NULL)&&(u->rtyp==IDHDL))
1776 {
1777 idhdl h=(idhdl)u->data;
1778 h->lev=0;
1779 }
1780 loop
1781 {
1782 if (!SI_LINK_OPEN_P(l)) m2_end(-1);
1783 if(d->f_read->is_eof) m2_end(-1);
1784 leftv h=ssiRead1(l); /*contains an exit.... */
1785 if (feErrors != NULL && *feErrors != '\0')
1786 {
1787 // handle errors:
1788 PrintS(feErrors); /* currently quite simple */
1789 *feErrors = '\0';
1790 }
1791 ssiWrite(l,h);
1792 h->CleanUp();
1794 }
1795 /* never reached*/
1796 }
1797 else if (pid>0) /*fork: parent*/
1798 {
1799 d->pid=pid;
1800 si_close(pc[0]); si_close(cp[1]);
1801 d->f_write=fdopen(pc[1],"w");
1802 d->f_read=s_open(cp[0]);
1803 d->fd_read=cp[0];
1804 d->fd_write=pc[1];
1806 d->send_quit_at_exit=1;
1807 //d->r=currRing;
1808 //if (d->r!=NULL) d->r->ref++;
1809 }
1810 else
1811 {
1812 Werror("fork failed (%d)",errno);
1813 l->data=NULL;
1814 omFreeSize(d,sizeof(ssiInfo));
1815 return TRUE;
1816 }
1817 }
1818 // ---------------------------------------------------------------------
1819 else if (strcmp(mode,"tcp")==0)
1820 {
1821 int sockfd, newsockfd, portno, clilen;
1822 struct sockaddr_in serv_addr, cli_addr;
1823 sockfd = socket(AF_INET, SOCK_STREAM, 0);
1824 if(sockfd < 0)
1825 {
1826 WerrorS("ERROR opening socket");
1827 l->data=NULL;
1828 l->flags=0;
1829 omFreeSize(d,sizeof(ssiInfo));
1830 return TRUE;
1831 }
1832 memset((char *) &serv_addr,0, sizeof(serv_addr));
1833 portno = 1025;
1834 serv_addr.sin_family = AF_INET;
1835 serv_addr.sin_addr.s_addr = INADDR_ANY;
1836 do
1837 {
1838 portno++;
1839 serv_addr.sin_port = htons(portno);
1840 if(portno > 50000)
1841 {
1842 WerrorS("ERROR on binding (no free port available?)");
1843 l->data=NULL;
1844 l->flags=0;
1845 omFreeSize(d,sizeof(ssiInfo));
1846 return TRUE;
1847 }
1848 }
1849 while(bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0);
1850 Print("waiting on port %d\n", portno);mflush();
1851 listen(sockfd,1);
1852 newsockfd = si_accept(sockfd, (struct sockaddr *) &cli_addr, (socklen_t *)&clilen);
1853 if(newsockfd < 0)
1854 {
1855 WerrorS("ERROR on accept");
1856 l->data=NULL;
1857 l->flags=0;
1858 omFreeSize(d,sizeof(ssiInfo));
1859 return TRUE;
1860 }
1861 PrintS("client accepted\n");
1862 d->fd_read = newsockfd;
1863 d->fd_write = newsockfd;
1864 d->f_read = s_open(newsockfd);
1865 d->f_write = fdopen(newsockfd, "w");
1867 si_close(sockfd);
1868 }
1869 // no ssi-Link on stdin or stdout
1870 else if (strcmp(mode,"string")==0)
1871 {
1873 }
1874 else
1875 {
1876 Werror("invalid mode >>%s<< for ssi",mode);
1877 l->data=NULL;
1878 l->flags=0;
1879 omFreeSize(d,sizeof(ssiInfo));
1880 return TRUE;
1881 }
1882 }
1883 // =========================================================================
1884 else /*now l->name!=NULL*/
1885 {
1886 // tcp mode
1887 if(strcmp(mode,"tcp")==0)
1888 {
1889 int sockfd, newsockfd, portno, clilen;
1890 struct sockaddr_in serv_addr, cli_addr;
1891 sockfd = socket(AF_INET, SOCK_STREAM, 0);
1892 if(sockfd < 0)
1893 {
1894 WerrorS("ERROR opening socket");
1895 l->data=NULL;
1896 l->flags=0;
1897 omFreeSize(d,sizeof(ssiInfo));
1898 return TRUE;
1899 }
1900 memset((char *) &serv_addr,0, sizeof(serv_addr));
1901 portno = 1025;
1902 serv_addr.sin_family = AF_INET;
1903 serv_addr.sin_addr.s_addr = INADDR_ANY;
1904 do
1905 {
1906 portno++;
1907 serv_addr.sin_port = htons(portno);
1908 if(portno > 50000)
1909 {
1910 WerrorS("ERROR on binding (no free port available?)");
1911 l->data=NULL;
1912 l->flags=0;
1913 omFreeSize(d,sizeof(ssiInfo));
1914 return TRUE;
1915 }
1916 }
1917 while(bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0);
1918 //Print("waiting on port %d\n", portno);mflush();
1919 listen(sockfd,1);
1920 char* cli_host = (char*)omAlloc(256);
1921 char* path = (char*)omAlloc(1024);
1922 int r = si_sscanf(l->name,"%255[^:]:%s",cli_host,path);
1923 if(r == 0)
1924 {
1925 WerrorS("ERROR: no host specified");
1926 l->data=NULL;
1927 l->flags=0;
1928 omFreeSize(d,sizeof(ssiInfo));
1929 omFree(path);
1930 omFree(cli_host);
1931 return TRUE;
1932 }
1933 else if(r == 1)
1934 {
1935 WarnS("program not specified, using /usr/local/bin/Singular");
1936 Warn("in line >>%s<<",my_yylinebuf);
1937 strcpy(path,"/usr/local/bin/Singular");
1938 }
1939 char* ssh_command = (char*)omAlloc(256);
1940 char* ser_host = (char*)omAlloc(64);
1941 if(strcmp(cli_host,"localhost")==0)
1942 strcpy(ser_host,"localhost");
1943 else
1944 gethostname(ser_host,64);
1945 if (strcmp(cli_host,"localhost")==0) /*avoid "ssh localhost" as key may change*/
1946 snprintf(ssh_command,256,"%s -q --batch --link=ssi --MPhost=%s --MPport=%d &",path,ser_host,portno);
1947 else
1948 snprintf(ssh_command,256,"ssh %s %s -q --batch --link=ssi --MPhost=%s --MPport=%d &",cli_host,path,ser_host,portno);
1949 //Print("client on %s started:%s\n",cli_host,path);
1950 omFree(path);
1951 omFree(cli_host);
1952 if (TEST_OPT_PROT) { Print("running >>%s<<\n",ssh_command); }
1953 int re=system(ssh_command);
1954 if (re<0)
1955 {
1956 Werror("ERROR running `%s` (%d)",ssh_command,re);
1957 l->data=NULL;
1958 l->flags=0;
1959 omFreeSize(d,sizeof(ssiInfo));
1960 return TRUE;
1961 }
1962 omFree(ssh_command);
1963 omFree(ser_host);
1964 clilen = sizeof(cli_addr);
1965 newsockfd = si_accept(sockfd, (struct sockaddr *) &cli_addr, (socklen_t *)&clilen);
1966 if(newsockfd < 0)
1967 {
1968 WerrorS("ERROR on accept");
1969 l->data=NULL;
1970 l->flags=0;
1971 omFreeSize(d,sizeof(ssiInfo));
1972 return TRUE;
1973 }
1974 //PrintS("client accepted\n");
1975 d->fd_read = newsockfd;
1976 d->fd_write = newsockfd;
1977 d->f_read = s_open(newsockfd);
1978 d->f_write = fdopen(newsockfd, "w");
1979 si_close(sockfd);
1981 d->send_quit_at_exit=1;
1982 link_list newlink=(link_list)omAlloc(sizeof(link_struct));
1983 newlink->u=u;
1984 newlink->l=l;
1985 newlink->next=(void *)ssiToBeClosed;
1986 ssiToBeClosed=newlink;
1987 fprintf(d->f_write,"98 %d %d %u %u\n",SSI_VERSION,MAX_TOK,si_opt_1,si_opt_2);
1988 }
1989 // ----------------------------------------------------------------------
1990 else if(strcmp(mode,"connect")==0)
1991 {
1992 char* host = (char*)omAlloc(256);
1993 int sockfd, portno;
1994 struct sockaddr_in serv_addr;
1995 struct hostent *server;
1996
1997 si_sscanf(l->name,"%255[^:]:%d",host,&portno);
1998 //Print("connect to host %s, port %d\n",host,portno);mflush();
1999 if (portno!=0)
2000 {
2001 sockfd = socket(AF_INET, SOCK_STREAM, 0);
2002 if (sockfd < 0)
2003 {
2004 WerrorS("ERROR opening socket");
2005 l->flags=0;
2006 l->data=NULL;
2007 omFreeSize(d,sizeof(ssiInfo));
2008 return TRUE;
2009 }
2010 server = gethostbyname(host);
2011 if (server == NULL)
2012 {
2013 WerrorS("ERROR, no such host");
2014 l->flags=0;
2015 l->data=NULL;
2016 omFreeSize(d,sizeof(ssiInfo));
2017 return TRUE;
2018 }
2019 memset((char *) &serv_addr, 0, sizeof(serv_addr));
2020 serv_addr.sin_family = AF_INET;
2021 memcpy((char *)&serv_addr.sin_addr.s_addr,
2022 (char *)server->h_addr,
2023 server->h_length);
2024 serv_addr.sin_port = htons(portno);
2025 if (si_connect(sockfd,(sockaddr*)&serv_addr,sizeof(serv_addr)) < 0)
2026 {
2027 Werror("ERROR connecting(errno=%d)",errno);
2028 l->flags=0;
2029 l->data=NULL;
2030 omFreeSize(d,sizeof(ssiInfo));
2031 return TRUE;
2032 }
2033 //PrintS("connected\n");mflush();
2034 d->f_read=s_open(sockfd);
2035 d->fd_read=sockfd;
2036 d->f_write=fdopen(sockfd,"w");
2037 d->fd_write=sockfd;
2039 omFree(host);
2040 }
2041 else
2042 {
2043 l->data=NULL;
2044 l->flags=0;
2045 omFreeSize(d,sizeof(ssiInfo));
2046 return TRUE;
2047 }
2048 }
2049 // ======================================================================
2050 else
2051 {
2052 // normal link to a file
2053 if (FE_OPT_NO_SHELL_FLAG) {WerrorS("no links allowed");return TRUE;}
2054 FILE *outfile;
2055 char *filename=l->name;
2056
2057 if(filename[0]=='>')
2058 {
2059 if (filename[1]=='>')
2060 {
2061 filename+=2;
2062 mode = "a";
2063 }
2064 else
2065 {
2066 filename++;
2067 mode="w";
2068 }
2069 }
2070 outfile=myfopen(filename,mode);
2071 if (outfile!=NULL)
2072 {
2073 if (strcmp(l->mode,"r")==0)
2074 {
2075 fclose(outfile);
2076 d->f_read=s_open_by_name(filename);
2077 }
2078 else
2079 {
2080 d->f_write = outfile;
2081 fprintf(d->f_write,"98 %d %d %u %u\n",SSI_VERSION,MAX_TOK,si_opt_1,si_opt_2);
2082 }
2083 }
2084 else
2085 {
2086 omFree(d);
2087 l->data=NULL;
2088 l->flags=0;
2089 return TRUE;
2090 }
2091 }
2092 }
2093 }
2094
2095 return FALSE;
2096}
2097
2098//**************************************************************************/
2099#if 0
2100static BOOLEAN ssiPrepClose(si_link l)
2101{
2102 if (l!=NULL)
2103 {
2105 ssiInfo *d = (ssiInfo *)l->data;
2106 if (d!=NULL)
2107 {
2108 if (d->send_quit_at_exit)
2109 {
2110 fputs("99\n",d->f_write);
2111 fflush(d->f_write);
2112 }
2113 d->quit_sent=1;
2114 }
2115 }
2116 return FALSE;
2117}
2118#endif
2119
2121{
2122 if (l!=NULL)
2123 {
2125 ssiInfo *d = (ssiInfo *)l->data;
2126 if (d!=NULL)
2127 {
2128 // send quit signal
2129 if ((d->send_quit_at_exit)
2130 && (d->quit_sent==0))
2131 {
2132 fputs("99\n",d->f_write);
2133 fflush(d->f_write);
2134 d->quit_sent=1;
2135 }
2136 // clean ring
2137 if (d->r!=NULL) rKill(d->r);
2138 for(int i=0;i<SI_RING_CACHE;i++)
2139 {
2140 if (d->rings[i]!=NULL) rKill(d->rings[i]);
2141 d->rings[i]=NULL;
2142 }
2143 if (d->f_read!=NULL) { s_close(d->f_read);d->f_read=NULL;}
2144 if (d->f_write!=NULL) { fclose(d->f_write); d->f_write=NULL; }
2145 if (((strcmp(l->mode,"tcp")==0)
2146 || (strcmp(l->mode,"fork")==0))
2147 && (d->pid>1))
2148 {
2149 // did the child stop ?
2150 int pid=si_waitpid(d->pid,NULL,WNOHANG);
2151 if ((pid==0) /* no status change for child*/
2152 && (kill(d->pid,0)==0)) // child is still running
2153 {
2154 struct timespec t;
2155 struct timespec rem;
2156 // wait 60 sec
2157 for(int i=0;i<50;i++)
2158 {
2159 // wait till signal or 100ms:
2160 t.tv_sec=0;
2161 t.tv_nsec=100000000; // <=100 ms
2162 nanosleep(&t, &rem);
2163 // child finished ?
2164 if (si_waitpid(d->pid,NULL,WNOHANG) == d->pid) break;
2165 }
2166 if (kill(d->pid,0)==0) // child still exists
2167 {
2168 kill(d->pid,SIGTERM);
2169 t.tv_sec=1;
2170 t.tv_nsec=0; // <=1000 ms
2171 nanosleep(&t, &rem);
2172 si_waitpid(d->pid,NULL,WNOHANG);
2173 }
2174 }
2175 }
2176 if ((strcmp(l->mode,"tcp")==0)
2177 || (strcmp(l->mode,"fork")==0))
2178 {
2180 if (hh!=NULL)
2181 {
2182 if (hh->l==l)
2183 {
2185 omFreeSize(hh,sizeof(link_struct));
2186 }
2187 else while(hh->next!=NULL)
2188 {
2189 link_list hhh=(link_list)hh->next;
2190 if (hhh->l==l)
2191 {
2192 hh->next=hhh->next;
2193 omFreeSize(hhh,sizeof(link_struct));
2194 break;
2195 }
2196 else
2197 hh=(link_list)hh->next;
2198 }
2199 }
2200 }
2201 omFreeSize((ADDRESS)d,(sizeof *d));
2202 }
2203 l->data=NULL;
2204 }
2205 return FALSE;
2206}
2207
2208//**************************************************************************/
2210{
2211 ssiInfo *d = (ssiInfo *)l->data;
2213 int t=0;
2214 t=s_readint(d->f_read);
2215 //Print("got type %d\n",t);
2216 switch(t)
2217 {
2218 case 1:res->rtyp=INT_CMD;
2219 res->data=(char *)(long)ssiReadInt(d);
2220 //Print("int: %d\n",(int)(long)res->data);
2221 break;
2222 case 2:res->rtyp=STRING_CMD;
2223 res->data=(char *)ssiReadString(d);
2224 //Print("str: %s\n",(char*)res->data);
2225 break;
2226 case 3:res->rtyp=NUMBER_CMD;
2227 if (d->r==NULL) goto no_ring;
2228 ssiCheckCurrRing(d->r);
2229 res->data=(char *)ssiReadNumber(d);
2230 //Print("number\n");
2231 break;
2232 case 4:res->rtyp=BIGINT_CMD;
2233 res->data=(char *)ssiReadBigInt(d);
2234 //Print("bigint\n");
2235 break;
2236 case 15:
2237 case 5:{
2238 //Print("ring %d\n",t);
2239 d->r=ssiReadRing(d);
2240 if (errorreported) return NULL;
2241 res->data=(char*)d->r;
2242 if (d->r!=NULL) rIncRefCnt(d->r);
2243 res->rtyp=RING_CMD;
2244 if (t==15) // setring
2245 {
2246 if(ssiSetCurrRing(d->r)) { d->r=currRing; }
2248 return ssiRead1(l);
2249 }
2250 }
2251 break;
2252 case 6:res->rtyp=POLY_CMD;
2253 //Print("poly\n");
2254 if (d->r==NULL) goto no_ring;
2255 ssiCheckCurrRing(d->r);
2256 res->data=(char*)ssiReadPoly(d);
2257 break;
2258 case 7:res->rtyp=IDEAL_CMD;
2259 //Print("ideal\n");
2260 if (d->r==NULL) goto no_ring;
2261 ssiCheckCurrRing(d->r);
2262 res->data=(char*)ssiReadIdeal(d);
2263 break;
2264 case 8:res->rtyp=MATRIX_CMD;
2265 //Print("matrix\n");
2266 if (d->r==NULL) goto no_ring;
2267 ssiCheckCurrRing(d->r);
2268 res->data=(char*)ssiReadMatrix(d);
2269 break;
2270 case 9:res->rtyp=VECTOR_CMD;
2271 //Print("vector\n");
2272 if (d->r==NULL) goto no_ring;
2273 ssiCheckCurrRing(d->r);
2274 res->data=(char*)ssiReadPoly(d);
2275 break;
2276 case 10:
2277 case 22:if (t==22) res->rtyp=SMATRIX_CMD;
2278 else res->rtyp=MODUL_CMD;
2279 //Print("module/smatrix %d\n",t);
2280 if (d->r==NULL) goto no_ring;
2281 ssiCheckCurrRing(d->r);
2282 {
2283 int rk=s_readint(d->f_read);
2284 ideal M=ssiReadIdeal(d);
2285 M->rank=rk;
2286 res->data=(char*)M;
2287 }
2288 break;
2289 case 11:
2290 {
2291 //Print("cmd\n",t);
2292 res->rtyp=COMMAND;
2293 res->data=ssiReadCommand(l);
2294 int nok=res->Eval();
2295 if (nok) WerrorS("error in eval");
2296 break;
2297 }
2298 case 12: /*DEF_CMD*/
2299 {
2300 //Print("def\n",t);
2301 res->rtyp=0;
2302 res->name=(char *)ssiReadString(d);
2303 int nok=res->Eval();
2304 if (nok) WerrorS("error in name lookup");
2305 break;
2306 }
2307 case 13: res->rtyp=PROC_CMD;
2308 res->data=ssiReadProc(d);
2309 break;
2310 case 14: res->rtyp=LIST_CMD;
2311 res->data=ssiReadList(l);
2312 break;
2313 case 16: res->rtyp=NONE; res->data=NULL;
2314 break;
2315 case 17: res->rtyp=INTVEC_CMD;
2316 res->data=ssiReadIntvec(d);
2317 break;
2318 case 18: res->rtyp=INTMAT_CMD;
2319 res->data=ssiReadIntmat(d);
2320 break;
2321 case 19: res->rtyp=BIGINTMAT_CMD;
2322 res->data=ssiReadBigintmat(d);
2323 break;
2324 case 20: ssiReadBlackbox(res,l);
2325 break;
2326 case 21: ssiReadAttrib(res,l);
2327 break;
2328 case 23: ssiReadRingProperties(l);
2329 return ssiRead1(l);
2330 break;
2331 case 24: res->rtyp=BIGINTVEC_CMD;
2332 res->data=ssiReadBigintvec(d);
2333 break;
2334 // ------------
2335 case 98: // version
2336 {
2337 int n98_v,n98_m;
2338 BITSET n98_o1,n98_o2;
2339 n98_v=s_readint(d->f_read);
2340 n98_m=s_readint(d->f_read);
2341 n98_o1=s_readint(d->f_read);
2342 n98_o2=s_readint(d->f_read);
2343 if ((n98_v!=SSI_VERSION) ||(n98_m!=MAX_TOK))
2344 {
2345 Print("incompatible versions of ssi: %d/%d vs %d/%d\n",
2346 SSI_VERSION,MAX_TOK,n98_v,n98_m);
2347 }
2348 #ifndef SING_NDEBUG
2349 if (TEST_OPT_DEBUG)
2350 Print("// opening ssi-%d, MAX_TOK=%d\n",n98_v,n98_m);
2351 #endif
2352 si_opt_1=n98_o1;
2353 si_opt_2=n98_o2;
2355 return ssiRead1(l);
2356 }
2357 case 99: omFreeBin(res,sleftv_bin); ssiClose(l); m2_end(-1);
2358 break; /*to make compiler happy*/
2359 case 0: if (s_iseof(d->f_read))
2360 {
2361 ssiClose(l);
2362 }
2363 res->rtyp=DEF_CMD;
2364 break;
2365 default: Werror("not implemented (t:%d)",t);
2367 res=NULL;
2368 break;
2369 }
2370 // if currRing is required for the result, but lost
2371 // define "ssiRing%d" as currRing:
2372 if ((d->r!=NULL)
2373 && (currRing!=d->r)
2374 && (res->RingDependend()))
2375 {
2376 if(ssiSetCurrRing(d->r)) { d->r=currRing; }
2377 }
2378 return res;
2379no_ring: WerrorS("no ring");
2381 return NULL;
2382}
2383leftv ssiRead1_S(char**s, const ring R)
2384{
2386 int t=0;
2387 t=s_readint_S(s);
2388 switch(t)
2389 {
2390 case 1:res->rtyp=INT_CMD;
2391 res->data=(char *)(long)ssiReadInt_S(s);
2392 break;
2393 case 2:res->rtyp=STRING_CMD;
2394 res->data=(char *)ssiReadString_S(s);
2395 break;
2396 case 3:res->rtyp=NUMBER_CMD;
2397 res->data=(char *)ssiReadNumber_CF_S(s,R->cf);
2398 break;
2399 case 4:res->rtyp=BIGINT_CMD;
2400 res->data=(char *)ssiReadBigInt_S(s);
2401 //Print("bigint\n");
2402 break;
2403 case 15:
2404 case 5:{
2405 //Print("ring %d\n",t);
2406 ring r=ssiReadRing_R_S(s);
2407 if (errorreported||(r==NULL)) return NULL;
2408 res->rtyp=RING_CMD;
2409 res->data=(char*)r;
2410 if (/*(t==15)&&*/
2411 ((currRing==NULL)||(!rSamePolyRep(r,currRing))))
2412 {
2413 rChangeCurrRing(r);
2414 }
2415 break;
2416 }
2417 case 6:res->rtyp=POLY_CMD;
2418 res->data=(char*)ssiReadPoly_R_S(s,R);
2419 break;
2420 case 7:res->rtyp=IDEAL_CMD;
2421 res->data=(char*)ssiReadIdeal_R_S(s,R);
2422 break;
2423 case 8:res->rtyp=MATRIX_CMD;
2424 res->data=(char*)ssiReadMatrix_R_S(s,R);
2425 break;
2426 case 9:res->rtyp=VECTOR_CMD;
2427 res->data=(char*)ssiReadPoly_R_S(s,R);
2428 break;
2429 case 10:
2430 case 22:if (t==22) res->rtyp=SMATRIX_CMD;
2431 else res->rtyp=MODUL_CMD;
2432 {
2433 int rk=s_readint_S(s);
2434 ideal M=ssiReadIdeal_R_S(s,R);
2435 M->rank=rk;
2436 res->data=(char*)M;
2437 }
2438 break;
2439 #if 0
2440 case 11:
2441 {
2442 res->rtyp=COMMAND;
2443 res->data=ssiReadCommand(l);
2444 int nok=res->Eval();
2445 if (nok) WerrorS("error in eval");
2446 break;
2447 }
2448 #endif
2449 case 12: /*DEF_CMD*/
2450 {
2451 res->rtyp=0;
2452 res->name=(char *)ssiReadString_S(s);
2453 int nok=res->Eval();
2454 if (nok) WerrorS("error in name lookup");
2455 break;
2456 }
2457 case 13: res->rtyp=PROC_CMD;
2458 res->data=ssiReadProc_S(s);
2459 break;
2460 case 14: res->rtyp=LIST_CMD;
2461 res->data=ssiReadList_S(s,R);
2462 break;
2463 case 16: res->rtyp=NONE; res->data=NULL;
2464 break;
2465 case 17: res->rtyp=INTVEC_CMD;
2466 res->data=ssiReadIntvec_S(s);
2467 break;
2468 case 18: res->rtyp=INTMAT_CMD;
2469 res->data=ssiReadIntmat_S(s);
2470 break;
2471 case 19: res->rtyp=BIGINTMAT_CMD;
2472 res->data=ssiReadBigintmat_S(s);
2473 break;
2474 #if 0
2475 case 20: ssiReadBlackbox(res,l);
2476 break;
2477 case 21: ssiReadAttrib(res,l);
2478 break;
2479 case 23: ssiReadRingProperties(l);
2480 return ssiRead1(l);
2481 break;
2482 #endif
2483 case 24: res->rtyp=BIGINTVEC_CMD;
2484 res->data=ssiReadBigintvec_S(s);
2485 break;
2486 // ------------
2487 case 98: // version
2488 {
2489 int n98_v,n98_m;
2490 BITSET n98_o1,n98_o2;
2491 n98_v=s_readint_S(s);
2492 n98_m=s_readint_S(s);
2493 n98_o1=s_readint_S(s);
2494 n98_o2=s_readint_S(s);
2495 Print("// version ssi-%d, MAX_TOK=%d\n",n98_v,n98_m);
2496 si_opt_1=n98_o1;
2497 si_opt_2=n98_o2;
2499 return ssiRead1_S(s,R);
2500 }
2501 #if 0
2502 case 99: omFreeBin(res,sleftv_bin); ssiClose(l); m2_end(-1);
2503 break; /*to make compiler happy*/
2504 #endif
2505 case 0: res->rtyp=DEF_CMD;
2506 **s='\0'; /* unkown char?*/
2507 break;
2508 default: Werror("not implemented (t:%d)",t);
2510 res=NULL;
2511 break;
2512 }
2513 while((**s!='\0') &&(**s<=' ')) (*s)++;
2514 if (**s>' ') res->next=ssiRead1_S(s,R);
2515 return res;
2516}
2517//**************************************************************************/
2518static BOOLEAN ssiSetRing(si_link l, ring r, BOOLEAN send)
2519{
2520 if(SI_LINK_W_OPEN_P(l)==0)
2522 ssiInfo *d = (ssiInfo *)l->data;
2523 if (d->r!=r)
2524 {
2525 if (send)
2526 {
2527 fputs("15 ",d->f_write);
2528 ssiWriteRing(d,r);
2529 }
2530 d->r=r;
2531 }
2532 if (currRing!=r) rChangeCurrRing(r);
2533 return FALSE;
2534}
2535//**************************************************************************/
2536
2538{
2539 if(SI_LINK_W_OPEN_P(l)==0)
2541 if (strcmp(l->mode,"string")==0) return TRUE;
2542 ssiInfo *d = (ssiInfo *)l->data;
2543 d->level++;
2544 //FILE *fich=d->f;
2545 while (data!=NULL)
2546 {
2547 int tt=data->Typ();
2548 void *dd=data->Data();
2549 attr *aa=data->Attribute();
2550 if ((aa!=NULL) && ((*aa)!=NULL)) // n user attributes
2551 {
2552 attr a=*aa;
2553 int n=0;
2554 while(a!=NULL) { n++; a=a->next;}
2555 fprintf(d->f_write,"21 %d %d ",data->flag,n);
2556 }
2557 else if (data->flag!=0) // only "flag" attributes
2558 {
2559 fprintf(d->f_write,"21 %d 0 ",data->flag);
2560 }
2561 if ((dd==NULL) && (data->name!=NULL) && (tt==0)) tt=DEF_CMD;
2562 // return pure undefined names as def
2563
2564 switch(tt /*data->Typ()*/)
2565 {
2566 case 0: /*error*/
2567 case NONE/* nothing*/:fputs("16 ",d->f_write);
2568 break;
2569 case STRING_CMD: fputs("2 ",d->f_write);
2570 ssiWriteString(d,(char *)dd);
2571 break;
2572 case INT_CMD: fputs("1 ",d->f_write);
2573 ssiWriteInt(d,(int)(long)dd);
2574 break;
2575 case BIGINT_CMD:fputs("4 ",d->f_write);
2576 ssiWriteBigInt(d,(number)dd);
2577 break;
2578 case NUMBER_CMD:
2579 if (d->r!=currRing)
2580 {
2581 fputs("15 ",d->f_write);
2583 if (d->level<=1) fputc('\n',d->f_write);
2584 }
2585 fputs("3 ",d->f_write);
2586 ssiWriteNumber(d,(number)dd);
2587 break;
2588 case RING_CMD:fputs("5 ",d->f_write);
2589 ssiWriteRing(d,(ring)dd);
2590 break;
2591 case BUCKET_CMD:
2592 {
2594 if (d->r!=sBucketGetRing(b))
2595 {
2596 fputs("15 ",d->f_write);
2598 if (d->level<=1) fputc('\n',d->f_write);
2599 }
2600 fputs("6 ",d->f_write);
2602 break;
2603 }
2604 case POLY_CMD:
2605 case VECTOR_CMD:
2606 if (d->r!=currRing)
2607 {
2608 fputs("15 ",d->f_write);
2610 if (d->level<=1) fputc('\n',d->f_write);
2611 }
2612 if(tt==POLY_CMD) fputs("6 ",d->f_write);
2613 else fputs("9 ",d->f_write);
2614 ssiWritePoly(d,(poly)dd);
2615 break;
2616 case IDEAL_CMD:
2617 case MODUL_CMD:
2618 case MATRIX_CMD:
2619 case SMATRIX_CMD:
2620 if (d->r!=currRing)
2621 {
2622 fputs("15 ",d->f_write);
2624 if (d->level<=1) fputc('\n',d->f_write);
2625 }
2626 if(tt==IDEAL_CMD) fputs("7 ",d->f_write);
2627 else if(tt==MATRIX_CMD) fputs("8 ",d->f_write);
2628 else /* tt==MODUL_CMD, SMATRIX_CMD*/
2629 {
2630 ideal M=(ideal)dd;
2631 if (tt==MODUL_CMD)
2632 fprintf(d->f_write,"10 %d ",(int)M->rank);
2633 else /*(tt==SMATRIX_CMD)*/
2634 fprintf(d->f_write,"22 %d ",(int)M->rank);
2635 }
2636 ssiWriteIdeal(d,tt,(ideal)dd);
2637 break;
2638 case COMMAND:
2639 fputs("11 ",d->f_write);
2641 break;
2642 case DEF_CMD: /* not evaluated stuff in quotes */
2643 fputs("12 ",d->f_write);
2644 ssiWriteString(d,data->Name());
2645 break;
2646 case PROC_CMD:
2647 fputs("13 ",d->f_write);
2648 ssiWriteProc(d,(procinfov)dd);
2649 break;
2650 case LIST_CMD:
2651 fputs("14 ",d->f_write);
2652 ssiWriteList(l,(lists)dd);
2653 break;
2654 case INTVEC_CMD:
2655 fputs("17 ",d->f_write);
2656 ssiWriteIntvec(d,(intvec *)dd);
2657 break;
2658 case INTMAT_CMD:
2659 fputs("18 ",d->f_write);
2660 ssiWriteIntmat(d,(intvec *)dd);
2661 break;
2662 case BIGINTMAT_CMD:
2663 fputs("19 ",d->f_write);
2665 break;
2666 case BIGINTVEC_CMD:
2667 fputs("24 ",d->f_write);
2669 break;
2670 default:
2671 if (tt>MAX_TOK)
2672 {
2673 blackbox *b=getBlackboxStuff(tt);
2674 fputs("20 ",d->f_write);
2675 b->blackbox_serialize(b,dd,l);
2676 }
2677 else
2678 {
2679 Werror("not implemented (t:%d, rtyp:%d)",tt, data->rtyp);
2680 d->level=0;
2681 return TRUE;
2682 }
2683 break;
2684 }
2685 if (d->level<=1) { fputc('\n',d->f_write); fflush(d->f_write); }
2686 data=data->next;
2687 }
2688 d->level--;
2689 return FALSE;
2690}
2691void ssiWrite_S(leftv data,const ring R)
2692{
2693 while(data!=NULL)
2694 {
2695 int tt=data->Typ();
2696 void *dd=data->Data();
2697 switch(tt /*data->Typ()*/)
2698 {
2699 case 0: /*error*/
2700 case NONE/* nothing*/:StringAppendS("16 ");
2701 break;
2702 case INT_CMD: StringAppendS("1 ");
2703 ssiWriteInt_S((int)(long)dd);
2704 break;
2705 case STRING_CMD: StringAppendS("2 ");
2706 ssiWriteString_S((char *)dd);
2707 break;
2708 case BIGINT_CMD:StringAppendS("4 ");
2709 ssiWriteBigInt_S((number)dd);
2710 break;
2711 case NUMBER_CMD:
2712 StringAppendS("3 ");
2713 ssiWriteNumber_CF_S((number)dd,R->cf);
2714 break;
2715 case RING_CMD:StringAppendS("5 ");
2716 ssiWriteRing_R_S((ring)dd);
2717 break;
2718 case BUCKET_CMD:
2719 {
2721 StringAppendS("6 ");
2723 break;
2724 }
2725 case POLY_CMD:
2726 case VECTOR_CMD:
2727 if(tt==POLY_CMD) StringAppendS("6 ");
2728 else StringAppendS("9 ");
2729 ssiWritePoly_R_S((poly)dd,R);
2730 break;
2731 case IDEAL_CMD:
2732 case MODUL_CMD:
2733 case MATRIX_CMD:
2734 case SMATRIX_CMD:
2735 if(tt==IDEAL_CMD) StringAppendS("7 ");
2736 else if(tt==MATRIX_CMD) StringAppendS("8 ");
2737 else /* tt==MODUL_CMD, SMATRIX_CMD*/
2738 {
2739 ideal M=(ideal)dd;
2740 if (tt==MODUL_CMD)
2741 {
2742 StringAppendS("10 ");StringAppend("%d ",(int)M->rank);
2743 }
2744 else /*(tt==SMATRIX_CMD)*/
2745 {
2746 StringAppendS("22 ");StringAppend("%d ",(int)M->rank);
2747 }
2748 }
2749 ssiWriteIdeal_R_S(tt,(ideal)dd,R);
2750 break;
2751 #if 0
2752 case COMMAND:
2753 fputs("11 ",d->f_write);
2755 break;
2756 #endif
2757 case DEF_CMD: /* not evaluated stuff in quotes */
2758 StringAppendS("12 ");
2759 ssiWriteString_S(data->Name());
2760 break;
2761 case PROC_CMD:
2762 StringAppendS("13 ");
2764 break;
2765 case LIST_CMD:
2766 StringAppendS("14 ");
2767 ssiWriteList_S((lists)dd,R);
2768 break;
2769 case INTVEC_CMD:
2770 StringAppendS("17 ");
2771 ssiWriteIntvec_S((intvec *)dd);
2772 break;
2773 case INTMAT_CMD:
2774 StringAppendS("18 ");
2775 ssiWriteIntmat_S((intvec *)dd);
2776 break;
2777 case BIGINTMAT_CMD:
2778 StringAppendS("19 ");
2780 break;
2781 case BIGINTVEC_CMD:
2782 StringAppendS("24 ");
2784 break;
2785 default:
2786 #if 0
2787 if (tt>MAX_TOK)
2788 {
2789 blackbox *b=getBlackboxStuff(tt);
2790 fputs("20 ",d->f_write);
2791 b->blackbox_serialize(b,dd,l);
2792 }
2793 else
2794 #endif
2795 {
2796 Werror("not implemented (t:%d, rtyp:%d)",tt, data->rtyp);
2797 return;
2798 }
2799 break;
2800 }
2801 data=data->next;
2802 }
2803}
2804
2807
2808si_link_extension slInitSsiExtension(si_link_extension s)
2809{
2810 s->Open=ssiOpen;
2811 s->Close=ssiClose;
2812 s->Kill=ssiClose;
2813 s->Read=ssiRead1;
2814 s->Read2=ssiRead2;
2815 s->Write=ssiWrite;
2816 s->Dump=ssiDump;
2817 s->GetDump=ssiGetDump;
2818
2819 s->Status=slStatusSsi;
2820 s->SetRing=ssiSetRing;
2821 s->type="ssi";
2822 return s;
2823}
2824
2825const char* slStatusSsi(si_link l, const char* request)
2826{
2827 if (strcmp(l->mode,"string")==0)
2828 {
2829 if (strcmp(request, "read") == 0)
2830 {
2831 if (SI_LINK_R_OPEN_P(l)) return "yes";
2832 else return "no";
2833 }
2834 if (strcmp(request, "write") == 0)
2835 {
2836 if (SI_LINK_W_OPEN_P(l)) return "yes";
2837 else return "no";
2838 }
2839 return "inavlid";
2840 }
2841 ssiInfo *d=(ssiInfo*)l->data;
2842 if (d==NULL)
2843 return "no";
2844 if (((strcmp(l->mode,"fork")==0)
2845 ||(strcmp(l->mode,"tcp")==0)
2846 ||(strcmp(l->mode,"connect")==0))
2847 && (strcmp(request, "read") == 0))
2848 {
2849 if (s_isready(d->f_read)) return "ready";
2850#if defined(HAVE_POLL)
2851 pollfd pfd;
2852 loop
2853 {
2854 /* Don't block. Return socket status immediately. */
2855 pfd.fd=d->fd_read;
2856 pfd.events=POLLIN;
2857 //Print("test fd %d\n",d->fd_read);
2858 /* check with select: chars waiting: no -> not ready */
2859 switch (si_poll(&pfd,1,0))
2860 {
2861 case 0: /* not ready */ return "not ready";
2862 case -1: /*error*/ return "error";
2863 case 1: /*ready ? */ break;
2864 }
2865#else
2866 fd_set mask;
2867 struct timeval wt;
2868 if (FD_SETSIZE<=d->fd_read)
2869 {
2870 Werror("file descriptor number too high (%d)",d->fd_read);
2871 return "error";
2872 }
2873
2874 loop
2875 {
2876 /* Don't block. Return socket status immediately. */
2877 wt.tv_sec = 0;
2878 wt.tv_usec = 0;
2879
2880 FD_ZERO(&mask);
2881 FD_SET(d->fd_read, &mask);
2882 //Print("test fd %d\n",d->fd_read);
2883 /* check with select: chars waiting: no -> not ready */
2884 switch (si_select(d->fd_read+1, &mask, NULL, NULL, &wt))
2885 {
2886 case 0: /* not ready */ return "not ready";
2887 case -1: /*error*/ return "error";
2888 case 1: /*ready ? */ break;
2889 }
2890#endif
2891 /* yes: read 1 char*/
2892 /* if \n, check again with select else ungetc(c), ready*/
2893 int c=s_getc(d->f_read);
2894 //Print("try c=%d\n",c);
2895 if (c== -1) return "eof"; /* eof or error */
2896 else if (isdigit(c))
2897 { s_ungetc(c,d->f_read); return "ready"; }
2898 else if (c>' ')
2899 {
2900 Werror("unknown char in ssiLink(%d)",c);
2901 return "error";
2902 }
2903 /* else: next char */
2904 }
2905 }
2906 else if (strcmp(request, "read") == 0)
2907 {
2908 if (SI_LINK_R_OPEN_P(l) && (!s_iseof(d->f_read)) && (s_isready(d->f_read))) return "ready";
2909 else return "not ready";
2910 }
2911 else if (strcmp(request, "write") == 0)
2912 {
2913 if (SI_LINK_W_OPEN_P(l)) return "ready";
2914 else return "not ready";
2915 }
2916 else return "unknown status request";
2917}
2918
2919int slStatusSsiL(lists L, int timeout, BOOLEAN *ignore)
2920{
2921// input: L: a list with links of type
2922// ssi-connect, ssi-fork, ssi-tcp, MPtcp-fork or MPtcp-launch.
2923// Note: Not every entry in L must be set.
2924// timeout: timeout for select in milli-seconds
2925// or -1 for infinity
2926// or 0 for polling
2927// returns: ERROR (via Werror): L has wrong elements or link not open
2928// -2: error in L
2929// -1: the read state of all links is eof
2930// 0: timeout (or polling): none ready,
2931// i>0: (at least) L[i] is ready
2932#if defined(HAVE_POLL) && !defined(__APPLE__)
2933// fd is restricted on OsX by ulimit "file descriptors" (256)
2934 si_link l;
2935 ssiInfo *d=NULL;
2936 int d_fd;
2937 int s;
2938 int nfd=L->nr+1;
2939 pollfd *pfd=(pollfd*)omAlloc0(nfd*sizeof(pollfd));
2940 for(int i=L->nr; i>=0; i--)
2941 {
2942 pfd[i].fd=-1;
2943 if (L->m[i].Typ()!=DEF_CMD)
2944 {
2945 if (L->m[i].Typ()!=LINK_CMD)
2946 { WerrorS("all elements must be of type link"); return -2;}
2947 l=(si_link)L->m[i].Data();
2948 if(SI_LINK_OPEN_P(l)==0)
2949 { WerrorS("all links must be open"); return -2;}
2950 if (((strcmp(l->m->type,"ssi")!=0) && (strcmp(l->m->type,"MPtcp")!=0))
2951 || ((strcmp(l->mode,"fork")!=0) && (strcmp(l->mode,"tcp")!=0)
2952 && (strcmp(l->mode,"launch")!=0) && (strcmp(l->mode,"connect")!=0)))
2953 {
2954 WerrorS("all links must be of type ssi:fork, ssi:tcp, ssi:connect");
2955 return -2;
2956 }
2957 if (strcmp(l->m->type,"ssi")==0)
2958 {
2959 d=(ssiInfo*)l->data;
2960 d_fd=d->fd_read;
2961 if (!s_isready(d->f_read))
2962 {
2963 pfd[i].fd=d_fd;
2964 pfd[i].events=POLLIN;
2965 }
2966 else
2967 {
2968 return i+1;
2969 }
2970 }
2971 else
2972 {
2973 Werror("wrong link type >>%s<<",l->m->type);
2974 return -2;
2975 }
2976 }
2977 else if (ignore!=NULL)
2978 {
2979 ignore[i]=TRUE; // not a link
2980 }
2981 }
2982 s=si_poll(pfd,nfd,timeout);
2983 if (s==-1)
2984 {
2985 Werror("error in poll call (errno:%d)",errno);
2986 return -2; /*error*/
2987 }
2988 if(s==0)
2989 {
2990 return 0; /*timeout*/
2991 }
2992 for(int i=L->nr; i>=0; i--)
2993 {
2994 if ((L->m[i].rtyp==LINK_CMD)
2995 && ((ignore==NULL)||(ignore[i]==FALSE)))
2996 {
2997 // the link type is ssi, that's already tested
2998 l=(si_link)L->m[i].Data();
2999 d=(ssiInfo*)l->data;
3000 d_fd=d->fd_read;
3001 if (pfd[i].fd==d_fd)
3002 {
3003 if (pfd[i].revents &POLLIN)
3004 {
3005 omFree(pfd);
3006 return i+1;
3007 }
3008 }
3009 }
3010 }
3011 // no ready
3012 return 0;
3013#else
3014 // fd is restricted to <=1024
3015 si_link l;
3016 ssiInfo *d=NULL;
3017 int d_fd;
3018 fd_set fdmask;
3019 FD_ZERO(&fdmask);
3020 int max_fd=0; /* 1 + max fd in fd_set */
3021
3022 /* timeout */
3023 struct timeval wt;
3024 struct timeval *wt_ptr=&wt;
3025 int startingtime = getRTimer()/TIMER_RESOLUTION; // in seconds
3026 if (timeout== -1)
3027 {
3028 wt_ptr=NULL;
3029 }
3030 else
3031 {
3032 wt.tv_sec = timeout / 1000;
3033 wt.tv_usec = (timeout % 1000)*1000;
3034 }
3035
3036 /* auxiliary variables */
3037 int i;
3038 int j;
3039 int k;
3040 int s;
3041 char fdmaskempty;
3042
3043 /* check the links and fill in fdmask */
3044 /* check ssi links for ungetc_buf */
3045 for(i=L->nr; i>=0; i--)
3046 {
3047 if (L->m[i].Typ()!=DEF_CMD)
3048 {
3049 if (L->m[i].Typ()!=LINK_CMD)
3050 { WerrorS("all elements must be of type link"); return -2;}
3051 l=(si_link)L->m[i].Data();
3052 if(SI_LINK_OPEN_P(l)==0)
3053 { WerrorS("all links must be open"); return -2;}
3054 if (((strcmp(l->m->type,"ssi")!=0) && (strcmp(l->m->type,"MPtcp")!=0))
3055 || ((strcmp(l->mode,"fork")!=0) && (strcmp(l->mode,"tcp")!=0)
3056 && (strcmp(l->mode,"launch")!=0) && (strcmp(l->mode,"connect")!=0)))
3057 {
3058 WerrorS("all links must be of type ssi:fork, ssi:tcp, ssi:connect");
3059 return -2;
3060 }
3061 if (strcmp(l->m->type,"ssi")==0)
3062 {
3063 d=(ssiInfo*)l->data;
3064 d_fd=d->fd_read;
3065 if (!s_isready(d->f_read))
3066 {
3067 if ((ignore==NULL) || (ignore[i]==FALSE))
3068 {
3069 FD_SET(d_fd, &fdmask);
3070 if (d_fd > max_fd) max_fd=d_fd;
3071 }
3072 }
3073 else
3074 return i+1;
3075 }
3076 else
3077 {
3078 Werror("wrong link type >>%s<<",l->m->type);
3079 return -2;
3080 }
3081 }
3082 }
3083 max_fd++;
3084 if (FD_SETSIZE<=max_fd)
3085 {
3086 Werror("file descriptor number too high (%d)",max_fd);
3087 return -2;
3088 }
3089
3090 /* check with select: chars waiting: no -> not ready */
3091 s = si_select(max_fd, &fdmask, NULL, NULL, wt_ptr);
3092 if (s==-1)
3093 {
3094 Werror("error in select call (errno:%d)",errno);
3095 return -2; /*error*/
3096 }
3097 if (s==0)
3098 {
3099 return 0; /*poll: not ready */
3100 }
3101 else /* s>0, at least one ready (the number of fd which are ready is s)*/
3102 {
3103 j=0;
3104 while (j<=max_fd) { if (FD_ISSET(j,&fdmask)) break; j++; }
3105 for(i=L->nr; i>=0; i--)
3106 {
3107 if (L->m[i].rtyp==LINK_CMD)
3108 {
3109 l=(si_link)L->m[i].Data();
3110 if (strcmp(l->m->type,"ssi")==0)
3111 {
3112 d=(ssiInfo*)l->data;
3113 d_fd=d->fd_read;
3114 if(j==d_fd) return i+1;
3115 }
3116 }
3117 }
3118 }
3119 return 0;
3120#endif
3121}
3122
3123int ssiBatch(const char *host, const char * port)
3124/* return 0 on success, >0 else*/
3125{
3127 char *buf=(char*)omAlloc(256);
3128 snprintf(buf,256,"ssi:connect %s:%s",host,port);
3129 slInit(l, buf);
3130 omFreeSize(buf,256);
3131 if (slOpen(l,SI_LINK_OPEN,NULL)) return 1;
3133
3134 idhdl id = enterid("link_ll", 0, LINK_CMD, &IDROOT, FALSE);
3135 IDLINK(id) = l;
3136
3137 loop
3138 {
3139 leftv h=ssiRead1(l); /*contains an exit.... */
3140 if (feErrors != NULL && *feErrors != '\0')
3141 {
3142 // handle errors:
3143 PrintS(feErrors); /* currently quite simple */
3144 *feErrors = '\0';
3145 }
3146 ssiWrite(l,h);
3147 h->CleanUp();
3149 }
3150 /* never reached*/
3151 _exit(0);
3152}
3153
3158int ssiReservePort(int clients)
3159{
3160 if (ssiReserved_P!=0)
3161 {
3162 WerrorS("ERROR already a reserved port requested");
3163 return 0;
3164 }
3165 int portno;
3166 ssiReserved_sockfd = socket(AF_INET, SOCK_STREAM, 0);
3167 if(ssiReserved_sockfd < 0)
3168 {
3169 WerrorS("ERROR opening socket");
3170 return 0;
3171 }
3172 memset((char *) &ssiResverd_serv_addr,0, sizeof(ssiResverd_serv_addr));
3173 portno = 1025;
3174 ssiResverd_serv_addr.sin_family = AF_INET;
3175 ssiResverd_serv_addr.sin_addr.s_addr = INADDR_ANY;
3176 do
3177 {
3178 portno++;
3179 ssiResverd_serv_addr.sin_port = htons(portno);
3180 if(portno > 50000)
3181 {
3182 WerrorS("ERROR on binding (no free port available?)");
3183 return 0;
3184 }
3185 }
3186 while(bind(ssiReserved_sockfd, (struct sockaddr *) &ssiResverd_serv_addr, sizeof(ssiResverd_serv_addr)) < 0);
3187 ssiReserved_P=portno;
3188 listen(ssiReserved_sockfd,clients);
3189 ssiReserved_Clients=clients;
3190 return portno;
3191}
3192
3193EXTERN_VAR si_link_extension si_link_root;
3195{
3196 if (ssiReserved_P==0)
3197 {
3198 WerrorS("ERROR no reserved port requested");
3199 return NULL;
3200 }
3201 struct sockaddr_in cli_addr;
3202 int clilen = sizeof(cli_addr);
3203 int newsockfd = si_accept(ssiReserved_sockfd, (struct sockaddr *) &cli_addr, (socklen_t *)&clilen);
3204 if(newsockfd < 0)
3205 {
3206 Werror("ERROR on accept (errno=%d)",errno);
3207 return NULL;
3208 }
3210 si_link_extension s = si_link_root;
3211 si_link_extension prev = s;
3212 while (strcmp(s->type, "ssi") != 0)
3213 {
3214 if (s->next == NULL)
3215 {
3216 prev = s;
3217 s = NULL;
3218 break;
3219 }
3220 else
3221 {
3222 s = s->next;
3223 }
3224 }
3225 if (s != NULL)
3226 l->m = s;
3227 else
3228 {
3229 si_link_extension ns = (si_link_extension)omAlloc0Bin(s_si_link_extension_bin);
3230 prev->next=slInitSsiExtension(ns);
3231 l->m = prev->next;
3232 }
3233 l->name=omStrDup("");
3234 l->mode=omStrDup("tcp");
3235 l->ref=1;
3236 ssiInfo *d=(ssiInfo*)omAlloc0(sizeof(ssiInfo));
3237 l->data=d;
3238 d->fd_read = newsockfd;
3239 d->fd_write = newsockfd;
3240 d->f_read = s_open(newsockfd);
3241 d->f_write = fdopen(newsockfd, "w");
3244 if (ssiReserved_Clients<=0)
3245 {
3246 ssiReserved_P=0;
3247 si_close(ssiReserved_sockfd);
3248 }
3249 return l;
3250}
3251/*---------------------------------------------------------------------*/
3252/**
3253 * @brief additional default signal handler
3254
3255 // some newer Linux version cannot have SIG_IGN for SIGCHLD,
3256 // so use this nice routine here:
3257 // SuSe 9.x reports -1 always
3258 // Redhat 9.x/FC x reports sometimes -1
3259 // see also: hpux_system
3260 // also needed by getrusage (timer etc.)
3261
3262 @param[in] sig
3263**/
3264/*---------------------------------------------------------------------*/
3266{
3267
3268#if 0
3269 pid_t kidpid;
3270 int status;
3271 loop
3272 {
3273 kidpid = si_waitpid(-1, &status, WNOHANG);
3274 if (kidpid==-1)
3275 {
3276 /* continue on interruption (EINTR): */
3277 if (errno == EINTR) continue;
3278 /* break on anything else (EINVAL or ECHILD according to manpage): */
3279 break;
3280 }
3281 else if (kidpid==0) break; /* no more children to process, so break */
3282
3283 //printf("Child %ld terminated\n", kidpid);
3285 while((hh!=NULL)&&(ssiToBeClosed_inactive))
3286 {
3287 if((hh->l!=NULL) && (hh->l->m->Open==ssiOpen))
3288 {
3289 ssiInfo *d = (ssiInfo *)hh->l->data;
3290 if(d->pid==kidpid)
3291 {
3293 {
3295 slClose(hh->l);
3297 break;
3298 }
3299 else break;
3300 }
3301 else hh=(link_list)hh->next;
3302 }
3303 else hh=(link_list)hh->next;
3304 }
3305 }
3306#endif
3307}
3308
3310{
3311 int type_id = IDTYP(h);
3312
3313 // C-proc not to be dumped, also LIB-proc not
3314 if (type_id == PROC_CMD)
3315 {
3316 if (IDPROC(h)->language == LANG_C) return FALSE;
3317 if (IDPROC(h)->libname != NULL) return FALSE;
3318 }
3319 // do not dump links
3320 if (type_id == LINK_CMD) return FALSE;
3321
3322 // do not dump ssi internal rings: ssiRing*
3323 if ((type_id == RING_CMD) && (strncmp(IDID(h),"ssiRing",7)==0))
3324 return FALSE;
3325
3326 // do not dump default cring:
3327 if (type_id == CRING_CMD)
3328 {
3329 if (strcmp(IDID(h),"ZZ")==0) return FALSE;
3330 if (strcmp(IDID(h),"QQ")==0) return FALSE;
3331 #ifdef SINGULAR_4_2
3332 if (strcmp(IDID(h),"AE")==0) return FALSE;
3333 if (strcmp(IDID(h),"QAE")==0) return FALSE;
3334 #endif
3335 }
3336
3337 command D=(command)omAlloc0(sizeof(*D));
3338 sleftv tmp;
3339 memset(&tmp,0,sizeof(tmp));
3340 tmp.rtyp=COMMAND;
3341 tmp.data=D;
3342
3343 if (type_id == PACKAGE_CMD)
3344 {
3345 // do not dump Top, Standard
3346 if ((strcmp(IDID(h), "Top") == 0)
3347 || (strcmp(IDID(h), "Standard") == 0))
3348 {
3349 omFreeSize(D,sizeof(*D));
3350 return FALSE;
3351 }
3352 package p=(package)IDDATA(h);
3353 // dump Singular-packages as LIB("...");
3354 if (p->language==LANG_SINGULAR)
3355 {
3356 D->op=LOAD_CMD;
3357 D->argc=2;
3358 D->arg1.rtyp=STRING_CMD;
3359 D->arg1.data=p->libname;
3360 D->arg2.rtyp=STRING_CMD;
3361 D->arg2.data=(char*)"with";
3362 ssiWrite(l,&tmp);
3363 omFreeSize(D,sizeof(*D));
3364 return FALSE;
3365 }
3366 // dump Singular-packages as load("...");
3367 else if (p->language==LANG_C)
3368 {
3369 D->op=LOAD_CMD;
3370 D->argc=1;
3371 D->arg1.rtyp=STRING_CMD;
3372 D->arg1.data=p->libname;
3373 ssiWrite(l,&tmp);
3374 omFreeSize(D,sizeof(*D));
3375 return FALSE;
3376 }
3377 }
3378
3379 // put type and name
3380 //Print("generic dump:%s,%s\n",IDID(h),Tok2Cmdname(IDTYP(h)));
3381 D->op='=';
3382 D->argc=2;
3383 D->arg1.rtyp=DEF_CMD;
3384 D->arg1.name=IDID(h);
3385 D->arg2.rtyp=IDTYP(h);
3386 D->arg2.data=IDDATA(h);
3387 ssiWrite(l,&tmp);
3388 omFreeSize(D,sizeof(*D));
3389 return FALSE;
3390}
3392{
3393 if (h == NULL) return FALSE;
3394
3395 if (ssiDumpIter(l, IDNEXT(h))) return TRUE;
3396
3397 // need to set the ring before writing it, otherwise we get in
3398 // trouble with minpoly
3399 if (IDTYP(h) == RING_CMD)
3400 rSetHdl(h);
3401
3402 if (DumpSsiIdhdl(l, h)) return TRUE;
3403
3404 // do not dump ssi internal rings: ssiRing*
3405 // but dump objects of all other rings
3406 if ((IDTYP(h) == RING_CMD)
3407 && (strncmp(IDID(h),"ssiRing",7)!=0))
3408 return ssiDumpIter(l, IDRING(h)->idroot);
3409 else
3410 return FALSE;
3411}
3413{
3414 if (strcmp(l->mode,"string")==0)
3415 {
3416 WerrorS("no dump for ssi:string");
3417 return TRUE;
3418 }
3419 idhdl h = IDROOT, rh = currRingHdl;
3421
3422 //if (! status ) status = DumpAsciiMaps(fd, h, NULL);
3423
3424 if (currRingHdl != rh) rSetHdl(rh);
3425 //fprintf(fd, "option(set, intvec(%d, %d));\n", si_opt_1, si_opt_2);
3426
3427 return status;
3428}
3430{
3431 if (strcmp(l->mode,"string")==0)
3432 {
3433 WerrorS("no dump for ssi:string");
3434 return TRUE;
3435 }
3436 ssiInfo *d=(ssiInfo*)l->data;
3437 loop
3438 {
3439 if (!SI_LINK_OPEN_P(l)) break;
3440 if (s_iseof(d->f_read)) break;
3441 leftv h=ssiRead1(l); /*contains an exit.... */
3442 if (feErrors != NULL && *feErrors != '\0')
3443 {
3444 // handle errors:
3445 PrintS(feErrors); /* currently quite simple */
3446 return TRUE;
3447 *feErrors = '\0';
3448 }
3449 h->CleanUp();
3451 }
3452 return FALSE;
3453}
3454
3456{
3458 while(hh!=NULL)
3459 {
3460 if ((hh->l->m!=NULL)
3461 && (hh->l->m->Open==ssiOpen)
3462 && SI_LINK_OPEN_P(hh->l)
3463 && (strcmp(hh->l->mode, "fork")==0))
3464 {
3466 ssiInfo *d = (ssiInfo *)hh->l->data;
3467 if (d->f_read!=NULL) { s_close(d->f_read);d->f_read=NULL;}
3468 if (d->f_write!=NULL) { fclose(d->f_write); d->f_write=NULL; }
3469 }
3470 hh=(link_list)hh->next;
3471 }
3473}
3474
3476{
3477 if((strcmp(l->mode,"string")==0)
3478 &&(u->Typ()==STRING_CMD))
3479 {
3480 StringSetS("");
3481 ssiWrite_S(u, currRing);
3482 res->data=(void*)StringEndS();
3483 res->rtyp=STRING_CMD;
3484 return res->data==NULL;
3485 }
3486 return TRUE;
3487}
3489{
3490 if((strcmp(l->mode,"string")==0)
3491 &&(u->Typ()==STRING_CMD))
3492 {
3493 char *s=(char*)u->Data();
3494 return ssiRead1_S(&s,currRing);
3495 }
3496 return NULL;
3497}
3498// ----------------------------------------------------------------
3499// format
3500// 1 int %d
3501// 2 string <len> %s
3502// 3 number
3503// 4 bigint 4 %d or 3 <mpz_t>
3504// 5 ring
3505// 6 poly
3506// 7 ideal
3507// 8 matrix
3508// 9 vector
3509// 10 module
3510// 11 command
3511// 12 def <len> %s
3512// 13 proc <len> %s
3513// 14 list %d <elem1> ....
3514// 15 setring .......
3515// 16 nothing
3516// 17 intvec <len> ...
3517// 18 intmat
3518// 19 bigintmat <r> <c> ...
3519// 20 blackbox <name> <len> ...
3520// 21 attrib <bit-attrib> <len> <a-name1> <val1>... <data>
3521// 22 smatrix
3522// 23 0 <log(bitmask)> ring properties: max.exp.
3523// 23 1 <log(bitmask)> <r->IsLPRing> ring properties:LPRing
3524// 23 2 <matrix C> <matrix D> ring properties: PLuralRing
3525// 24 bigintvec <c>
3526//
3527// 98: verify version: <ssi-version> <MAX_TOK> <OPT1> <OPT2>
3528// 99: quit Singular
sattr * attr
Definition attrib.h:16
#define BITSET
Definition auxiliary.h:85
int BOOLEAN
Definition auxiliary.h:88
#define TRUE
Definition auxiliary.h:101
#define FALSE
Definition auxiliary.h:97
void * ADDRESS
Definition auxiliary.h:120
blackbox * getBlackboxStuff(const int t)
return the structure to the type given by t
Definition blackbox.cc:17
int blackboxIsCmd(const char *n, int &tok)
used by scanner: returns ROOT_DECL for known types (and the type number in tok)
Definition blackbox.cc:219
const CanonicalForm CFMap CFMap & N
Definition cfEzgcd.cc:56
int l
Definition cfEzgcd.cc:100
int m
Definition cfEzgcd.cc:128
int i
Definition cfEzgcd.cc:132
int k
Definition cfEzgcd.cc:99
int p
Definition cfModGcd.cc:4086
CanonicalForm cf
Definition cfModGcd.cc:4091
CanonicalForm b
Definition cfModGcd.cc:4111
FILE * f
Definition checklibs.c:9
Matrices of numbers.
Definition bigintmat.h:51
attr next
Definition attrib.h:26
Class used for (list of) interpreter objects.
Definition subexpr.h:83
int Typ()
Definition subexpr.cc:1048
const char * name
Definition subexpr.h:87
int rtyp
Definition subexpr.h:91
void * Data()
Definition subexpr.cc:1192
leftv next
Definition subexpr.h:86
const char * Name()
Definition subexpr.h:120
void * data
Definition subexpr.h:88
attr * Attribute()
Definition subexpr.cc:1505
BITSET flag
Definition subexpr.h:90
sleftv * m
Definition lists.h:46
INLINE_THIS void Init(int l=0)
int nr
Definition lists.h:44
VAR BOOLEAN singular_in_batchmode
Definition cntrlc.cc:62
si_hdl_typ si_set_signal(int sig, si_hdl_typ signal_handler)
meta function for binding a signal to an handler
Definition cntrlc.cc:121
void sig_term_hdl(int)
Definition cntrlc.cc:77
static FORCE_INLINE number n_ReadFd_S(char **s, const coeffs r)
Definition coeffs.h:980
static FORCE_INLINE number n_ReadFd(const ssiInfo *f, const coeffs r)
io via ssi:
Definition coeffs.h:978
static FORCE_INLINE void n_WriteFd(number a, const ssiInfo *f, const coeffs r)
io via ssi:
Definition coeffs.h:972
@ n_algExt
used for all algebraic extensions, i.e., the top-most extension in an extension tower is algebraic
Definition coeffs.h:35
@ n_transExt
used for all transcendental extensions, i.e., the top-most extension in an extension tower is transce...
Definition coeffs.h:38
coeffs nInitChar(n_coeffType t, void *parameter)
one-time initialisations for new coeffs in case of an error return NULL
Definition numbers.cc:412
static FORCE_INLINE n_coeffType getCoeffType(const coeffs r)
Returns the type of coeffs domain.
Definition coeffs.h:431
static FORCE_INLINE int n_GetChar(const coeffs r)
Return the characteristic of the coeff. domain.
Definition coeffs.h:450
static FORCE_INLINE char * nCoeffName(const coeffs cf)
Definition coeffs.h:965
static FORCE_INLINE number n_Init(long i, const coeffs r)
a number representing i in the given coeff field/ring r
Definition coeffs.h:541
static FORCE_INLINE void n_WriteFd_S(number a, const coeffs r)
Definition coeffs.h:974
#define Print
Definition emacs.cc:80
#define Warn
Definition emacs.cc:77
#define WarnS
Definition emacs.cc:78
#define StringAppend
Definition emacs.cc:79
EXTERN_VAR BOOLEAN FE_OPT_NO_SHELL_FLAG
Definition extra.cc:166
const CanonicalForm int s
Definition facAbsFact.cc:51
CanonicalForm res
Definition facAbsFact.cc:60
const Variable & v
< [in] a sqrfree bivariate poly
Definition facBivar.h:39
int j
Definition facHensel.cc:110
VAR short errorreported
Definition feFopen.cc:23
void WerrorS(const char *s)
Definition feFopen.cc:24
FILE * myfopen(const char *path, const char *mode)
Definition feFopen.cc:167
const char * feSetOptValue(feOptIndex opt, char *optarg)
Definition feOpt.cc:154
static void * feOptValue(feOptIndex opt)
Definition feOpt.h:40
VAR char my_yylinebuf[80]
Definition febase.cc:44
if(!FE_OPT_NO_SHELL_FLAG)
Definition fehelp.cc:1000
char * fe_fgets_dummy(const char *, char *, int)
Definition feread.cc:455
char *(* fe_fgets_stdin)(const char *pr, char *s, int size)
Definition feread.cc:32
#define D(A)
Definition gentable.cc:128
#define STATIC_VAR
Definition globaldefs.h:7
#define EXTERN_VAR
Definition globaldefs.h:6
#define VAR
Definition globaldefs.h:5
@ IDEAL_CMD
Definition grammar.cc:285
@ MATRIX_CMD
Definition grammar.cc:287
@ BUCKET_CMD
Definition grammar.cc:284
@ BIGINTMAT_CMD
Definition grammar.cc:278
@ PROC_CMD
Definition grammar.cc:281
@ INTMAT_CMD
Definition grammar.cc:280
@ MODUL_CMD
Definition grammar.cc:288
@ SMATRIX_CMD
Definition grammar.cc:292
@ VECTOR_CMD
Definition grammar.cc:293
@ BIGINTVEC_CMD
Definition grammar.cc:279
@ NUMBER_CMD
Definition grammar.cc:289
@ POLY_CMD
Definition grammar.cc:290
@ RING_CMD
Definition grammar.cc:282
idhdl enterid(const char *s, int lev, int t, idhdl *root, BOOLEAN init, BOOLEAN search)
Definition ipid.cc:256
VAR idhdl currRingHdl
Definition ipid.cc:57
#define IDNEXT(a)
Definition ipid.h:118
EXTERN_VAR omBin sleftv_bin
Definition ipid.h:145
ip_command * command
Definition ipid.h:23
#define IDDATA(a)
Definition ipid.h:126
#define IDPROC(a)
Definition ipid.h:140
#define IDLINK(a)
Definition ipid.h:138
#define IDID(a)
Definition ipid.h:122
#define IDROOT
Definition ipid.h:19
#define IDRING(a)
Definition ipid.h:127
#define IDTYP(a)
Definition ipid.h:119
char * iiGetLibProcBuffer(procinfo *pi, int part)
Definition iplib.cc:197
void rKill(ring r)
Definition ipshell.cc:6181
idhdl rFindHdl(ring r, idhdl n)
Definition ipshell.cc:1701
void rSetHdl(idhdl h)
Definition ipshell.cc:5129
STATIC_VAR jList * T
Definition janet.cc:30
STATIC_VAR Poly * h
Definition janet.cc:971
BOOLEAN nc_CallPlural(matrix cc, matrix dd, poly cn, poly dn, ring r, bool bSetupQuotient, bool bCopyInput, bool bBeQuiet, ring curr, bool dummy_ring=false)
returns TRUE if there were errors analyze inputs, check them for consistency detects nc_type,...
VAR omBin slists_bin
Definition lists.cc:23
#define SR_INT
Definition longrat.h:67
matrix mpNew(int r, int c)
create a r x c zero-matrix
Definition matpol.cc:37
#define MATELEM(mat, i, j)
1-based access to matrix
Definition matpol.h:29
ip_smatrix * matrix
Definition matpol.h:43
#define MATROWS(i)
Definition matpol.h:26
#define MATCOLS(i)
Definition matpol.h:27
void rem(unsigned long *a, unsigned long *q, unsigned long p, int &dega, int degq)
Definition minpoly.cc:572
#define TIMER_RESOLUTION
Definition mod2.h:35
#define assume(x)
Definition mod2.h:389
void m2_end(int i)
Definition misc_ip.cc:1106
#define p_GetComp(p, r)
Definition monomials.h:64
#define pIter(p)
Definition monomials.h:37
#define pNext(p)
Definition monomials.h:36
#define pSetCoeff0(p, n)
Definition monomials.h:59
static number & pGetCoeff(poly p)
return an alias to the leading coefficient of p assumes that p != NULL NOTE: not copy
Definition monomials.h:44
slists * lists
The main handler for Singular numbers which are suitable for Singular polynomials.
number ndReadFd(const ssiInfo *, const coeffs r)
Definition numbers.cc:150
number ndReadFd_S(char **, const coeffs r)
Definition numbers.cc:156
coeffs nFindCoeffByName(char *cf_name)
find an existing coeff by its "CoeffName"
Definition numbers.cc:640
#define omStrDup(s)
#define omFreeSize(addr, size)
#define omAlloc(size)
#define omAlloc0Bin(bin)
#define omFree(addr)
#define omAlloc0(size)
#define omFreeBin(addr, bin)
#define omFreeBinAddr(addr)
#define NULL
Definition omList.c:12
VAR unsigned si_opt_2
Definition options.c:6
VAR unsigned si_opt_1
Definition options.c:5
#define TEST_OPT_PROT
Definition options.h:105
#define TEST_OPT_DEBUG
Definition options.h:110
static int index(p_Length length, p_Ord ord)
static int pLength(poly a)
Definition p_polys.h:190
static unsigned long p_SetExp(poly p, const unsigned long e, const unsigned long iBitmask, const int VarOffset)
set a single variable exponent @Note: VarOffset encodes the position in p->exp
Definition p_polys.h:490
static unsigned long p_SetComp(poly p, unsigned long c, ring r)
Definition p_polys.h:249
static void p_Setm(poly p, const ring r)
Definition p_polys.h:235
static long p_GetExp(const poly p, const unsigned long iBitmask, const int VarOffset)
get a single variable exponent @Note: the integer VarOffset encodes:
Definition p_polys.h:471
static void p_Delete(poly *p, const ring r)
Definition p_polys.h:903
static poly p_Init(const ring r, omBin bin)
Definition p_polys.h:1341
#define p_Test(p, r)
Definition p_polys.h:161
void rChangeCurrRing(ring r)
Definition polys.cc:16
VAR coeffs coeffs_BIGINT
Definition polys.cc:14
VAR ring currRing
Widely used global variable which specifies the current polynomial ring for Singular interpreter and ...
Definition polys.cc:13
#define NUM
Definition readcf.cc:180
void StringSetS(const char *st)
Definition reporter.cc:128
void StringAppendS(const char *st)
Definition reporter.cc:107
void PrintS(const char *s)
Definition reporter.cc:288
VAR char * feErrors
Definition reporter.cc:47
char * StringEndS()
Definition reporter.cc:151
void Werror(const char *fmt,...)
Definition reporter.cc:189
#define mflush()
Definition reporter.h:58
BOOLEAN rComplete(ring r, int force)
this needs to be called whenever a new ring is created: new fields in ring are created (like VarOffse...
Definition ring.cc:3527
void rUnComplete(ring r)
Definition ring.cc:4057
static unsigned long rGetExpSize(unsigned long bitmask, int &bits)
Definition ring.cc:2630
BOOLEAN rSamePolyRep(ring r1, ring r2)
returns TRUE, if r1 and r2 represents the monomials in the same way FALSE, otherwise this is an analo...
Definition ring.cc:1805
void rDelete(ring r)
unconditionally deletes fields in r
Definition ring.cc:454
ring rDefault(const coeffs cf, int N, char **n, int ord_size, rRingOrder_t *ord, int *block0, int *block1, int **wvhdl, unsigned long bitmask)
Definition ring.cc:103
BOOLEAN rEqual(ring r1, ring r2, BOOLEAN qr)
returns TRUE, if r1 equals r2 FALSE, otherwise Equality is determined componentwise,...
Definition ring.cc:1752
static BOOLEAN rField_is_Zp(const ring r)
Definition ring.h:506
static n_coeffType rFieldType(const ring r)
the type of the coefficient filed of r (n_Zp, n_Q, etc)
Definition ring.h:567
static BOOLEAN rIsPluralRing(const ring r)
we must always have this test!
Definition ring.h:406
static ring rIncRefCnt(ring r)
Definition ring.h:854
static BOOLEAN rIsLPRing(const ring r)
Definition ring.h:417
rRingOrder_t
order stuff
Definition ring.h:69
@ ringorder_a
Definition ring.h:71
@ ringorder_a64
for int64 weights
Definition ring.h:72
@ ringorder_L
Definition ring.h:91
@ ringorder_aa
for idElimination, like a, except pFDeg, pWeigths ignore it
Definition ring.h:93
@ ringorder_Wp
Definition ring.h:83
@ ringorder_ws
Definition ring.h:88
@ ringorder_Ws
Definition ring.h:89
@ ringorder_IS
Induced (Schreyer) ordering.
Definition ring.h:95
@ ringorder_wp
Definition ring.h:82
@ ringorder_M
Definition ring.h:75
static BOOLEAN rField_is_Q(const ring r)
Definition ring.h:517
static short rVar(const ring r)
define rVar(r) (r->N)
Definition ring.h:603
idrec * idhdl
Definition ring.h:22
int raise_rlimit_nproc()
Definition rlimit.c:18
s_buff s_open(int fd)
Definition s_buff.cc:32
int s_getc(s_buff F)
Definition s_buff.cc:59
int s_isready(s_buff F)
Definition s_buff.cc:86
int s_readint(s_buff F)
Definition s_buff.cc:113
int s_close(s_buff &F)
Definition s_buff.cc:46
s_buff s_open_by_name(const char *n)
Definition s_buff.cc:40
int s_readint_S(char **s)
Definition s_buff.cc:141
int s_readbytes(char *buff, int len, s_buff F)
Definition s_buff.cc:203
int s_iseof(s_buff F)
Definition s_buff.cc:352
void s_ungetc(int c, s_buff F)
Definition s_buff.cc:100
int fd_write
Definition s_buff.h:26
ring rings[SI_RING_CACHE]
Definition s_buff.h:31
pid_t pid
Definition s_buff.h:25
s_buff f_read
Definition s_buff.h:22
#define SI_RING_CACHE
Definition s_buff.h:30
char send_quit_at_exit
Definition s_buff.h:28
char level
Definition s_buff.h:27
char quit_sent
Definition s_buff.h:29
FILE * f_write
Definition s_buff.h:23
ring r
Definition s_buff.h:24
int fd_read
Definition s_buff.h:26
poly sBucketPeek(sBucket_pt b)
Definition sbuckets.cc:455
ring sBucketGetRing(const sBucket_pt bucket)
Returns bucket ring.
Definition sbuckets.cc:46
sBucket * sBucket_pt
Definition sbuckets.h:16
VAR int sem_acquired[SIPC_MAX_SEMAPHORES]
Definition semaphore.c:25
static int SI_LOG2(int v)
Definition si_log2.h:6
int * status
Definition si_signals.h:61
int status int fd
Definition si_signals.h:69
int status int void * buf
Definition si_signals.h:69
ideal idInit(int idsize, int rank)
initialise an ideal / module
VAR omBin sip_sideal_bin
#define IDELEMS(i)
#define SIPC_MAX_SEMAPHORES
Definition simpleipc.h:10
#define R
Definition sirandom.c:27
#define M
Definition sirandom.c:25
sleftv * leftv
Definition structs.h:53
#define loop
Definition structs.h:71
procinfo * procinfov
Definition structs.h:56
VAR omBin procinfo_bin
Definition subexpr.cc:42
@ LANG_SINGULAR
Definition subexpr.h:22
@ LANG_C
Definition subexpr.h:22
int name
New type name for int.
#define SR_HDL(A)
Definition tgb.cc:35
int getRTimer()
Definition timer.cc:150
#define IDHDL
Definition tok.h:31
@ BIGINT_CMD
Definition tok.h:38
@ CRING_CMD
Definition tok.h:56
@ LIST_CMD
Definition tok.h:118
@ INTVEC_CMD
Definition tok.h:101
@ PACKAGE_CMD
Definition tok.h:150
@ DEF_CMD
Definition tok.h:58
@ LINK_CMD
Definition tok.h:117
@ STRING_CMD
Definition tok.h:187
@ INT_CMD
Definition tok.h:96
@ MAX_TOK
Definition tok.h:220
#define NONE
Definition tok.h:223
#define COMMAND
Definition tok.h:29
struct for passing initialization parameters to naInitChar
Definition transext.h:88