My Project
Loading...
Searching...
No Matches
Functions
ssiLink.h File Reference
#include "Singular/links/silink.h"

Go to the source code of this file.

Functions

BOOLEAN ssiOpen (si_link l, short flag, leftv u)
 
BOOLEAN ssiWrite (si_link l, leftv v)
 
BOOLEAN ssiWrite2 (si_link l, leftv res, leftv v)
 
leftv ssiRead1 (si_link l)
 
leftv ssiRead2 (si_link l, leftv key)
 
BOOLEAN ssiClose (si_link l)
 
const charslStatusSsi (si_link l, const char *request)
 
si_link_extension slInitSsiExtension (si_link_extension s)
 
si_link ssiCommandLink ()
 
void sig_chld_hdl (int sig)
 additional default signal handler
 
int ssiReservePort (int clients)
 
void singular_close_links ()
 
ideal ssiReadIdeal (ssiInfo *d)
 
void ssiWriteIdeal (const ssiInfo *d, int typ, const ideal I)
 
int ssiReadInt (const ssiInfo *d)
 
void ssiWriteInt (const ssiInfo *d, const int i)
 
charssiWritePoly_S (poly p, const ring r)
 
poly ssiReadPoly_S (char *s, const ring r)
 
charssiWriteIdeal_S (const ideal I, const ring R)
 
ideal ssiReadIdeal_S (char *s, const ring R)
 
charssiWriteMatrix_S (const matrix M, const ring R)
 
matrix ssiReadMatrix_S (char *s, const ring R)
 
charssiWriteModule_S (const ideal M, const ring R)
 
leftv ssiRead1_S (char **s, const ring R)
 
void ssiWrite_S (leftv v, const ring R)
 

Function Documentation

◆ sig_chld_hdl()

void sig_chld_hdl ( int  sig)

additional default signal handler

some newer Linux version cannot have SIG_IGN for SIGCHLD, so use this nice routine here: SuSe 9.x reports -1 always Redhat 9.x/FC x reports sometimes -1 see also: hpux_system also needed by getrusage (timer etc.)

Parameters
[in]sig

Definition at line 2969 of file ssiLink.cc.

2970{
2971
2972#if 0
2973 pid_t kidpid;
2974 int status;
2975 loop
2976 {
2978 if (kidpid==-1)
2979 {
2980 /* continue on interruption (EINTR): */
2981 if (errno == EINTR) continue;
2982 /* break on anything else (EINVAL or ECHILD according to manpage): */
2983 break;
2984 }
2985 else if (kidpid==0) break; /* no more children to process, so break */
2986
2987 //printf("Child %ld terminated\n", kidpid);
2989 while((hh!=NULL)&&(ssiToBeClosed_inactive))
2990 {
2991 if((hh->l!=NULL) && (hh->l->m->Open==ssiOpen))
2992 {
2993 ssiInfo *d = (ssiInfo *)hh->l->data;
2994 if(d->pid==kidpid)
2995 {
2997 {
2999 slClose(hh->l);
3001 break;
3002 }
3003 else break;
3004 }
3005 else hh=(link_list)hh->next;
3006 }
3007 else hh=(link_list)hh->next;
3008 }
3009 }
3010#endif
3011}
#define TRUE
Definition auxiliary.h:101
#define FALSE
Definition auxiliary.h:97
#define NULL
Definition omList.c:12
int * status
Definition si_signals.h:61
#define loop
Definition structs.h:71

◆ singular_close_links()

void singular_close_links ( )

Definition at line 3159 of file ssiLink.cc.

3160{
3162 while(hh!=NULL)
3163 {
3164 if ((hh->l->m!=NULL)
3165 && (hh->l->m->Open==ssiOpen)
3166 && SI_LINK_OPEN_P(hh->l)
3167 && (strcmp(hh->l->mode, "fork")==0))
3168 {
3170 ssiInfo *d = (ssiInfo *)hh->l->data;
3171 if (d->f_read!=NULL) { s_close(d->f_read);d->f_read=NULL;}
3172 if (d->f_write!=NULL) { fclose(d->f_write); d->f_write=NULL; }
3173 }
3174 hh=(link_list)hh->next;
3175 }
3177}
int s_close(s_buff &F)
Definition s_buff.cc:46

◆ slInitSsiExtension()

si_link_extension slInitSsiExtension ( si_link_extension  s)

Definition at line 2512 of file ssiLink.cc.

2513{
2514 s->Open=ssiOpen;
2515 s->Close=ssiClose;
2516 s->Kill=ssiClose;
2517 s->Read=ssiRead1;
2518 s->Read2=ssiRead2;
2519 s->Write=ssiWrite;
2520 s->Dump=ssiDump;
2521 s->GetDump=ssiGetDump;
2522
2523 s->Status=slStatusSsi;
2524 s->SetRing=ssiSetRing;
2525 s->type="ssi";
2526 return s;
2527}
const CanonicalForm int s
Definition facAbsFact.cc:51

◆ slStatusSsi()

const char * slStatusSsi ( si_link  l,
const char request 
)

Definition at line 2529 of file ssiLink.cc.

2530{
2531 if (strcmp(l->mode,"string")==0)
2532 {
2533 if (strcmp(request, "read") == 0)
2534 {
2535 if (SI_LINK_R_OPEN_P(l)) return "yes";
2536 else return "no";
2537 }
2538 if (strcmp(request, "write") == 0)
2539 {
2540 if (SI_LINK_W_OPEN_P(l)) return "yes";
2541 else return "no";
2542 }
2543 return "inavlid";
2544 }
2545 ssiInfo *d=(ssiInfo*)l->data;
2546 if (d==NULL)
2547 return "no";
2548 if (((strcmp(l->mode,"fork")==0)
2549 ||(strcmp(l->mode,"tcp")==0)
2550 ||(strcmp(l->mode,"connect")==0))
2551 && (strcmp(request, "read") == 0))
2552 {
2553 if (s_isready(d->f_read)) return "ready";
2554#if defined(HAVE_POLL)
2555 pollfd pfd;
2556 loop
2557 {
2558 /* Don't block. Return socket status immediately. */
2559 pfd.fd=d->fd_read;
2560 pfd.events=POLLIN;
2561 //Print("test fd %d\n",d->fd_read);
2562 /* check with select: chars waiting: no -> not ready */
2563 switch (si_poll(&pfd,1,0))
2564 {
2565 case 0: /* not ready */ return "not ready";
2566 case -1: /*error*/ return "error";
2567 case 1: /*ready ? */ break;
2568 }
2569#else
2570 fd_set mask;
2571 struct timeval wt;
2572 if (FD_SETSIZE<=d->fd_read)
2573 {
2574 Werror("file descriptor number too high (%d)",d->fd_read);
2575 return "error";
2576 }
2577
2578 loop
2579 {
2580 /* Don't block. Return socket status immediately. */
2581 wt.tv_sec = 0;
2582 wt.tv_usec = 0;
2583
2584 FD_ZERO(&mask);
2585 FD_SET(d->fd_read, &mask);
2586 //Print("test fd %d\n",d->fd_read);
2587 /* check with select: chars waiting: no -> not ready */
2588 switch (si_select(d->fd_read+1, &mask, NULL, NULL, &wt))
2589 {
2590 case 0: /* not ready */ return "not ready";
2591 case -1: /*error*/ return "error";
2592 case 1: /*ready ? */ break;
2593 }
2594#endif
2595 /* yes: read 1 char*/
2596 /* if \n, check again with select else ungetc(c), ready*/
2597 int c=s_getc(d->f_read);
2598 //Print("try c=%d\n",c);
2599 if (c== -1) return "eof"; /* eof or error */
2600 else if (isdigit(c))
2601 { s_ungetc(c,d->f_read); return "ready"; }
2602 else if (c>' ')
2603 {
2604 Werror("unknown char in ssiLink(%d)",c);
2605 return "error";
2606 }
2607 /* else: next char */
2608 }
2609 }
2610 else if (strcmp(request, "read") == 0)
2611 {
2612 if (SI_LINK_R_OPEN_P(l) && (!s_iseof(d->f_read)) && (s_isready(d->f_read))) return "ready";
2613 else return "not ready";
2614 }
2615 else if (strcmp(request, "write") == 0)
2616 {
2617 if (SI_LINK_W_OPEN_P(l)) return "ready";
2618 else return "not ready";
2619 }
2620 else return "unknown status request";
2621}
int l
Definition cfEzgcd.cc:100
void Werror(const char *fmt,...)
Definition reporter.cc:189
int s_getc(s_buff F)
Definition s_buff.cc:59
int s_isready(s_buff F)
Definition s_buff.cc:86
int s_iseof(s_buff F)
Definition s_buff.cc:352
void s_ungetc(int c, s_buff F)
Definition s_buff.cc:100

◆ ssiClose()

BOOLEAN ssiClose ( si_link  l)

Definition at line 1818 of file ssiLink.cc.

1819{
1820 if (l!=NULL)
1821 {
1823 ssiInfo *d = (ssiInfo *)l->data;
1824 if (d!=NULL)
1825 {
1826 // send quit signal
1827 if ((d->send_quit_at_exit)
1828 && (d->quit_sent==0))
1829 {
1830 fputs("99\n",d->f_write);
1831 fflush(d->f_write);
1832 d->quit_sent=1;
1833 }
1834 // clean ring
1835 if (d->r!=NULL) rKill(d->r);
1836 for(int i=0;i<SI_RING_CACHE;i++)
1837 {
1838 if (d->rings[i]!=NULL) rKill(d->rings[i]);
1839 d->rings[i]=NULL;
1840 }
1841 if (d->f_read!=NULL) { s_close(d->f_read);d->f_read=NULL;}
1842 if (d->f_write!=NULL) { fclose(d->f_write); d->f_write=NULL; }
1843 if (((strcmp(l->mode,"tcp")==0)
1844 || (strcmp(l->mode,"fork")==0))
1845 && (d->pid>1))
1846 {
1847 // did the child stop ?
1848 int pid=si_waitpid(d->pid,NULL,WNOHANG);
1849 if ((pid==0) /* no status change for child*/
1850 && (kill(d->pid,0)==0)) // child is still running
1851 {
1852 struct timespec t;
1853 struct timespec rem;
1854 // wait 60 sec
1855 for(int i=0;i<50;i++)
1856 {
1857 // wait till signal or 100ms:
1858 t.tv_sec=0;
1859 t.tv_nsec=100000000; // <=100 ms
1860 nanosleep(&t, &rem);
1861 // child finished ?
1862 if (si_waitpid(d->pid,NULL,WNOHANG) == d->pid) break;
1863 }
1864 if (kill(d->pid,0)==0) // child still exists
1865 {
1866 kill(d->pid,SIGTERM);
1867 t.tv_sec=1;
1868 t.tv_nsec=0; // <=1000 ms
1869 nanosleep(&t, &rem);
1870 si_waitpid(d->pid,NULL,WNOHANG);
1871 }
1872 }
1873 }
1874 if ((strcmp(l->mode,"tcp")==0)
1875 || (strcmp(l->mode,"fork")==0))
1876 {
1878 if (hh!=NULL)
1879 {
1880 if (hh->l==l)
1881 {
1882 ssiToBeClosed=(link_list)hh->next;
1883 omFreeSize(hh,sizeof(link_struct));
1884 }
1885 else while(hh->next!=NULL)
1886 {
1887 link_list hhh=(link_list)hh->next;
1888 if (hhh->l==l)
1889 {
1890 hh->next=hhh->next;
1891 omFreeSize(hhh,sizeof(link_struct));
1892 break;
1893 }
1894 else
1895 hh=(link_list)hh->next;
1896 }
1897 }
1898 }
1899 omFreeSize((ADDRESS)d,(sizeof *d));
1900 }
1901 l->data=NULL;
1902 }
1903 return FALSE;
1904}
int i
Definition cfEzgcd.cc:132
void rKill(ring r)
Definition ipshell.cc:6181
void rem(unsigned long *a, unsigned long *q, unsigned long p, int &dega, int degq)
Definition minpoly.cc:572
#define omFreeSize(addr, size)
#define SI_RING_CACHE
Definition s_buff.h:30

◆ ssiCommandLink()

si_link ssiCommandLink ( )

Definition at line 2898 of file ssiLink.cc.

2899{
2900 if (ssiReserved_P==0)
2901 {
2902 WerrorS("ERROR no reserved port requested");
2903 return NULL;
2904 }
2905 struct sockaddr_in cli_addr;
2906 int clilen = sizeof(cli_addr);
2908 if(newsockfd < 0)
2909 {
2910 Werror("ERROR on accept (errno=%d)",errno);
2911 return NULL;
2912 }
2915 si_link_extension prev = s;
2916 while (strcmp(s->type, "ssi") != 0)
2917 {
2918 if (s->next == NULL)
2919 {
2920 prev = s;
2921 s = NULL;
2922 break;
2923 }
2924 else
2925 {
2926 s = s->next;
2927 }
2928 }
2929 if (s != NULL)
2930 l->m = s;
2931 else
2932 {
2934 prev->next=slInitSsiExtension(ns);
2935 l->m = prev->next;
2936 }
2937 l->name=omStrDup("");
2938 l->mode=omStrDup("tcp");
2939 l->ref=1;
2940 ssiInfo *d=(ssiInfo*)omAlloc0(sizeof(ssiInfo));
2941 l->data=d;
2942 d->fd_read = newsockfd;
2943 d->fd_write = newsockfd;
2944 d->f_read = s_open(newsockfd);
2945 d->f_write = fdopen(newsockfd, "w");
2948 if (ssiReserved_Clients<=0)
2949 {
2950 ssiReserved_P=0;
2952 }
2953 return l;
2954}
void WerrorS(const char *s)
Definition feFopen.cc:24
#define omStrDup(s)
#define omAlloc0Bin(bin)
#define omAlloc0(size)
s_buff s_open(int fd)
Definition s_buff.cc:32
int fd_write
Definition s_buff.h:26
s_buff f_read
Definition s_buff.h:22
FILE * f_write
Definition s_buff.h:23
int fd_read
Definition s_buff.h:26

◆ ssiOpen()

BOOLEAN ssiOpen ( si_link  l,
short  flag,
leftv  u 
)

Definition at line 1345 of file ssiLink.cc.

1346{
1347 if (l!=NULL)
1348 {
1349 const char *mode;
1350 if (flag & SI_LINK_OPEN)
1351 {
1352 if (strcmp(l->mode, "r") == 0)
1353 flag = SI_LINK_READ;
1354 else if (strcmp(l->mode,"string")==0)
1355 {
1357 return FALSE;
1358 }
1359 else flag = SI_LINK_WRITE;
1360 }
1361 if (((flag == SI_LINK_READ)
1362 || (flag == SI_LINK_WRITE))
1363 && (strcmp(l->mode,"string")==0))
1364 {
1366 return FALSE;
1367 }
1368
1369 if (flag == SI_LINK_READ) mode = "r";
1370 else if (strcmp(l->mode, "w") == 0) mode = "w";
1371 else if (strcmp(l->mode, "fork") == 0) mode = "fork";
1372 else if (strcmp(l->mode, "tcp") == 0) mode = "tcp";
1373 else if (strcmp(l->mode, "connect") == 0) mode = "connect";
1374 else mode = "a";
1375
1376
1377 SI_LINK_SET_OPEN_P(l, flag);
1378 if(l->data!=NULL) omFreeSize(l->data,sizeof(ssiInfo));
1379 omFreeBinAddr(l->mode);
1380 l->mode = omStrDup(mode);
1381
1382 ssiInfo *d=(ssiInfo*)omAlloc0(sizeof(ssiInfo));
1383 l->data=d;
1384 if (l->name[0] == '\0')
1385 {
1386 if (strcmp(mode,"fork")==0)
1387 {
1389 if (cpus<1)
1390 {
1391 WerrorS("no sub-processes allowed");
1392 l->flags=0;
1393 l->data=NULL;
1394 omFreeSize(d,sizeof(ssiInfo));
1395 return TRUE;
1396 }
1397 int pc[2];
1398 int cp[2];
1399 int err1=pipe(pc);
1400 int err2=pipe(cp);
1401 if (err1 || err2)
1402 {
1403 Werror("pipe failed with %d\n",errno);
1404 l->flags=0;
1405 l->data=NULL;
1406 omFreeSize(d,sizeof(ssiInfo));
1407 return TRUE;
1408 }
1410 n->u=u;
1411 n->l=l;
1412 n->next=(void *)ssiToBeClosed;
1413 ssiToBeClosed=n;
1414
1415 pid_t pid = fork();
1416 if (pid == -1 && errno == EAGAIN) // RLIMIT_NPROC too low?
1417 {
1419 pid = fork();
1420 }
1421 if (pid == -1)
1422 {
1423 WerrorS("could not fork");
1424 l->flags=0;
1425 l->data=NULL;
1426 omFreeSize(d,sizeof(ssiInfo));
1427 return TRUE;
1428 }
1429 if (pid==0) /*fork: child*/
1430 {
1431 /* block SIGINT */
1437 /* set #cpu to 1 for the child:*/
1439
1441 /* we know: l is the first entry in ssiToBeClosed-list */
1442 while(hh!=NULL)
1443 {
1445 ssiInfo *dd=(ssiInfo*)hh->l->data;
1446 s_close(dd->f_read);
1447 fclose(dd->f_write);
1448 if (dd->r!=NULL) rKill(dd->r);
1449 omFreeSize((ADDRESS)dd,(sizeof *dd));
1450 hh->l->data=NULL;
1451 link_list nn=(link_list)hh->next;
1452 omFree(hh);
1453 hh=nn;
1454 }
1456#ifdef HAVE_SIMPLEIPC
1458#endif // HAVE_SIMPLEIPC
1459 si_close(pc[1]); si_close(cp[0]);
1460 d->f_write=fdopen(cp[1],"w");
1461 d->f_read=s_open(pc[0]);
1462 d->fd_read=pc[0];
1463 d->fd_write=cp[1];
1464 //d->r=currRing;
1465 //if (d->r!=NULL) d->r->ref++;
1466 l->data=d;
1467 omFreeBinAddr(l->mode);
1468 l->mode = omStrDup(mode);
1471 //myynest=0;
1473 if ((u!=NULL)&&(u->rtyp==IDHDL))
1474 {
1475 idhdl h=(idhdl)u->data;
1476 h->lev=0;
1477 }
1478 loop
1479 {
1480 if (!SI_LINK_OPEN_P(l)) m2_end(-1);
1481 if(d->f_read->is_eof) m2_end(-1);
1482 leftv h=ssiRead1(l); /*contains an exit.... */
1483 if (feErrors != NULL && *feErrors != '\0')
1484 {
1485 // handle errors:
1486 PrintS(feErrors); /* currently quite simple */
1487 *feErrors = '\0';
1488 }
1489 ssiWrite(l,h);
1490 h->CleanUp();
1492 }
1493 /* never reached*/
1494 }
1495 else if (pid>0) /*fork: parent*/
1496 {
1497 d->pid=pid;
1498 si_close(pc[0]); si_close(cp[1]);
1499 d->f_write=fdopen(pc[1],"w");
1500 d->f_read=s_open(cp[0]);
1501 d->fd_read=cp[0];
1502 d->fd_write=pc[1];
1504 d->send_quit_at_exit=1;
1505 //d->r=currRing;
1506 //if (d->r!=NULL) d->r->ref++;
1507 }
1508 else
1509 {
1510 Werror("fork failed (%d)",errno);
1511 l->data=NULL;
1512 omFreeSize(d,sizeof(ssiInfo));
1513 return TRUE;
1514 }
1515 }
1516 // ---------------------------------------------------------------------
1517 else if (strcmp(mode,"tcp")==0)
1518 {
1522 if(sockfd < 0)
1523 {
1524 WerrorS("ERROR opening socket");
1525 l->data=NULL;
1526 l->flags=0;
1527 omFreeSize(d,sizeof(ssiInfo));
1528 return TRUE;
1529 }
1530 memset((char *) &serv_addr,0, sizeof(serv_addr));
1531 portno = 1025;
1532 serv_addr.sin_family = AF_INET;
1533 serv_addr.sin_addr.s_addr = INADDR_ANY;
1534 do
1535 {
1536 portno++;
1537 serv_addr.sin_port = htons(portno);
1538 if(portno > 50000)
1539 {
1540 WerrorS("ERROR on binding (no free port available?)");
1541 l->data=NULL;
1542 l->flags=0;
1543 omFreeSize(d,sizeof(ssiInfo));
1544 return TRUE;
1545 }
1546 }
1547 while(bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0);
1548 Print("waiting on port %d\n", portno);mflush();
1549 listen(sockfd,1);
1551 if(newsockfd < 0)
1552 {
1553 WerrorS("ERROR on accept");
1554 l->data=NULL;
1555 l->flags=0;
1556 omFreeSize(d,sizeof(ssiInfo));
1557 return TRUE;
1558 }
1559 PrintS("client accepted\n");
1560 d->fd_read = newsockfd;
1561 d->fd_write = newsockfd;
1562 d->f_read = s_open(newsockfd);
1563 d->f_write = fdopen(newsockfd, "w");
1566 }
1567 // no ssi-Link on stdin or stdout
1568 else if (strcmp(mode,"string")==0)
1569 {
1571 }
1572 else
1573 {
1574 Werror("invalid mode >>%s<< for ssi",mode);
1575 l->data=NULL;
1576 l->flags=0;
1577 omFreeSize(d,sizeof(ssiInfo));
1578 return TRUE;
1579 }
1580 }
1581 // =========================================================================
1582 else /*now l->name!=NULL*/
1583 {
1584 // tcp mode
1585 if(strcmp(mode,"tcp")==0)
1586 {
1590 if(sockfd < 0)
1591 {
1592 WerrorS("ERROR opening socket");
1593 l->data=NULL;
1594 l->flags=0;
1595 omFreeSize(d,sizeof(ssiInfo));
1596 return TRUE;
1597 }
1598 memset((char *) &serv_addr,0, sizeof(serv_addr));
1599 portno = 1025;
1600 serv_addr.sin_family = AF_INET;
1601 serv_addr.sin_addr.s_addr = INADDR_ANY;
1602 do
1603 {
1604 portno++;
1605 serv_addr.sin_port = htons(portno);
1606 if(portno > 50000)
1607 {
1608 WerrorS("ERROR on binding (no free port available?)");
1609 l->data=NULL;
1610 l->flags=0;
1611 omFreeSize(d,sizeof(ssiInfo));
1612 return TRUE;
1613 }
1614 }
1615 while(bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0);
1616 //Print("waiting on port %d\n", portno);mflush();
1617 listen(sockfd,1);
1618 char* cli_host = (char*)omAlloc(256);
1619 char* path = (char*)omAlloc(1024);
1620 int r = si_sscanf(l->name,"%255[^:]:%s",cli_host,path);
1621 if(r == 0)
1622 {
1623 WerrorS("ERROR: no host specified");
1624 l->data=NULL;
1625 l->flags=0;
1626 omFreeSize(d,sizeof(ssiInfo));
1627 omFree(path);
1629 return TRUE;
1630 }
1631 else if(r == 1)
1632 {
1633 WarnS("program not specified, using /usr/local/bin/Singular");
1634 Warn("in line >>%s<<",my_yylinebuf);
1635 strcpy(path,"/usr/local/bin/Singular");
1636 }
1637 char* ssh_command = (char*)omAlloc(256);
1638 char* ser_host = (char*)omAlloc(64);
1639 if(strcmp(cli_host,"localhost")==0)
1640 strcpy(ser_host,"localhost");
1641 else
1643 if (strcmp(cli_host,"localhost")==0) /*avoid "ssh localhost" as key may change*/
1644 snprintf(ssh_command,256,"%s -q --batch --link=ssi --MPhost=%s --MPport=%d &",path,ser_host,portno);
1645 else
1646 snprintf(ssh_command,256,"ssh %s %s -q --batch --link=ssi --MPhost=%s --MPport=%d &",cli_host,path,ser_host,portno);
1647 //Print("client on %s started:%s\n",cli_host,path);
1648 omFree(path);
1650 if (TEST_OPT_PROT) { Print("running >>%s<<\n",ssh_command); }
1651 int re=system(ssh_command);
1652 if (re<0)
1653 {
1654 Werror("ERROR running `%s` (%d)",ssh_command,re);
1655 l->data=NULL;
1656 l->flags=0;
1657 omFreeSize(d,sizeof(ssiInfo));
1658 return TRUE;
1659 }
1662 clilen = sizeof(cli_addr);
1664 if(newsockfd < 0)
1665 {
1666 WerrorS("ERROR on accept");
1667 l->data=NULL;
1668 l->flags=0;
1669 omFreeSize(d,sizeof(ssiInfo));
1670 return TRUE;
1671 }
1672 //PrintS("client accepted\n");
1673 d->fd_read = newsockfd;
1674 d->fd_write = newsockfd;
1675 d->f_read = s_open(newsockfd);
1676 d->f_write = fdopen(newsockfd, "w");
1679 d->send_quit_at_exit=1;
1681 newlink->u=u;
1682 newlink->l=l;
1683 newlink->next=(void *)ssiToBeClosed;
1685 fprintf(d->f_write,"98 %d %d %u %u\n",SSI_VERSION,MAX_TOK,si_opt_1,si_opt_2);
1686 }
1687 // ----------------------------------------------------------------------
1688 else if(strcmp(mode,"connect")==0)
1689 {
1690 char* host = (char*)omAlloc(256);
1691 int sockfd, portno;
1692 struct sockaddr_in serv_addr;
1693 struct hostent *server;
1694
1695 si_sscanf(l->name,"%255[^:]:%d",host,&portno);
1696 //Print("connect to host %s, port %d\n",host,portno);mflush();
1697 if (portno!=0)
1698 {
1700 if (sockfd < 0)
1701 {
1702 WerrorS("ERROR opening socket");
1703 l->flags=0;
1704 l->data=NULL;
1705 omFreeSize(d,sizeof(ssiInfo));
1706 return TRUE;
1707 }
1709 if (server == NULL)
1710 {
1711 WerrorS("ERROR, no such host");
1712 l->flags=0;
1713 l->data=NULL;
1714 omFreeSize(d,sizeof(ssiInfo));
1715 return TRUE;
1716 }
1717 memset((char *) &serv_addr, 0, sizeof(serv_addr));
1718 serv_addr.sin_family = AF_INET;
1719 memcpy((char *)&serv_addr.sin_addr.s_addr,
1720 (char *)server->h_addr,
1721 server->h_length);
1722 serv_addr.sin_port = htons(portno);
1723 if (si_connect(sockfd,(sockaddr*)&serv_addr,sizeof(serv_addr)) < 0)
1724 {
1725 Werror("ERROR connecting(errno=%d)",errno);
1726 l->flags=0;
1727 l->data=NULL;
1728 omFreeSize(d,sizeof(ssiInfo));
1729 return TRUE;
1730 }
1731 //PrintS("connected\n");mflush();
1732 d->f_read=s_open(sockfd);
1733 d->fd_read=sockfd;
1734 d->f_write=fdopen(sockfd,"w");
1735 d->fd_write=sockfd;
1737 omFree(host);
1738 }
1739 else
1740 {
1741 l->data=NULL;
1742 l->flags=0;
1743 omFreeSize(d,sizeof(ssiInfo));
1744 return TRUE;
1745 }
1746 }
1747 // ======================================================================
1748 else
1749 {
1750 // normal link to a file
1751 if (FE_OPT_NO_SHELL_FLAG) {WerrorS("no links allowed");return TRUE;}
1752 FILE *outfile;
1753 char *filename=l->name;
1754
1755 if(filename[0]=='>')
1756 {
1757 if (filename[1]=='>')
1758 {
1759 filename+=2;
1760 mode = "a";
1761 }
1762 else
1763 {
1764 filename++;
1765 mode="w";
1766 }
1767 }
1768 outfile=myfopen(filename,mode);
1769 if (outfile!=NULL)
1770 {
1771 if (strcmp(l->mode,"r")==0)
1772 {
1773 fclose(outfile);
1774 d->f_read=s_open_by_name(filename);
1775 }
1776 else
1777 {
1778 d->f_write = outfile;
1779 fprintf(d->f_write,"98 %d %d %u %u\n",SSI_VERSION,MAX_TOK,si_opt_1,si_opt_2);
1780 }
1781 }
1782 else
1783 {
1784 omFree(d);
1785 l->data=NULL;
1786 l->flags=0;
1787 return TRUE;
1788 }
1789 }
1790 }
1791 }
1792
1793 return FALSE;
1794}
Definition idrec.h:35
Class used for (list of) interpreter objects.
Definition subexpr.h:83
int rtyp
Definition subexpr.h:91
void * data
Definition subexpr.h:88
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
#define Print
Definition emacs.cc:80
#define Warn
Definition emacs.cc:77
#define WarnS
Definition emacs.cc:78
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
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
EXTERN_VAR omBin sleftv_bin
Definition ipid.h:145
STATIC_VAR Poly * h
Definition janet.cc:971
void m2_end(int i)
Definition misc_ip.cc:1104
#define omAlloc(size)
#define omFree(addr)
#define omFreeBin(addr, bin)
#define omFreeBinAddr(addr)
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
void PrintS(const char *s)
Definition reporter.cc:288
VAR char * feErrors
Definition reporter.cc:47
#define mflush()
Definition reporter.h:58
idrec * idhdl
Definition ring.h:22
int raise_rlimit_nproc()
Definition rlimit.c:18
s_buff s_open_by_name(const char *n)
Definition s_buff.cc:40
pid_t pid
Definition s_buff.h:25
char send_quit_at_exit
Definition s_buff.h:28
VAR int sem_acquired[SIPC_MAX_SEMAPHORES]
Definition semaphore.c:25
#define SIPC_MAX_SEMAPHORES
Definition simpleipc.h:10
#define IDHDL
Definition tok.h:31
@ MAX_TOK
Definition tok.h:220

◆ ssiRead1()

leftv ssiRead1 ( si_link  l)

Definition at line 1907 of file ssiLink.cc.

1908{
1909 ssiInfo *d = (ssiInfo *)l->data;
1911 int t=0;
1912 t=s_readint(d->f_read);
1913 //Print("got type %d\n",t);
1914 switch(t)
1915 {
1916 case 1:res->rtyp=INT_CMD;
1917 res->data=(char *)(long)ssiReadInt(d);
1918 //Print("int: %d\n",(int)(long)res->data);
1919 break;
1920 case 2:res->rtyp=STRING_CMD;
1921 res->data=(char *)ssiReadString(d);
1922 //Print("str: %s\n",(char*)res->data);
1923 break;
1924 case 3:res->rtyp=NUMBER_CMD;
1925 if (d->r==NULL) goto no_ring;
1926 ssiCheckCurrRing(d->r);
1927 res->data=(char *)ssiReadNumber(d);
1928 //Print("number\n");
1929 break;
1930 case 4:res->rtyp=BIGINT_CMD;
1931 res->data=(char *)ssiReadBigInt(d);
1932 //Print("bigint\n");
1933 break;
1934 case 15:
1935 case 5:{
1936 //Print("ring %d\n",t);
1937 d->r=ssiReadRing(d);
1938 if (errorreported) return NULL;
1939 res->data=(char*)d->r;
1940 if (d->r!=NULL) rIncRefCnt(d->r);
1941 res->rtyp=RING_CMD;
1942 if (t==15) // setring
1943 {
1944 if(ssiSetCurrRing(d->r)) { d->r=currRing; }
1946 return ssiRead1(l);
1947 }
1948 }
1949 break;
1950 case 6:res->rtyp=POLY_CMD;
1951 //Print("poly\n");
1952 if (d->r==NULL) goto no_ring;
1953 ssiCheckCurrRing(d->r);
1954 res->data=(char*)ssiReadPoly(d);
1955 break;
1956 case 7:res->rtyp=IDEAL_CMD;
1957 //Print("ideal\n");
1958 if (d->r==NULL) goto no_ring;
1959 ssiCheckCurrRing(d->r);
1960 res->data=(char*)ssiReadIdeal(d);
1961 break;
1962 case 8:res->rtyp=MATRIX_CMD;
1963 //Print("matrix\n");
1964 if (d->r==NULL) goto no_ring;
1965 ssiCheckCurrRing(d->r);
1966 res->data=(char*)ssiReadMatrix(d);
1967 break;
1968 case 9:res->rtyp=VECTOR_CMD;
1969 //Print("vector\n");
1970 if (d->r==NULL) goto no_ring;
1971 ssiCheckCurrRing(d->r);
1972 res->data=(char*)ssiReadPoly(d);
1973 break;
1974 case 10:
1975 case 22:if (t==22) res->rtyp=SMATRIX_CMD;
1976 else res->rtyp=MODUL_CMD;
1977 //Print("module/smatrix %d\n",t);
1978 if (d->r==NULL) goto no_ring;
1979 ssiCheckCurrRing(d->r);
1980 {
1981 int rk=s_readint(d->f_read);
1982 ideal M=ssiReadIdeal(d);
1983 M->rank=rk;
1984 res->data=(char*)M;
1985 }
1986 break;
1987 case 11:
1988 {
1989 //Print("cmd\n",t);
1990 res->rtyp=COMMAND;
1991 res->data=ssiReadCommand(l);
1992 int nok=res->Eval();
1993 if (nok) WerrorS("error in eval");
1994 break;
1995 }
1996 case 12: /*DEF_CMD*/
1997 {
1998 //Print("def\n",t);
1999 res->rtyp=0;
2000 res->name=(char *)ssiReadString(d);
2001 int nok=res->Eval();
2002 if (nok) WerrorS("error in name lookup");
2003 break;
2004 }
2005 case 13: res->rtyp=PROC_CMD;
2006 res->data=ssiReadProc(d);
2007 break;
2008 case 14: res->rtyp=LIST_CMD;
2009 res->data=ssiReadList(l);
2010 break;
2011 case 16: res->rtyp=NONE; res->data=NULL;
2012 break;
2013 case 17: res->rtyp=INTVEC_CMD;
2014 res->data=ssiReadIntvec(d);
2015 break;
2016 case 18: res->rtyp=INTMAT_CMD;
2017 res->data=ssiReadIntmat(d);
2018 break;
2019 case 19: res->rtyp=BIGINTMAT_CMD;
2020 res->data=ssiReadBigintmat(d);
2021 break;
2022 case 20: ssiReadBlackbox(res,l);
2023 break;
2024 case 21: ssiReadAttrib(res,l);
2025 break;
2026 case 23: ssiReadRingProperties(l);
2027 return ssiRead1(l);
2028 break;
2029 case 24: res->rtyp=BIGINTVEC_CMD;
2030 res->data=ssiReadBigintvec(d);
2031 break;
2032 // ------------
2033 case 98: // version
2034 {
2035 int n98_v,n98_m;
2037 n98_v=s_readint(d->f_read);
2038 n98_m=s_readint(d->f_read);
2039 n98_o1=s_readint(d->f_read);
2040 n98_o2=s_readint(d->f_read);
2041 if ((n98_v!=SSI_VERSION) ||(n98_m!=MAX_TOK))
2042 {
2043 Print("incompatible versions of ssi: %d/%d vs %d/%d\n",
2045 }
2046 #ifndef SING_NDEBUG
2047 if (TEST_OPT_DEBUG)
2048 Print("// opening ssi-%d, MAX_TOK=%d\n",n98_v,n98_m);
2049 #endif
2053 return ssiRead1(l);
2054 }
2055 case 99: omFreeBin(res,sleftv_bin); ssiClose(l); m2_end(-1);
2056 break; /*to make compiler happy*/
2057 case 0: if (s_iseof(d->f_read))
2058 {
2059 ssiClose(l);
2060 }
2061 res->rtyp=DEF_CMD;
2062 break;
2063 default: Werror("not implemented (t:%d)",t);
2065 res=NULL;
2066 break;
2067 }
2068 // if currRing is required for the result, but lost
2069 // define "ssiRing%d" as currRing:
2070 if ((d->r!=NULL)
2071 && (currRing!=d->r)
2072 && (res->RingDependend()))
2073 {
2074 if(ssiSetCurrRing(d->r)) { d->r=currRing; }
2075 }
2076 return res;
2077no_ring: WerrorS("no ring");
2079 return NULL;
2080}
#define BITSET
Definition auxiliary.h:85
CanonicalForm res
Definition facAbsFact.cc:60
VAR short errorreported
Definition feFopen.cc:23
@ IDEAL_CMD
Definition grammar.cc:285
@ MATRIX_CMD
Definition grammar.cc:287
@ 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
#define TEST_OPT_DEBUG
Definition options.h:110
VAR ring currRing
Widely used global variable which specifies the current polynomial ring for Singular interpreter and ...
Definition polys.cc:13
static ring rIncRefCnt(ring r)
Definition ring.h:849
int s_readint(s_buff F)
Definition s_buff.cc:113
#define M
Definition sirandom.c:25
sleftv * leftv
Definition structs.h:53
@ BIGINT_CMD
Definition tok.h:38
@ LIST_CMD
Definition tok.h:118
@ INTVEC_CMD
Definition tok.h:101
@ DEF_CMD
Definition tok.h:58
@ STRING_CMD
Definition tok.h:187
@ INT_CMD
Definition tok.h:96
#define NONE
Definition tok.h:223
#define COMMAND
Definition tok.h:29

◆ ssiRead1_S()

leftv ssiRead1_S ( char **  s,
const ring  R 
)

Definition at line 2081 of file ssiLink.cc.

2082{
2084 int t=0;
2085 t=s_readint_S(s);
2086 switch(t)
2087 {
2088 case 1:res->rtyp=INT_CMD;
2089 res->data=(char *)(long)ssiReadInt_S(s);
2090 break;
2091 case 2:res->rtyp=STRING_CMD;
2092 res->data=(char *)ssiReadString_S(s);
2093 break;
2094 case 3:res->rtyp=NUMBER_CMD;
2095 res->data=(char *)ssiReadNumber_CF_S(s,R->cf);
2096 break;
2097 case 4:res->rtyp=BIGINT_CMD;
2098 res->data=(char *)ssiReadBigInt_S(s);
2099 //Print("bigint\n");
2100 break;
2101 #if 0
2102 case 15:
2103 case 5:{
2104 //Print("ring %d\n",t);
2105 d->r=ssiReadRing(d);
2106 if (errorreported) return NULL;
2107 res->data=(char*)d->r;
2108 if (d->r!=NULL) rIncRefCnt(d->r);
2109 res->rtyp=RING_CMD;
2110 if (t==15) // setring
2111 {
2112 if(ssiSetCurrRing(d->r)) { d->r=currRing; }
2114 return ssiRead1(l);
2115 }
2116 }
2117 break;
2118 #endif
2119 case 6:res->rtyp=POLY_CMD;
2120 res->data=(char*)ssiReadPoly_R_S(s,R);
2121 break;
2122 case 7:res->rtyp=IDEAL_CMD;
2123 res->data=(char*)ssiReadIdeal_R_S(s,R);
2124 break;
2125 case 8:res->rtyp=MATRIX_CMD;
2126 res->data=(char*)ssiReadMatrix_R_S(s,R);
2127 break;
2128 case 9:res->rtyp=VECTOR_CMD;
2129 res->data=(char*)ssiReadPoly_R_S(s,R);
2130 break;
2131 case 10:
2132 case 22:if (t==22) res->rtyp=SMATRIX_CMD;
2133 else res->rtyp=MODUL_CMD;
2134 {
2135 int rk=s_readint_S(s);
2137 M->rank=rk;
2138 res->data=(char*)M;
2139 }
2140 break;
2141 #if 0
2142 case 11:
2143 {
2144 res->rtyp=COMMAND;
2145 res->data=ssiReadCommand(l);
2146 int nok=res->Eval();
2147 if (nok) WerrorS("error in eval");
2148 break;
2149 }
2150 #endif
2151 case 12: /*DEF_CMD*/
2152 {
2153 res->rtyp=0;
2154 res->name=(char *)ssiReadString_S(s);
2155 int nok=res->Eval();
2156 if (nok) WerrorS("error in name lookup");
2157 break;
2158 }
2159 case 13: res->rtyp=PROC_CMD;
2160 res->data=ssiReadProc_S(s);
2161 break;
2162 case 14: res->rtyp=LIST_CMD;
2163 res->data=ssiReadList_S(s,R);
2164 break;
2165 case 16: res->rtyp=NONE; res->data=NULL;
2166 break;
2167 case 17: res->rtyp=INTVEC_CMD;
2168 res->data=ssiReadIntvec_S(s);
2169 break;
2170 case 18: res->rtyp=INTMAT_CMD;
2171 res->data=ssiReadIntmat_S(s);
2172 break;
2173 case 19: res->rtyp=BIGINTMAT_CMD;
2174 res->data=ssiReadBigintmat_S(s);
2175 break;
2176 #if 0
2177 case 20: ssiReadBlackbox(res,l);
2178 break;
2179 case 21: ssiReadAttrib(res,l);
2180 break;
2181 case 23: ssiReadRingProperties(l);
2182 return ssiRead1(l);
2183 break;
2184 #endif
2185 case 24: res->rtyp=BIGINTVEC_CMD;
2186 res->data=ssiReadBigintvec_S(s);
2187 break;
2188 // ------------
2189 case 98: // version
2190 {
2191 int n98_v,n98_m;
2197 Print("// version ssi-%d, MAX_TOK=%d\n",n98_v,n98_m);
2201 return ssiRead1_S(s,R);
2202 }
2203 #if 0
2204 case 99: omFreeBin(res,sleftv_bin); ssiClose(l); m2_end(-1);
2205 break; /*to make compiler happy*/
2206 #endif
2207 case 0: res->rtyp=DEF_CMD;
2208 **s='\0'; /* unkown char?*/
2209 break;
2210 default: Werror("not implemented (t:%d)",t);
2212 res=NULL;
2213 break;
2214 }
2215 while((**s!='\0') &&(**s<=' ')) (*s)++;
2216 if (**s>' ') res->next=ssiRead1_S(s,R);
2217 return res;
2218}
int s_readint_S(char **s)
Definition s_buff.cc:141
#define R
Definition sirandom.c:27

◆ ssiRead2()

leftv ssiRead2 ( si_link  l,
leftv  key 
)

Definition at line 3192 of file ssiLink.cc.

3193{
3194 if((strcmp(l->mode,"string")==0)
3195 &&(u->Typ()==STRING_CMD))
3196 {
3197 char *s=(char*)u->Data();
3198 return ssiRead1_S(&s,currRing);
3199 }
3200 return NULL;
3201}

◆ ssiReadIdeal()

ideal ssiReadIdeal ( ssiInfo d)

Definition at line 1017 of file ssiLink.cc.

1018{
1019 return ssiReadIdeal_R(d,d->r);
1020}
ring r
Definition s_buff.h:24

◆ ssiReadIdeal_S()

ideal ssiReadIdeal_S ( char s,
const ring  R 
)

Definition at line 1022 of file ssiLink.cc.

1023{
1024 return ssiReadIdeal_R_S(&s,R);
1025}

◆ ssiReadInt()

int ssiReadInt ( const ssiInfo d)

Definition at line 666 of file ssiLink.cc.

667{
668 return s_readint(d->f_read);
669}

◆ ssiReadMatrix_S()

matrix ssiReadMatrix_S ( char s,
const ring  R 
)

◆ ssiReadPoly_S()

poly ssiReadPoly_S ( char s,
const ring  r 
)

Definition at line 986 of file ssiLink.cc.

987{
988 return ssiReadPoly_R_S(&s,r);
989}

◆ ssiReservePort()

int ssiReservePort ( int  clients)

Definition at line 2862 of file ssiLink.cc.

2863{
2864 if (ssiReserved_P!=0)
2865 {
2866 WerrorS("ERROR already a reserved port requested");
2867 return 0;
2868 }
2869 int portno;
2871 if(ssiReserved_sockfd < 0)
2872 {
2873 WerrorS("ERROR opening socket");
2874 return 0;
2875 }
2876 memset((char *) &ssiResverd_serv_addr,0, sizeof(ssiResverd_serv_addr));
2877 portno = 1025;
2878 ssiResverd_serv_addr.sin_family = AF_INET;
2879 ssiResverd_serv_addr.sin_addr.s_addr = INADDR_ANY;
2880 do
2881 {
2882 portno++;
2883 ssiResverd_serv_addr.sin_port = htons(portno);
2884 if(portno > 50000)
2885 {
2886 WerrorS("ERROR on binding (no free port available?)");
2887 return 0;
2888 }
2889 }
2894 return portno;
2895}

◆ ssiWrite()

BOOLEAN ssiWrite ( si_link  l,
leftv  v 
)

Definition at line 2239 of file ssiLink.cc.

2240{
2241 if(SI_LINK_W_OPEN_P(l)==0)
2243 if (strcmp(l->mode,"string")==0) return TRUE;
2244 ssiInfo *d = (ssiInfo *)l->data;
2245 d->level++;
2246 //FILE *fich=d->f;
2247 while (data!=NULL)
2248 {
2249 int tt=data->Typ();
2250 void *dd=data->Data();
2251 attr *aa=data->Attribute();
2252 if ((aa!=NULL) && ((*aa)!=NULL)) // n user attributes
2253 {
2254 attr a=*aa;
2255 int n=0;
2256 while(a!=NULL) { n++; a=a->next;}
2257 fprintf(d->f_write,"21 %d %d ",data->flag,n);
2258 }
2259 else if (data->flag!=0) // only "flag" attributes
2260 {
2261 fprintf(d->f_write,"21 %d 0 ",data->flag);
2262 }
2263 if ((dd==NULL) && (data->name!=NULL) && (tt==0)) tt=DEF_CMD;
2264 // return pure undefined names as def
2265
2266 switch(tt /*data->Typ()*/)
2267 {
2268 case 0: /*error*/
2269 case NONE/* nothing*/:fputs("16 ",d->f_write);
2270 break;
2271 case STRING_CMD: fputs("2 ",d->f_write);
2272 ssiWriteString(d,(char *)dd);
2273 break;
2274 case INT_CMD: fputs("1 ",d->f_write);
2275 ssiWriteInt(d,(int)(long)dd);
2276 break;
2277 case BIGINT_CMD:fputs("4 ",d->f_write);
2279 break;
2280 case NUMBER_CMD:
2281 if (d->r!=currRing)
2282 {
2283 fputs("15 ",d->f_write);
2285 if (d->level<=1) fputc('\n',d->f_write);
2286 }
2287 fputs("3 ",d->f_write);
2289 break;
2290 case RING_CMD:fputs("5 ",d->f_write);
2291 ssiWriteRing(d,(ring)dd);
2292 break;
2293 case BUCKET_CMD:
2294 {
2296 if (d->r!=sBucketGetRing(b))
2297 {
2298 fputs("15 ",d->f_write);
2300 if (d->level<=1) fputc('\n',d->f_write);
2301 }
2302 fputs("6 ",d->f_write);
2304 break;
2305 }
2306 case POLY_CMD:
2307 case VECTOR_CMD:
2308 if (d->r!=currRing)
2309 {
2310 fputs("15 ",d->f_write);
2312 if (d->level<=1) fputc('\n',d->f_write);
2313 }
2314 if(tt==POLY_CMD) fputs("6 ",d->f_write);
2315 else fputs("9 ",d->f_write);
2316 ssiWritePoly(d,(poly)dd);
2317 break;
2318 case IDEAL_CMD:
2319 case MODUL_CMD:
2320 case MATRIX_CMD:
2321 case SMATRIX_CMD:
2322 if (d->r!=currRing)
2323 {
2324 fputs("15 ",d->f_write);
2326 if (d->level<=1) fputc('\n',d->f_write);
2327 }
2328 if(tt==IDEAL_CMD) fputs("7 ",d->f_write);
2329 else if(tt==MATRIX_CMD) fputs("8 ",d->f_write);
2330 else /* tt==MODUL_CMD, SMATRIX_CMD*/
2331 {
2332 ideal M=(ideal)dd;
2333 if (tt==MODUL_CMD)
2334 fprintf(d->f_write,"10 %d ",(int)M->rank);
2335 else /*(tt==SMATRIX_CMD)*/
2336 fprintf(d->f_write,"22 %d ",(int)M->rank);
2337 }
2339 break;
2340 case COMMAND:
2341 fputs("11 ",d->f_write);
2343 break;
2344 case DEF_CMD: /* not evaluated stuff in quotes */
2345 fputs("12 ",d->f_write);
2346 ssiWriteString(d,data->Name());
2347 break;
2348 case PROC_CMD:
2349 fputs("13 ",d->f_write);
2351 break;
2352 case LIST_CMD:
2353 fputs("14 ",d->f_write);
2355 break;
2356 case INTVEC_CMD:
2357 fputs("17 ",d->f_write);
2358 ssiWriteIntvec(d,(intvec *)dd);
2359 break;
2360 case INTMAT_CMD:
2361 fputs("18 ",d->f_write);
2362 ssiWriteIntmat(d,(intvec *)dd);
2363 break;
2364 case BIGINTMAT_CMD:
2365 fputs("19 ",d->f_write);
2367 break;
2368 case BIGINTVEC_CMD:
2369 fputs("24 ",d->f_write);
2371 break;
2372 default:
2373 if (tt>MAX_TOK)
2374 {
2376 fputs("20 ",d->f_write);
2377 b->blackbox_serialize(b,dd,l);
2378 }
2379 else
2380 {
2381 Werror("not implemented (t:%d, rtyp:%d)",tt, data->rtyp);
2382 d->level=0;
2383 return TRUE;
2384 }
2385 break;
2386 }
2387 if (d->level<=1) { fputc('\n',d->f_write); fflush(d->f_write); }
2388 data=data->next;
2389 }
2390 d->level--;
2391 return FALSE;
2392}
blackbox * getBlackboxStuff(const int t)
return the structure to the type given by t
Definition blackbox.cc:17
CanonicalForm b
Definition cfModGcd.cc:4111
Matrices of numbers.
Definition bigintmat.h:51
Definition attrib.h:21
attr next
Definition attrib.h:26
Definition lists.h:24
@ BUCKET_CMD
Definition grammar.cc:284
ip_command * command
Definition ipid.h:23
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

◆ ssiWrite2()

BOOLEAN ssiWrite2 ( si_link  l,
leftv  res,
leftv  v 
)

Definition at line 3179 of file ssiLink.cc.

3180{
3181 if((strcmp(l->mode,"string")==0)
3182 &&(u->Typ()==STRING_CMD))
3183 {
3184 StringSetS("");
3185 ssiWrite_S(u, currRing);
3186 res->data=(void*)StringEndS();
3187 res->rtyp=STRING_CMD;
3188 return res->data==NULL;
3189 }
3190 return TRUE;
3191}
void StringSetS(const char *st)
Definition reporter.cc:128
char * StringEndS()
Definition reporter.cc:151

◆ ssiWrite_S()

void ssiWrite_S ( leftv  v,
const ring  R 
)

Definition at line 2393 of file ssiLink.cc.

2394{
2395 while(data!=NULL)
2396 {
2397 int tt=data->Typ();
2398 void *dd=data->Data();
2399 switch(tt /*data->Typ()*/)
2400 {
2401 case 0: /*error*/
2402 case NONE/* nothing*/:StringAppendS("16 ");
2403 break;
2404 case INT_CMD: StringAppendS("1 ");
2405 ssiWriteInt_S((int)(long)dd);
2406 break;
2407 case STRING_CMD: StringAppendS("2 ");
2408 ssiWriteString_S((char *)dd);
2409 break;
2410 case BIGINT_CMD:StringAppendS("4 ");
2412 break;
2413 case NUMBER_CMD:
2414 StringAppendS("3 ");
2416 break;
2417 #if 0
2418 case RING_CMD:fputs("5 ",d->f_write);
2419 ssiWriteRing(d,(ring)dd);
2420 break;
2421 #endif
2422 case BUCKET_CMD:
2423 {
2425 StringAppendS("6 ");
2427 break;
2428 }
2429 case POLY_CMD:
2430 case VECTOR_CMD:
2431 if(tt==POLY_CMD) StringAppendS("6 ");
2432 else StringAppendS("9 ");
2433 ssiWritePoly_R_S((poly)dd,R);
2434 break;
2435 case IDEAL_CMD:
2436 case MODUL_CMD:
2437 case MATRIX_CMD:
2438 case SMATRIX_CMD:
2439 if(tt==IDEAL_CMD) StringAppendS("7 ");
2440 else if(tt==MATRIX_CMD) StringAppendS("8 ");
2441 else /* tt==MODUL_CMD, SMATRIX_CMD*/
2442 {
2443 ideal M=(ideal)dd;
2444 if (tt==MODUL_CMD)
2445 {
2446 StringAppendS("10 ");StringAppend("%d ",(int)M->rank);
2447 }
2448 else /*(tt==SMATRIX_CMD)*/
2449 {
2450 StringAppendS("22 ");StringAppend("%d ",(int)M->rank);
2451 }
2452 }
2454 break;
2455 #if 0
2456 case COMMAND:
2457 fputs("11 ",d->f_write);
2459 break;
2460 #endif
2461 case DEF_CMD: /* not evaluated stuff in quotes */
2462 StringAppendS("12 ");
2463 ssiWriteString_S(data->Name());
2464 break;
2465 case PROC_CMD:
2466 StringAppendS("13 ");
2468 break;
2469 case LIST_CMD:
2470 StringAppendS("14 ");
2472 break;
2473 case INTVEC_CMD:
2474 StringAppendS("17 ");
2476 break;
2477 case INTMAT_CMD:
2478 StringAppendS("18 ");
2480 break;
2481 case BIGINTMAT_CMD:
2482 StringAppendS("19 ");
2484 break;
2485 case BIGINTVEC_CMD:
2486 StringAppendS("24 ");
2488 break;
2489 default:
2490 #if 0
2491 if (tt>MAX_TOK)
2492 {
2494 fputs("20 ",d->f_write);
2495 b->blackbox_serialize(b,dd,l);
2496 }
2497 else
2498 #endif
2499 {
2500 Werror("not implemented (t:%d, rtyp:%d)",tt, data->rtyp);
2501 return;
2502 }
2503 break;
2504 }
2505 data=data->next;
2506 }
2507}
#define StringAppend
Definition emacs.cc:79
void StringAppendS(const char *st)
Definition reporter.cc:107

◆ ssiWriteIdeal()

void ssiWriteIdeal ( const ssiInfo d,
int  typ,
const ideal  I 
)

Definition at line 491 of file ssiLink.cc.

492{
493 ssiWriteIdeal_R(d,typ,I,d->r);
494}

◆ ssiWriteIdeal_S()

char * ssiWriteIdeal_S ( const ideal  I,
const ring  R 
)

Definition at line 495 of file ssiLink.cc.

496{
497 StringSetS("");
499 return StringEndS();
500}

◆ ssiWriteInt()

void ssiWriteInt ( const ssiInfo d,
const int  i 
)

Definition at line 156 of file ssiLink.cc.

157{
158 fprintf(d->f_write,"%d ",i);
159}

◆ ssiWriteMatrix_S()

char * ssiWriteMatrix_S ( const matrix  M,
const ring  R 
)

Definition at line 501 of file ssiLink.cc.

502{
503 StringSetS("");
505 return StringEndS();
506}

◆ ssiWriteModule_S()

char * ssiWriteModule_S ( const ideal  M,
const ring  R 
)

Definition at line 507 of file ssiLink.cc.

508{
509 StringSetS("");
511 return StringEndS();
512}

◆ ssiWritePoly_S()

char * ssiWritePoly_S ( poly  p,
const ring  r 
)

Definition at line 439 of file ssiLink.cc.

440{
441 StringSetS("");
443 return StringEndS();
444}
int p
Definition cfModGcd.cc:4086