Suiv.: Sélection des périphériques graphiques
Sup.: Généralités
Préc.: Liste des bibliothèques MODULEF -
Table des matières
La partie non portable de Modulef est aussi réduite que possible (quelques
sous-programmes). Si une version a déjà été programmée pour votre machine,
c'est cette version qui vous utiliserez (ex: Sun). Sinon, une
bibliothèque de nom u_mod est fournie à titre d'exemple, mais il est
nécessaire de l'adapter à votre site.
Cette partie non portable comprend les sous-programmes BIP, EXEC, MAJUSC,
MINUSC,
NOMFSD, OUVRIR, RETPAG, TILT, TRUNIT, et les "fonctions INFO":
SUBROUTINE EXEC(COM) C++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ C BUT : EXECUTER UNE COMMANDE DU SYSTEME HOTE C C EXEMPLE : CALL EXEC('ls') IMPRIME LA LISTE DES FICHIERS C SOUS SYSTEME MULTICS C C PARAMETRE D'ENTREE C COM : CHAINE CONTENANT LA COMMANDE C++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CHARACTER*(*) COM
Si l'ordinateur, de manière interne, code les caractères en ASCII, il suffit de conserver la version fournie:
CHARACTER*1 FUNCTION MAJUSC(C) C++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ C BUT : TRANSFORMER UNE LETTRE MINUSCULE EN MAJUSCULE C VERSION ASCII C++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CHARACTER*1 C I = ICHAR(C) IF (97.LE.I .AND. I.LE.122) THEN MAJUSC = CHAR(I-32) ELSE MAJUSC = C ENDIF END
L'inverse de la fonction MAJUSC.
Cette fonction crée un nom de fichier pour une Structure de Données (S.D.) Modulef, à partir d'un nom générique (éventuellement blanc) et du type de la S.D. :
CHARACTER*80 FUNCTION NOMFSD(NOMGER,NOMSD) C ********************************************************************* C BUT : CREER UN NOM GENERIQUE C ---- C NOMGER : NOM GENERIQUE C NOMSD : NOM DE LA S.D C ********************************************************************* CHARACTER*(*) NOMSD,NOMGER,NOM*256
Cette fonction est portable si le nom du fichier a la forme: NOMGER.NOMSD
L'expérience montre que l'ordre OPEN de Fortran 77 n'est pas totalement portable. Nous avons donc défini le sous-programme OUVRIR, qui peut demander quelques modifications sur un nouveau site :
SUBROUTINE OUVRIR(UNIT,FILE,SPEC,RECL,IOSTAT) C++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ C BUT : C OUVRIR UN FICHIER (OPEN) C APRES UN APPEL A OUVRIR, TESTER IOSTAT (SINON APPELER OUVRIS) C C LES CONVENTIONS SONT CELLES DE LA NORME FORTRAN 77, A PART C L'EXTENSION SUIVANTE : SI SPEC CONTIENT 'OLD' ET 'DIRECT', C ET SI RECL=0, ALORS LE FICHIER EST OUVERT AVEC LA LONGUEUR C D'ENREGISTREMENT DONNEE LORS DE SA CREATION C C PARAMETRES D'ENTREE : C UNIT : NUMERO D'UNITE DU FICHIER C FILE : NOM DU FICHIER C SI FILE=' ', OPEN SANS SPECIFIEUR FILE=... C SPEC : LISTE DE SPECIFIEURS (EX: 'OLD,DIRECT,UNFORMATTED') C RECL : LONGUEUR D'UN ENREGISTREMENT C SI RECL=0, OPEN SANS SPECIFIEUR RECL=... C C PARAMETRES DE SORTIE : C IOSTAT : CODE D'ETAT DU SYSTEME D'ENTREES/SORTIES C IOSTAT = 0 SI AUCUNE ERREUR N'EST SURVENUE C++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
SUBROUTINE RETPAG(IUNIT,NUMENR,BUF,LPAGE,NBPAGE) C********************************************************************** C BUT : SOUS PROGRAMME NON PORTABLE PERMETTANT DE BALAYER UN C ------ FICHIER EN ACCES DIRECT JUSQU'A LA FIN DU FICHIER C ATTENTION IL N'Y A AUCUNE VERIFICATION DU TYPE D'ERREUR C********************************************************************** C MOTIVATION : SOUS UNIX LA FIN DE FICHIER EST REPERE PAR L'OPTION C ------------ END = , ALORS QUE SOUS MULTICS LES OPTIONS C REC = , ET END = SONT INCOMPATIBLES . C********************************************************************** C EN ENTREE : C ----------- C IUNIT : NUMERO D'ETIQUETTE LOGIQUE C NUMENR : NUMERO DE L'ENREGISTREMENT A LIRE C SI NUMENR EST < 0 ON BALAYE LE FICHIER POUR RETOURNER LE C NOMBRE DE PAGE DE CELUI CI SINON ON LIT L'ENREGISTREMENT C NUMRENG DANS LE BUFFER BUF C LPAGE : LONGUEUR DU TABLEAU BUF C EN SORTIE : C ----------- C BUF : CONTENU DE L'ENREGISTREMENT SI NUMREN >0 C VIDE SINON C NBPAGE : NOMBRE DE PAGE SI NUMREG <=0 C VIDE SINON C++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ C VERSION UNIX C++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DIMENSION BUF(LPAGE) C IF (NUMENR .GT. 0) THEN READ (IUNIT,REC=NUMENR,ERR=150,END=150) BUF 150 CONTINUE ELSE NBPAGE = 1 200 READ (IUNIT,REC=NUMERR,ERR=150,END=250) BUF NBPAGE = NBPAGE + 1 GOTO 200 250 CONTINUE NBPAGE = NBPAGE - 1 ENDIF RETURN END
Ce sous-programme est appelé par ARRET ou d'autres sous-programmes, afin d'avorter une exécution Modulef. Plusieurs implémentations sont possibles :
Ce sous-programme, lui aussi, n'est pas tout à fait portable :
SUBROUTINE TRUNIT(UNIT) C++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ C BUT : C TROUVER UN NUMERO D'UNITE LIBRE, C'EST-A-DIRE CONNECTE A AUCUN C FICHIER. CE SOUS-PROGRAMME PRECEDE SOUVENT LE S.P. OUVRIR C C PARAMETRES DE SORTIE : C UNIT : NUMERO D'UNITE DU FICHIER C++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Il s'agit des 4 fonctions IINFO (de type INTEGER), RINFO (REAL), DINFO (DOUBLE PRECISION), et KINFO (CHARACTER*80). Ces fonctions permettent aux programmes d'accéder à des informations générales (numéro d'unité de l'imprimante, plus petit nombre flottant positif, nom de l'utilisateur, ...) sans avoir recours à des COMMON.
L'adaptation de ces fonctions consiste à lire la version fournie (u_mod) avec un éditeur de textes, et à la modifier légèrement d'après les commentaires insérés dans chaque fonction. Par exemple, la fonction IINFO a l'aspect suivant :
INTEGER FUNCTION IINFO(MOTCLE) C++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ C BUT : C RETOURNER UNE INFORMATION DE TYPE INTEGER C C PARAMETRE D'ENTREE : C MOTCLE : NATURE DE L'INFORMATION A RETOURNER, EN CLAIR C++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CHARACTER*(*) MOTCLE C COMMON /TRAVA1/ PADTR1(29),IMPRE,PADTR2(3) COMMON /UNITES/ LECTEU,IMPRIM,INTERA,NFNEWS,NFSAUV,PADUNI(27) REAL PADTR1,PADTR2,PADUNI INTEGER LECTEU,INTERA,IMPRIM,NFNEWS,NFSAUV,IMPRE C------------------------------------------------ C-- MODIF 13/10/93 C-- F.HECHT ET E.SALTEL POUR QUE LES COMMONS C-- SOIENT TOUJOURS INITIALISES C------------------------------------------------ INTEGER COUNTK SAVE COUNTK DATA COUNTK /0/ IF(COUNTK.EQ.0) THEN C--- INIT DE INFO LECTEU = 5 IMPRIM = 6 INTERA = 0 NFNEWS = 99 NFSAUV =0 IMPRE = 1 COUNTK = 1 ENDIF C C 1. PARTIE PORTABLE C ------------------ C IF (MOTCLE .EQ. ...) THEN ... ELSE IF (MOTCLE .EQ. ...) THEN ... C C 2. PARTIE NON PORTABLE C ---------------------- C C NUMERO D'UNITE INITIAL DU LECTEUR ELSE IF (MOTCLE .EQ. 'LECTEUR INITIAL') THEN IINFO = 5 ... C C ERREUR ELSE WRITE (IMPRIM,*) 'IINFO : MOT-CLE INCONNU : ', MOTCLE IINFO = 0 END IF END
Ici, la partie 1 ne doit évidemment pas être modifiée,
mais il faut examiner la partie 2. Dans notre exemple, changer
éventuellement le numéro initial du lecteur (
Rappelons que l'utilisateur a la possibilité,
en cours d'exécution, de modifier le numéro du lecteur : utiliser pour cela la
commande !LECTEUR (cf. [Guide Modulef - 2]).)
remplacer le 5, valable sur Multics et de nombreuses autres machines,
par la valeur adéquate (par exemple 105
sous SIRIS 8). Les valeurs retournées par les fonctions INFO peuvent être
obtenues par une simple affectation de constante, mais aussi par un appel
au système (obtention du temps CPU, ...).
Si une telle valeur est difficile à obtenir sur la machine hôte,
donner une valeur quelconque, par exemple 'DUPONT' pour le nom de
l'utilisateur.
Les mots-clés définis à ce jour sont :
DOUBLE PRECISION FUNCTION DINFO(MOTCLE) 'PETIT' 'GRAND' 'PRECISION' 'HORLOGE' 'DELTA HORLOGE' 'CPU' 'DELTA CPU' INTEGER FUNCTION IINFO(MOTCLE) 'I' 'IMPRIMANTE' 'L' 'LECTEUR' 'INTERACTIVITE' 'NOUVELLES' 'SAUVEGARDE' 'BAVARD' 'LANGUE' 'LECTEUR INITIAL' 'IMPRIMANTE INITIALE' 'REEL2' 'RECL' 'UNITE RECL' 'INTERACTIVITE INITIALE' 'GRAND' CHARACTER*80 FUNCTION KINFO(MOTCLE) 'TITRE' 'MACHINE' 'DATE' 'HEURE' 'UTILISATEUR' 'POBA' 'PRE_HELP' 'SYMD' 'TESD' 'HELP ' 'SYMD ' 'PROC' REAL FUNCTION RINFO(MOTCLE) 'PETIT' 'GRAND' 'PRECISION'