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'; }
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); }
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; }