






                      Implementering av nya MBS-rutiner


                         Steg- fr steg-beskrivning




1. Den nya rutinen skall ges ett symboliskt namn och en unik kod
i filen 'include/namecode.h'

s hr ser en bit av 'namcode.h' ut idag :

#define VROUND  40    /*               ROUND       */
#define VTRUNC  41    /*               TRUNC       */
/*---------------------------------------------------------------------------*/
#define VARCL   52    /* constant for  ARCL        */
#define VTANG   53    /*               TANG        */

efter tillgg av den tnkta funktionen strip() p ledig
plats (kod) :

#define VROUND  40    /*               ROUND       */
#define VTRUNC  41    /*               TRUNC       */
#define VSTRIP  42    /*               STRIP       */
/*---------------------------------------------------------------------------*/
#define VARCL   52    /* constant for  ARCL        */
#define VTANG   53    /*               TANG        */


2. Den nya rutinenens namn och andra data skall fras in i symbol-
   tabellen via include-filen 'pmpac/newrout.h'.

s hr ser den "tomma" 'newrout.h' ut :

"",            ST_UNDEF,   FALSE,   ST_ORD,   ST_UNDEF   /* obl. sista rad */

efter tillgg av funktionen strip() :

"STRIP",       ST_FUNC,    TRUE,    ST_ORD,   VSTRIP,
"",            ST_UNDEF,   FALSE,   ST_ORD,   ST_UNDEF   /* obl. sista rad */

- flt 1 : rutinens namn som c-str{ng

- flt 2 : vid funktion, ST_FUNC
           vid procedur, ST_PROC

- flt 3 : funktion som skall vara tillten i ett konstant-uttryck
           stts TRUE, annars (och normalt) FALSE. Om FALSE kommer
           analysatorn (v3c) att klaga om funktionen anvnds i sam-
           manhang dr ett konstantuttryck frv{ntas. T.ex. grnser
           vid arraydefinition och vrdetilldelning vid konstant-
           deklaration.

- flt 4 : vid geometreiprocedur, ST_GEO
           vid ordinr procedur, ST_ORD
           annars, ST_ORD

- flt 5 : rutinens symboliska namn (se 1.).

Obs! Det r endast tilltet att lgga till nya rader sist (dock
fre den obligatoriska sista raden) i listan.


3. Den nya rutinens formella parametrar skall beskrivas i filen 
'pmpac/formpar.h'. En formell parameterlista beskrivs av en strng
som r placerad i en tabell av strngar dr placeringen i tabellen
r densamma som rutinens nummer (se 1.). Tillgg kan gras i"hl"
mrkta "not defin" eller sist i tabellen.

Regler, konstruktion av en formell parameterbskrivnning :

En formell parameter beskrivs av tv bokstver. Den frsta anger
typen (integer, float etc.) och den andra klassen (expression,
variabel etc.).

typ-tecken:                                intern representation:
----------                                 ---------------------
  v ->  vektor                               stvecp          (enkla typer)
  f ->  float                                stflop
  i ->  integer                              stintp
  s ->  string                               ststrp
  r ->  reference                            strefp
  d ->  file ( device )                      stfilp
  a ->  anytype                               NULL
  j ->  4*4 float matrix                     st_j_p          (array typer)
  k ->  conformant j-array (se ovan)         st_k_p   (conformant = size *)
  l ->  conformant float-array               st_l_p
  m ->  conformant reference-array           st_m_p

klass-tecken:
------------ 
  e -> expression
  v -> variabel
  d -> default

ex. ie = integer expression, formell parameter.
    vd = vector default, formell parameter.
    vv = vector varaible, formell parameter.

Formella parameterar kan :

 -- konkateneras

    ex. ie.fe.fe   - integer expression fljd av float expression fljd
                     av float expression.

 -- repeteras

   ex. 25(ie)      - 0 eller max. 25 integer expressions. Parametrarna
                     sgs vara optionella. En repetition mste st sist
                     i en parameterstrng.

   ex. 2(ie.3(fe)) - Konkatenering och repetition kan nstlas fritt.

 -- ges defaultvrden

Optionella (se ovan) parametrar och parameterar med klassen default (d)
kan ges ett default-vrde i parameterbeskrivningen.

  ex. flyttal: 2(fe<3.34>)  - Defaultvrde: 3.34
      heltal:  1(ie<23>)    - Defaultvrde: 23
      vektor:  2(ve<1,2,3>) - Defaultvrde: vec(1,2,3)
      str{ng:  2(sd<ru>)    - Defaultvrde: "ru"
       
Defaultvrden kan endast ges vid ovan angivna datatyper.

Frutom parametrar skall info. om rutiners geometritillhrighet samt
returvrdets typ fr funktioner anges. Detta grs frst i strngen och
separeras mot sjlva parameterbeskrivningen med ett kolon ':'. Funk-
tionenes typ anges med de vanliga typbokstverna och geometritill-
hrigheten med en siffra s att :

  5 -> kan anvndas i bde 2D och 3D-geometri
  2 -> kan endast anvndas i 2D-geometri
  3 -> kan endast anvndas i 3D-geometri.

Fr procedurer anvnds '-' fr att ange den obefintliga returtypen.

Med dessa byggstenar kan nu hela parameterlistor fr funktioner och
procedurer beskrivas p ett kompakt och effektivt stt. Se befintliga
parameterbeskrivningar i formpar.h.

OBS!!! Av prestandaskl grs ingen som helst kontroll av en
parameterstrng. Alla ndringar och tillgg skall allts gras med
strsta frsiktighet och mste verifieras med testning.

en bit av 'formpar.h' :

"f5:fe",                 /* VFRAC   = 39, frac(<flo>) = <flo>                */
"i5:fe",                 /* VROUND  = 40, round(<flo>) = <int>               */
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
"i5:fe",                 /* VTRUNC  = 41, trunc(<flo>) = <int>               */
"",                      /*         = 42, not defin                          */
"",                      /*         = 43, not defin                          */

efter tillgg av strip() :

"f5:fe",                 /* VFRAC   = 39, frac(<flo>) = <flo>                */
"i5:fe",                 /* VROUND  = 40, round(<flo>) = <int>               */
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
"i5:fe",                 /* VTRUNC  = 41, trunc(<flo>) = <int>               */
"i5:fe.ie",              /* VSTRIP  = 42, strip(<flo>,<int>) = <int>         */
"",                      /*         = 43, not defin                          */


4.  Anrop av den nya rutinens access-funktion lggs till i en 
case-kratta i :

  - infunc.c, vid funktion.

  - inproc.c, vid ordinr procedur.

  - ingeop.c, vid geometriprocedur.

ex.

strip() r en funktion och skall drfr lggas till i infunc.c

  case VSTRIP:

      if ( status = evstrip( pv, valp ) ) < -1 )
          goto eexit;

      break;

valp r en pekare till en functions returvrde (PMLITVA). Anvnd member
int_va fr integer, float_va fr float osv. osv. (se 'pmdef.h'
fr info. om PMLITVA).

pv[] r en array av aktuella parametervrden (PMPARVA) s att
pv[1] r 1:a parametern pv[2] r 2:dra parametern. se 'pmdef.h'
fr info om PMPARVA).

Glm inte att deklarera funktionen:

extern short evstrip();

P motsvarande stt hanteras procedurer - se koden i resp. filer.

Om den nya rutinen r en funktion och flt 3 i 'newrout.h' (se 2 ovan)
satts till FALSE skall villkorlig kompilering anvndas i infunc.c .
Detta fr att frhindra inaktiv kod frn att i ondan ta plats och
ge bekymmer vid lnkning av analysatorn (v3c).

Eftersom strip() uppfyller villkoret ovan skall den i infunc.c till-
agda koden omges med :

#ifndef ANALYZER
  .
#endif


5.  Har den nya rutinen parameterar av klassen "variabel" skall
motsvarande MBS-variabel uppdateras. Detta grs med rutinen inwvar()
( write MBS-variable ). 
Vrdet av en parameter av klassen "variabel" r en adress som man kommer
t genom medlemmen "adr_va" i PMLITVA:n. Denna adress utgr referens till 
en MBS-variabel och skall anvndas vid tilldelning genom "inwvar()".
Man mste ocks ha tillgng till en typpekare fr variabeln. Den finns
i parametervrdesarrayen "pv" i medelemmen "par_ty". r variabeln en array
sker tilldelningen av ett element vid varje anrop till "inwvar()", indexering
sker genom att i en c-array av int ange index. T.ex. skall ett element i en
array med 3-dimensioner och index 1,1,1 tilldelas ett vrde indikeras det 
med en c-array enl. fljande:

                index[ 1 ] = 1;
                index[ 2 ] = 1;
                index[ 3 ] = 1;

                dim = 3;

    och anropet till inwvar blir om det r rutinens fjrde parameter:

  status =  inwvar( pv[ 4 ].par_ty,           /* pekare till typen */
                    pv[ 4 ].par_va.lit.adr_va,/* variabelns adress */
                    dim,                      /* dimension */
                    index,                    /* index om array */
                    &new_val );               /* det nya vrdet */
 
Snittet fr inwvar() ser ut p f|ljande stt ( finns i inac20.c ):

/*!--------------------- Write MBS-variable -------------------------------*/

short inwvar( acttyla, rtsaddr, dim, indarr, valp )

pm_ptr  acttyla;  /* in - type pointer for actual parameter */
long   rtsaddr;   /* in - variable address in MBS run-time stack */
short   dim;      /* in - dimension, number of indexes in array. Zereo 
                          indicates simple variable */
short indarr[];   /* in - array of indexes for an dimensioned variable, must 
                          be positive integers */
PMLITVA  *valp;   /* in - value to be assigned to the MBS-variable.  */
                  /* return - error severity code */
                  /*          IN340  =  Ilegal dimension for return variable */
                  /*          IN341  =  Array index out of bound for return 
                                        variable */




6.  Om den nya rutinen r en geometriprocedur skall hanteringen av
namngivna parameterar uppdateras. Koden finns i 'anapac/annaml.c'.

Under kommentaren '/* check parameter/procedure */' kontrolleras
att den namngivna parametern kan anvndas tillsammans med
aktuell rutin. Uppdatera 'case-krattan' ifall en ny geometri-
procedur infrs. 


7. Vid tillgg av nya namngina parametrar skall fljande gras.

     -  lgg till en ny medlem i strukturen V2NAPA och en ny konstant
        fr den namngivna parametern, detta grs i filen 'V3.h'

     -  fr interpretetorn uppdateras rutinen 'inrdnp()' med default-vrde
        och tillgg grs i case-krattan i 'inevnp()', dessa rutiner finns 
        i filen 'innpar.c'

     -  fr analysatorn grs uppdateringar enl. 6 i filen 'annaml.c'

8.  Gr en total omkompilering (fr att vara p skra sidan) och
lnka ett nytt v3 och v3c.


9.  Testa
