Beispiel #1
0
void squeeze2(char s[],char c[]){
   int i,j;
   for(i = j = 0;s[i]!='\0';i++){
       if(strcon(c,s[i]) != 1)
		   s[j++] = s[i];
   }
   s[j] = '\0';
}
Beispiel #2
0
 static bool wrusid(pm_ptr symla)

/*      Analyserar om en identifierare innebär en referens
 *      till reftab.
 *
 *      In: symla  => Identifierarens symboltabellpekare.
 *
 *      Ut: Inget.
 *
 *      FV: TRUE  = Referens.
 *          FALSE = Ej referens.
 *
 *      (C)microform ab 6/5/92 J. Kjellander
 *
 *********************************************************!*/

 {
   int     i;          /* Loop-räknare */
   stidcl  idclass;    /* identifier class */
   string  symname;    /* string for symbol name */
   STCONST konst;      /* st structure for a constant */
   STTYTBL typ;        /* MBS-type definition structure */

/*
***Läs attribut från symboltabell.
*/
   stratt(symla,&idclass,&symname);
/*
***Vilken typa av symbol är det ?
*/
   switch ( idclass )
     {
/*
***Konstant.
*/
     case ST_CONST:
     strcon(symla,&konst);
     strtyp(konst.type_co,&typ);

     if ( typ.kind_ty == ST_REF )
       {
       for ( i=0; i<refant; ++i )
         {
         if ( konst.valu_co.lit.ref_va[0].seq_val == reftab[i].snr )
           return(TRUE);
         }
       return(FALSE);
       }
     break;
/*
***Övriga.
*/
     default:
     return(FALSE);
     }
   return(FALSE);
 } 
Beispiel #3
0
void angprc(
    pm_ptr  *rptr,
    ANFSET  *follow)

/*      Analyse geometric procedure call.
 *
 *      geo_proc_call ::= identifier '(' parameter list Ä namned_params Å ')'
 *
 *      In:   *follow  =>  Follower set.
 *
 *      Out:  *rptr    =>  Pointer to procedure call.
 *
 *      (C)microform ab 1985-09-23 Mats Nelson
 *
 *      1999-04-26 Rewritten, R. Svedin
 *
 ******************************************************!*/

{
    char pronam[ANSYNLEN+1];        /* local proc. name copy */
    ANATTR a_attrs[ANPARMAX];       /* parameter actual attributes */
    ANATTR dumatt;                  /* dummy attribute */
    ANATTR pnatt;                   /* Part-namn attribut */
    short acount = 0;               /* parameter actual count */
    char prtnam[ANSYNLEN+1];        /* module name if part procedure */
    char *pnamptr=NULL;             /* ptr to part nam if VPART */
    pmseqn  seqnum=0;               /* sequence number */
    pm_ptr mlptr = (pm_ptr)NULL;    /* PM_pointer to module params. if part */
    pm_ptr lrptr = (pm_ptr)NULL;    /* PM-pointer to actual parameter list */
    pm_ptr nlptr = (pm_ptr)NULL;    /* PM-pointer to named parameter list */
    short prolin,procol;            /* procedure source position */
    short namlin,namcol;            /* part name source position */
    ANFSET locfol1;                 /* local follow set */
    ANFSET locfol2;                 /* local follow set */
    ANFSET pnfoll;                  /* Follow-set för part-namn */
    stidcl st_typ,id_typ;           /* identifier type */
    pm_ptr proptr,idptr;            /* ST procedure entry point */
    pm_ptr funtyp;                  /* PM-pekare till funktionstyp */
    pmvaty valtyp;                  /* Typ av funktion */
    short  dummy;                   /* Används ej */
    STPROC pattr,func;              /* ST-data om rutin proc/func */
    STVAR  var;                     /* ST-data om en variabel */
    STCONST konst;                  /* ST-data om en konstant */
    STTYTBL type;                   /* Typ-info */
    pm_ptr pnexpr;                  /* Pekare till part-namnsuttryck */
    char eristr[32];                /* error insert string */
    char tstr1[32],tstr2[32];       /* insert-strängar */
    short i;                        /* loop */
    short pcount = 1;               /* number of parameters outside list */
    bool  exprfl = FALSE;           /* Part-namn har getts som expression */
    /*
    ***Save procedure name
    */
    strcpy(pronam,sy.syval.name);
    /*
    ***Create local followset
    */
    ancset(&locfol1,follow,1,ANSYRPAR,0,0,0,0,0,0,0);
    ancset(&locfol2,follow,3,ANSYRPAR,ANSYCOL,ANSYCOM,0,0,0,0,0);
    /*
    ***Set ST-info on procedure
    */
    stlook(sy.syval.name,&st_typ,&proptr);
    strrou(proptr,&pattr);
    /*
    ***Save procedure source position for error messages
    */
    prolin=sy.sypos.srclin;
    procol=sy.sypos.srccol;
    /*
    ***Eat "("
    */
    anascan(&sy);
    if ( sy.sytype == ANSYLPAR )
        anascan(&sy);
    else
        anperr("AN9172","(",NULL,sy.sypos.srclin,sy.sypos.srccol);
    /*
    ***Eat reference
    */
    if ( sy.sytype == ANSYREFL )
    {
        seqnum = sy.syval.rval.seq_val;
        /*
        ***Global ref  or #0 not allowed here. 3/11-94 JK
        */
        if ( sy.syval.rval.seq_val < 0 )
            anperr("AN9452","",NULL,sy.sypos.srclin,sy.sypos.srccol);
        if ( sy.syval.rval.seq_val == 0 )
            anperr("AN9462","",NULL,sy.sypos.srclin,sy.sypos.srccol);
        if ( sy.syval.rval.ord_val != 0 )
            anperr("AN9392","",NULL,sy.sypos.srclin,sy.sypos.srccol);
        if ( seqnum >= 1  &&  anstyp == ANRDFIL )
            ancsnd(sy.sypos.srclin,sy.sypos.srccol,(short)seqnum);
        anascan(&sy);
    }
    else
        anperr("AN9122","",&locfol2,sy.sypos.srclin,sy.sypos.srccol);
    /*
    ***Kolla att nästa token är ett komma. Scanna inte igen dock eftersom
    ***detta skall göras olika för part och geometriprocedur.
    */
    if (sy.sytype != ANSYCOM )
        anperr("AN9172",",",NULL,sy.sypos.srclin,sy.sypos.srccol);
    /*
    ***Speciell hantering av PART. Titta på nästa token.
    */
    if ( pattr.kind_pr == VPART )
    {
        anascan(&sy);
        /*
        ***Nu gäller det att avgöra vilken av de två tillåtna formerna
        ***av part-anrop det handlar om. Om part-namnet inte kan anses
        ***vara en identifierare provar vi att tolka det som ett uttryck.
        */
        if ( sy.sytype != ANSYID ) exprfl = TRUE;
        /*
        ***Om det är en identifierare måste vi kolla vilken typ av identi-
        ***fierare det ät frågan om. Variabel, konstant och funktion av typen
        ***STRING implicerar att part-namnet skall parsas som ett uttryck.
        */
        else
        {
            stlook(sy.syval.name,&id_typ,&idptr);
            if ( idptr != (pm_ptr)NULL )
            {
                switch ( id_typ )
                {
                case ST_VAR:
                    strvar(idptr,&var);
                    strtyp(var.type_va,&type);
                    if ( type.kind_ty == ST_STR ) exprfl = TRUE;
                    break;

                case ST_CONST:
                    strcon(idptr,&konst);
                    strtyp(konst.type_co,&type);
                    if ( type.kind_ty == ST_STR ) exprfl = TRUE;
                    break;

                case ST_FUNC:
                    strrou(idptr,&func);
                    stsrou(func.kind_pr);
                    stgret(&funtyp,&valtyp,&dummy);
                    if ( valtyp == C_STR_VA ) exprfl = TRUE;
                    break;
                }
            }
        }
        /*
        ***Om exprfl är TRUE skall vi tolka partnamnet som ett uttryck.
        ***anarex börjar då med sist scannade token och slutar med 1:a
        ***icke godkända. Detta skall vara ett kommatecken.
        */
        if ( exprfl )
        {
            namlin = sy.sypos.srclin;
            namcol = sy.sypos.srccol;
            ancset(&pnfoll,follow,1,ANSYCOM,0,0,0,0,0,0,0);
            anarex(&pnexpr,&pnatt,&pnfoll);
            if ( sy.sytype != ANSYCOM )
                anperr("AN2282","",NULL,sy.sypos.srclin,sy.sypos.srccol);
            pnamptr = NULL;
            /*
            ***Kolla uttryckets typ.
            */
            if ( !aneqty(pnatt.type,ststrp) )
            {
                angtps(pnatt.type,tstr1);
                angtps(ststrp,tstr2);
                sprintf(eristr,"%s\004%s",tstr2,tstr1);
                anperr("AN9292",eristr,NULL,namlin,namcol);
            }
        }
        /*
        ***Annars tolkar vi det som vi alltid gjorde före version 1.12.
        */
        else
        {
            strcpy(prtnam,sy.syval.name);
            pnamptr = prtnam;
            pnexpr = (pm_ptr)NULL;
        }
        /*
        ***Parameterlistans vänster-parentes.
        */
        anascan(&sy);
        if ( sy.sytype == ANSYLPAR )
            anascan(&sy);
        else
            anperr("AN9172","(",NULL,sy.sypos.srclin,sy.sypos.srccol);
        /*
        ***Den anropade partens parameterlista.
        */
        anparl(&mlptr,a_attrs,&i,&locfol1);
        /*
        ***Parameterlistans högerparentes.
        */
        if ( sy.sytype == ANSYRPAR )
            anascan(&sy);
        else
            anperr("AN9172",")",NULL,sy.sypos.srclin,sy.sypos.srccol);
        /*
        ***Kanske finns ett kommatecken och en REF till lokalt koordinatsystem.
        */
        if ( sy.sytype == ANSYCOM)
            /*
            *** "," found, continue with the parameter list
            */
            anascan(&sy);
        else
            /*
            *** no "," found, assume : no more parameters
            */
            goto lab1;
    }
    /*
    ***S**t part. Om det är en vanlig geometri-procedur scannar vi
    ***vidare som vanligt.
    */
    else anascan(&sy);
    /*
    ***Analyse the parameter list
    */
    anparl(&lrptr,a_attrs,&acount,&locfol2);
    /*
    ***Analyse named parameters (if any)
    */
lab1:
    if ( sy.sytype == ANSYCOL )
    {
        anascan(&sy);
        annaml(&nlptr,&locfol1,pattr.kind_pr);
    }
    /*
    ***Eat ")"
    */
    if ( sy.sytype == ANSYRPAR )
        anascan(&sy);
    else
        anperr("AN9172",")",NULL,sy.sypos.srclin,sy.sypos.srccol);
    /*
    ***Check parameter list
    */
    ancpar(a_attrs,acount,proptr,prolin,procol,pcount,&dumatt);
    /*
    ***Skapa PM-träd. Om det är ett part-anrop skickar vi fr.o.m.
    ***version 1.12 med både pekare till namn-sträng och pekare till
    ***namnuttryck, pnamptr och pnexpr.
    */
    if ( pattr.kind_pr == VPART )
        pmcpas(seqnum,pnamptr,pnexpr,mlptr,lrptr,nlptr,rptr);
    /*
    ***Om det är en vanlig geometriprocedur gör vi som vanligt.
    */
    else pmcges(proptr,seqnum,lrptr,nlptr,rptr);
    /*
    ***S**t.
    */
    return;
}