Changeset 56aaae in git for Singular/links/ssiLink.cc


Ignore:
Timestamp:
Oct 28, 2013, 3:39:36 PM (10 years ago)
Author:
Hans Schoenemann <hannes@…>
Branches:
(u'spielwiese', 'fe61d9c35bf7c61f2b6cbf1b56e25e2f08d536cc')
Children:
d302d07c56cde53a3680353cb3985baaa2572f53
Parents:
215353e5dbc6e1393f0f2107ee3615f129b47538
Message:
fix: handle undefined rings in ssi (from master)
File:
1 edited

Legend:

Unmodified
Added
Removed
  • Singular/links/ssiLink.cc

    r215353e r56aaae  
    154154    {
    155155      #if SIZEOF_LONG == 4
    156       fprintf(d->f_write,"4 %ld ",((LONG)SR_TO_INT(n)));
     156      fprintf(d->f_write,"4 %ld ",SR_TO_INT(n));
    157157      #else
    158158      long nn=SR_TO_INT(n);
     
    200200  if (d->r!=NULL) rKill(d->r);
    201201  d->r=r;
    202   d->r->ref++;
    203   fprintf(d->f_write,"%d %d ",n_GetChar(r->cf),r->N);
    204 
    205   int i;
    206   for(i=0;i<r->N;i++)
    207   {
    208     fprintf(d->f_write,"%d %s ",(int)strlen(r->names[i]),r->names[i]);
    209   }
    210   /* number of orderings:*/
    211   i=0;
    212   while (r->order[i]!=0) i++;
    213   fprintf(d->f_write,"%d ",i);
    214   /* each ordering block: */
    215   i=0;
    216   while(r->order[i]!=0)
    217   {
    218     fprintf(d->f_write,"%d %d %d ",r->order[i],r->block0[i], r->block1[i]);
    219     switch(r->order[i])
    220     {
    221       case ringorder_a:
    222       case ringorder_wp:
    223       case ringorder_Wp:
    224       case ringorder_ws:
    225       case ringorder_Ws:
    226       case ringorder_aa:
    227       {
    228         int ii;
    229         for(ii=r->block0[i];ii<=r->block1[i];ii++)
    230           fprintf(d->f_write,"%d ",r->wvhdl[i][ii-r->block0[i]]);
    231       }
    232       break;
    233 
    234       case ringorder_a64:
    235       case ringorder_M:
    236       case ringorder_L:
    237       case ringorder_IS:
    238         Werror("ring oder not implemented for ssi:%d",r->order[i]);
     202  if (r!=NULL)
     203  {
     204    /*d->*/r->ref++;
     205    fprintf(d->f_write,"%d %d ",n_GetChar(r->cf),r->N);
     206
     207    int i;
     208    for(i=0;i<r->N;i++)
     209    {
     210      fprintf(d->f_write,"%d %s ",(int)strlen(r->names[i]),r->names[i]);
     211    }
     212    /* number of orderings:*/
     213    i=0;
     214    // remember dummy ring: everything 0:
     215    if (r->order!=NULL) while (r->order[i]!=0) i++;
     216    fprintf(d->f_write,"%d ",i);
     217    /* each ordering block: */
     218    i=0;
     219    if (r->order!=NULL) while(r->order[i]!=0)
     220    {
     221      fprintf(d->f_write,"%d %d %d ",r->order[i],r->block0[i], r->block1[i]);
     222      switch(r->order[i])
     223      {
     224        case ringorder_a:
     225        case ringorder_wp:
     226        case ringorder_Wp:
     227        case ringorder_ws:
     228        case ringorder_Ws:
     229        case ringorder_aa:
     230        {
     231          int ii;
     232          for(ii=r->block0[i];ii<=r->block1[i];ii++)
     233            fprintf(d->f_write,"%d ",r->wvhdl[i][ii-r->block0[i]]);
     234        }
    239235        break;
    240236
    241       default: break;
    242     }
    243     i++;
     237        case ringorder_a64:
     238        case ringorder_M:
     239        case ringorder_L:
     240        case ringorder_IS:
     241          Werror("ring oder not implemented for ssi:%d",r->order[i]);
     242          break;
     243
     244        default: break;
     245      }
     246      i++;
     247    }
     248  }
     249  else /* dummy ring r==NULL*/
     250  {
     251    fprintf(d->f_write,"0 0 0 "/*,r->ch,r->N, blocks*/);
    244252  }
    245253}
     
    478486  ch=s_readint(d->f_read);
    479487  N=s_readint(d->f_read);
    480   names=(char**)omAlloc(N*sizeof(char*));
     488  names=(char**)omalloc(N*sizeof(char*));
    481489  for(i=0;i<N;i++)
    482490  {
     
    521529    }
    522530  }
     531  if (N==0)
     532  {
     533    omFree(ord);
     534    omFree(block0);
     535    omFree(block1);
     536    omFree(wvhdl);
     537    return NULL;
     538  }
     539  else return rDefault(ch,N,names,num_ord,ord,block0,block1,wvhdl);
     540
    523541  return rDefault(ch,N,names,num_ord,ord,block0,block1,wvhdl);
    524542}
     
    11801198    case 5:{
    11811199             d->r=ssiReadRing(d);
    1182              d->r->ref++;
    11831200             res->rtyp=RING_CMD;
    11841201             res->data=(char*)d->r;
    11851202             // we are in the top-level, so set the basering to d->r:
    1186              ssiSetCurrRing(d->r);
     1203             if (d->r!=NULL)
     1204             {
     1205               d->r->ref++;
     1206               ssiSetCurrRing(d->r);
     1207             }
    11871208             if (t==15) return ssiRead1(l);
    11881209           }
Note: See TracChangeset for help on using the changeset viewer.