C
C     ********************
C     ** SUBROUTINE OUT **
C     ********************
C
C     15/2/90
C
C     1)Principales fonctions :
C     =========================
C     - transfert les caracteres contenus dans "l'expansion buffer"
C       (tableau X),a partir de la case 1 et jusqu'a rencontrer un nul caracter,
C       dans "l'output buffer" (tableau BOUT). BOUT contiend une ligne a
C       imprimer, de longueur POUT. Cette ligne est imprimee par la routine
C       WRITE (routine appelee par OUT), qui initialise egalement les 6 premiers
C       caracters de BOUT a blanc.
C     - concatene les instrunctions MORTARN le cas echeant
C     - lors du premier appel a OUT, on retiend les macro qui existent alors.
C
C
C     2) Principales variables globales utilisees
C     ===========================================
C     X    : tableau d'entre (inchange)
C     BOUT : tableau de sortie (modifie). En partie initialise par WRITE
C     POUT : pointeur dans BOUT. Est egale a la longueur de la ligne a
C            imprimer. (modifie) Initialise a 6 par WRITE
C     pour l'initialisation seulement
C     M    : Tableau des macro (inchange)
C     MI   : Tableau de sauvegarde des pointeurs sur les macros (modifie)
C     FSP  : Premiere place libre pour les macro (inchange)
C     FSPB : Sauvegarde de la valeur de FSB (modifie)
C
C     3) Variables locales
C     ====================
C     OP : pointeur courant dans X
C     T : caractere courant traite. En generale lu dans X et ecrit dans BOUT
C     FFLAG : flag permettant de diagnostiquer le premier appel a OUT. Vrai
C             lors du premier appel, faux ensuite.
C     STNST : flag utilise pour la generation d'instruction CONTINUE. Vrai
C             lorsque une etiquette vient d'etre transferee dans BOUT ou
C             lors de la concatenation de ligne MORTRAN. Faux lorsque une
C             instruction vient d'etre transferee.
C      CONT : contined la chaine de caracter CONTINUE, en MORTRAN-code
C      SKFL : non utilise
C      LPOUT: pointe sur la case de BOUT ou sera mis le prochain caracter
C             lors d'une concatenation d'instructions MORTRAN
C
C     4) Quelques details croustillants:
C     ==================================
C     - on commence a partir de la case 1 de X et on s'arrete au premier
C     caracter nul.
C     - les blancs et les ; en debut de X ne sont pas pris en compte
C     - les chaines de caracters entre ' sont convertis en format holerith
C     - le caracter ^ n'est pas transmis a BOUT (peut donc etre utilisee en
C       separateur a l'interieur d'une variable)
C     - si une instruction MORTRAN a un $ avant le ; cette instruction est
C       concatenne avec la suivante , c.a.d. qu'elles sont ecrites sur la meme
C       ligne. Le pointeur LPOUT contiend la position du prochain caracter a
C       ecrire dans BOUT.Le flag STNST est mis a true (Why ?)
C     - Lors du premier appel a OUT (diagnostiquer grace a FFLAG), on remplit
C       la table MI en recopiant les 63 premiers nombre de la table M; on
C       conserve ainsi dans MI les pointeurs sur les macros qui seront
C       conservees apres un END MORTRAN.
C     - gestions des etiquettes :
C         = on reconnait une etiquette comme etant une instruction MORTRAN
C         commencant par une chiffre
C         = l'etiquette se termine par un ;
C         = l'etiquette est mise dans les 6 premieres cases de BOUT,
C         initialisees a blanc par WRITE
C         = le flag STNST (STatus New STatement ?) sert a gerer les instrucions
C         continue :
C           + apres avoir ecrit une etiquette dans BOUT, STNST est true
C           + quand on ecrit une instruction FORTRAN, on met STNST a false
C           + donc quand on doit ecrire un etiquette et que STNST est true, on
C           genere une instruction CONTINUE
C           + STNST est egalement mis a true lors de la concatenation
C           d'instructions MORTRAN
C
C
C     *********************
C     ** SUBROUTINE READ **
C     *********************
C
C     15/2/90
C
C     1)Principales fonctions :
C     =========================
C     - Sous programme qui lit simplement une ligne, et passe pas mal de
C     temps a essayer de l'ecrire.
C     - Les caracteres lus sont ranges, codes en ASCII, dans le buffer
C     CARD (la fin du buffer est a blanc).
C     - Les caracteres lus sont converti en codage interne est range dans
C     le buffer BIN. Apres le dernier caractere lu, on met le cractere
C     NUL. PIN, le pointeur de BIN, est mis a zero.
C     - Les lignes FORTRAN (comprises entre &F et &M, ainsi que ces 2
C     instructions) sont traitees completement localement. Elles sont
C     ecrites telle que dans le fichier de sortie, et sont affichees telle
C     le cas echeant.
C
C     2) Principales variables globales utilisees
C     ===========================================
C     -PFLAG : (Print FLAG) vrai si la ligne venant d'etre lue ne doit
C     plus etre imprimee. A l'exterieur de READ, n'est modifie (et
C     utilise) que dans CCA (&N ou &N0)
C     -LINE : IN : numero dans la page de la derniere ligne affiche
C            OUT : modifie
C     - MLINE : IN : nombre max de lignes dans la page
C              OUT : inchange
C     - NL : IN : Nested Level de la ligne en court
C           OUT : inchange
C     - LNL : IN : Last Nested Level; NL de la ligne precedemment affichee
C            OUT : modifie; NL de la ligne venant d'etre affichee
C     - CARD : IN : ligne precedemment lue (ASCII)
C             OUT : ligne venant d'etre lue (ASCII)
C     - CSI : IN : caractere de ligne suite (ASCII)
C            OUT : inchange
C     - BIN : IN : non utilise
C            OUT : ligne lue, convertie en codage interne MORTRAN. Apres
C                  le dernier caractere lu, il y a le caractere NUL
C     - PIN : IN : non utilise
C            OUT : PIN=0
C     - IND : IN : nombre de blancs generes pour chaque niveaux
C                  d'indentation
C            OUT : inchange
C     - B   : Buffer temporaire de travail
C             IN : non utilise
C            OUT : modifie si on fait de l'indentation
C     - IFLAG, INU, LFLAG, AFLAG, TFLAG : utilises mais inchanges
C
C     3) Variables locales
C     ====================
C     - PIM : pointe sur le dernier caractere non blanc
C
C     4) Quelques details croustillants:
C     ==================================
C     - En generale la ligne lue est affiche juste avant de lire la
C     ligne suivante, donc apres traitement, sauf lorsque l'on est en mode
C     trace; dans ce cas, la ligne lue est affichee juste apres lecture,
C     avant le traitement. La variable PFLAG est utilise pour gerer ca.
C     Si on affiche en generale la ligne apres traitement(et non juste
C     apres lecture) c'est probably pour gerer les Nested Level.
C     - &F et &M, ainsi que les lignes comprises entre les deux, sont
C     traitees localement; elles ne sont pas transmises a l'input
C     buffer BIN.
C     - Pour les lignes qui sont des "ordres" MORTRAN (qui commencent
C     par & mais pas par &'), on rajoute un ; a la fin
C     - Quand la fin de fichier est rencontree, on met &&; dans BIN
C
C     **********************
C     ** SUBROUTINE WRITE **
C     **********************
C
C     12/3/90
C
C     1)Principales fonctions :
C     =========================
C     Ecrit dans le fichier de sortie (unite logique OUTU) la ligne de
C     caracteres ranges dans BOUT et de longueur POUT. Si on est en
C     mode TRACE, on affiche en plus cette ligne precedee de ****.
C
C     2) Principales variables globales utilisees
C     ===========================================
C     BOUT : IN : tableau de caracteres a enregistres dans le fichier de
C                 sortie, represente en codage inetrene MORTRAN
C           OUT : les 6 premiers caracteres a blancs
C     POUT : IN : nbre de caracteres de BOUT a enregistrer
C           OUT : inchange
C     OUTU : IN : unite logique de sortie
C            OUT : inchange
C     TFLAG, OTAB : utilise mais inchange
C
C     3) Variables locales
C     ====================
C
C     4) Quelques details croustillants:
C     ==================================
C
C
C     ********************
C     ** SUBROUTINE XIN **
C     ********************
C
C     12/3/90
C
C     1)Principales fonctions :
C     =========================
C     Lecture d'une instruction MORTRAN :
C     - Sous programme lisant des caracteres dans l'Input Buffer (BIN),
C     a partir de l'adresse PIN et jusqu'a rencontrer un (;) , et les
C     ecrivants dans l'Expansion Buffer (X) avec un traitement eventuel.
C     Si la ligne courante (contenue dans BIN) ne contiend pas de (;)
C     on va lire la ligne suivante
C     - On gere le Nesting Level (NL)
C     - on supprime les blancs avant ou apres un caracter special
C     - Lorsque l'on est a l'exterieur d'une chaine de carateres, on ne
C     laisse qu'un blanc entre 2 mots
C     -les commentaires sont supprimes
C
C     2) Principales variables globales utilisees
C     ===========================================
C     BIN : IN : contiend les caracteres de la ligne venant d'etre lue,
C                en codage interne MORTRAN
C          OUT : non modifie
C     PIN : Input buffer Pointer (dans BIN) (mis a 0 lors de l'appel a
C           READ, initilaise a 72 au debut de MP2)
C           IN : pointe sur le dernier caracter lu lors du precedent
C                appel a XIN
C          OUT : pointe sur le dernier caracter lu (un ;)
C     X : expansion Buffer
C           IN :
C          OUT : contiend l'instruction MORTRAN lu, a partir d'une
C                adresse fixe dans X (XPBREF). Le dernier caracter lu
C                est suivi par un NUL
C     NL : Nesting Level
C           IN : avant de lire l'instruction
C          OUT : apres l'avoir lu
C     CSI : IN : uqelconque, non interprete
C          OUT :caracter suite utilise par READ lors de l'impression
C           des lignes lu
C           = blanc : pas de caracter suite
C           = S (variable SCH) : lorsqu'une chaine de caracter se
C           poursuit sur la ligne suivante
C           = * (variable CCH) : lorsqu'un commentaire se poursuit...
C     QFLAG : IN: =true : on termine le commentaire a la fin de la ligne
C                 =false (valeur par defaut) : On attend un desusieme
C                 double cote pour fermer le commentaire
C            OUT : non modifie
C
C     3) Variables locales
C     ====================
C
C     4) Quelques details croustillants:
C     ==================================
C     - Niveau d'emboitement : le Nesting Level (NL) est gere lors de la
C     rencontre d'un < ou d'un > .
C     - Les commentaires sont supprimes (non transmis au buffer X).
C     Suivant la valeur de QFLAG, le commantaire se termine soit a la
C     fin de la ligne, soit quand on ferme les doubles cotes
C     - les chaines de caracteres (expression compri entre ') ne sont
C     pas du tout interpreter par XIN (transmis directement au buffer X)
C     - A l'exterieur des commentaires et des chaines de caracteres, on
C     ne garde qu'un blanc entre deux mots, sauf si ce blanc est entoure
C     d'au moin un caracter special : cette unique blanc est alors
C     supprime.
C
C
C     **********************
C     ** SUBROUTINE XXXXX **
C     **********************
C
C     12/3/90
C
C     1)Principales fonctions :
C     =========================
C
C
C     2) Principales variables globales utilisees
C     ===========================================
C
C     3) Variables locales
C     ====================
C
C     4) Quelques details croustillants:
C     ==================================
C

