The old BONJOUR project

bonjour

Compil

compil,pascal,absolu=bonjour,#editlib=editlib,al,
  ver=$3.0.3$,com=$initialisation du systeme "bonjour"$.

Docum0

.inp(b#).par(f# nR s3 p8 u5).mar(l+5)
.tit BONJOUR - Porte d'entrée à la logithèque Bonjour.
.opt(l- r-)
BONJOUR - PORTE D'ENTREE A LA LOGITHEQUE BONJOUR.
.opt

##-#INTRODUCTION.

Le programme BONJOUR a pour but de convenablement amorcer un
travail qui utilisera la logithèque Bonjour.

En mode dialogué, l'utilisateur appelle normalement BONJOUR en lieu
et place de EDIT. Après avoir préparé le travail à l'usage de
la logithèque Bonjour, le programme BONJOUR fait exécuter le
programme EDIT.
Donc, juste après s'être identifié face à la comptabilité du
Centre de Calcul, le fait de frapper BONJOUR plutôt que EDIT
ne change en rien le fait que l'utilisateur dialoguera avec EDIT.

Par lots, l'utilisateur ajoute un appel au programme BONJOUR
au début de son travail. Le travail pourra par la suite utiliser
divers éléments de la logithèque Bonjour.
Un endroit approprié pour placer la carte BONJOUR pourrait être
juste après la "carte code", qui identifie l'utilisateur face à
la comptabilité du Centre de Calcul.

##-#SYNTAXE DE L'APPEL.

Le programme BONJOUR peut s'appeler ainsi:

     BONJOUR.
       ou
     BONJOUR,/<options>.

Si l'utilisateur accepte les valeurs par défaut des diverses options,
il peut utiliser la première forme.
Toutefois, s'il désire changer la valeur d'une ou de plusieurs options,
il devra utiliser la seconde forme.
Dans la seconde forme, <options> doit décrire un ou plusieurs
choix d'option, chaque choix étant séparé du suivant par une virgule.
Un choix d'option s'indique lui-même comme une lettre identifiant
l'option suivi d'un signe (+ ou -) indiquant le sens du choix.

Par exemple, les appels suivants sont équivalents, en interactif:

     BONJOUR.
       et
     BONJOUR,/E+,I-,M-,P+,R-,U0.

Les appels suivants sont équivalents lors d'une exécution par lots:

     BONJOUR.
       et
     BONJOUR,/E-,I-,M-,P-,R-,U0.


##-#OPTIONS DISPONIBLES.
.par(nL s2 p5 u5).mar(l+5)

#)#P+ et P-.

Avec P+, BONJOUR donnera la date et l'heure de la dernière session
interactive où l'utilisateur a utilisé le programme BONJOUR.
Avec P-, BONJOUR ne donnera pas cette information.
BONJOUR présume P+ en interactif et P- en lots.

L'effet de P+ n'aura pas lieu si le système des variables Bonjour
n'est pas actif, toutefois. Ce point est couvert plus loin.

#)#I+ et I-.
.bre
U0 ou U<n>.

Si I+ est choisi, BONJOUR localisera un fichier d'un SYSLIB donné
et exécutera les cartes de contrôle (non séquencées) qui y seront
contenues. BONJOUR présume I- par défaut.

En interactif, le fichier localisé se nomme BONJINI, alors que par
lots il se nomme BONJLOT.
En absence de l'option U ou si l'option U vaut 0, le fichier sera
localisé du SYSLIB de l'utilisateur. Si U est suivi d'un nombre
entier, il devra alors s'agir du numéro d'usager identifiant le
SYSLIB duquel BONJOUR devra localiser le fichier à exécuter.

.mar(l+5 r-5)
Par exemple, l'usager pourrait vouloir, sous le contrôle de l'option /I+,
le fichier SYSI présent à son travail interactif ainsi qu'une pensée
tirée de COOKIE. Il peut alors faire:

     .. EL.NF BONJINI./
     02 ATTSYSI.
     03 COOKIE.
     04 ^^
     .. ES

et démarrer son travail interactif par BONJOUR,/I+.
.mar

#)#M+ et M-.

Avec M+, BONJOUR récupére les messages que l'utilisateur
a pu recevoir depuis sa précédente session au terminal. Si ni
M+ ni M- ne sont spécifiés, BONJOUR présumera
alors M-. On ne récupère donc pas les messages en appelant
BONJOUR, à moins de spécifier explicitement M+.

#)#E+ et E-,
.bre
R+ et R-.

La présence de E+ provoque l'appel de EDIT pour continuer
la session interactive. BONJOUR présume E+ en interactif
et E- en non-interactif.

Si R+ est choisi, EDIT sera appelé avec le paramètre
INIT pour amener l'exécution automatique d'une commande
LIR#EDITINI. Par défaut, BONJOUR présume R-.

.mar(l+5 r-5)
Par exemple, l'utilisateur peut vouloir, sous le contrôle de l'option /R+,
recevoir automatiquement l'écho de ses caractères, avoir un retour de
charriot rapide et lister le résultat de l'exécution de son BONJINI, il
doit alors préparer:

     .. EL.NF EDITINI./
     02 #/J10
     03 #/V3
     04 RW OUT
     05 ^
     01 /M/#/@/
     02 ^^
     .. ES

et démarrer son travail interactif par BONJOUR,/I+,R+.

.par.mar

##-#VARIABLES BONJOUR.

Les variables Bonjour ont pour but d'implanter des variables globales
à tous les programmes et à tous les travaux d'un utilisateur donné.
Leur valeur perdure d'une session de travail à la suivante.
(Une documentation plus détaillée sur les variables Bonjour peut
être obtenue en faisant $SECOURS,/S=BVAR.)

Le programme BONJOUR, au début de son exécution, vérifie la présence
du fichier des variables Bonjour. Si le fichier est absent ou vide,
alors BONJOUR tente de le produire en exécutant un LIB,L,BONJVAR .
Cette action a lieu indépendamment du fait que le travail soit
exécuté de façon interactive ou non.

Le programme BONJOUR, à la fin de son exécution, épure le fichier des
variables Bonjour de toutes celles qui ne sont pas "permanentes".
Il sauvera alors les variables restantes par un LIB,C,BONJVAR.
Cette action n'aura lieu que lors d'une session interactive.
Noter que s'il ne reste aucune variable à ce moment (hormis celles
qui sont reliées à l'option P+), le programme BONJOUR procède plutôt
à l'élimination du fichier BONJVAR (et l'option P+ sera inopérante).

On peut, à l'aide des variables Bonjour, rendre automatique la
sélection ou le rejet de certaines options.

.mar(l+5 r-5)
Par exemple, si l'utilisateur possède un fichier BONJINI et un fichier
EDITINI, il peut désirer qu'un simple appel à BONJOUR soit équivalent
à BONJOUR,/I+,R+; il lui suffit de faire alors, une fois pour toutes:

     .. $BVAR
     * BONJOUR%I='+'
     * BONJOUR%R='+'
     * .
     ..

et changer ainsi, pour lui, les valeurs par défaut des options I et R
dans le programme BONJOUR. Il lui faudra dorénavant faire BONJOUR,/R-
s'il ne veut pas l'exécution automatique de son EDITINI.
.mar

##-#HISTORIQUE.

En mars 1981, le programme BONJOUR a été complètement révisé.
Il admet maintenant une nouvelle syntaxe. Par exemple, l'ancien
appel BONJOUR,/MESSAGE+/INIT. peut s'écrire BONJOUR,/M+,I+.
Un fichier B,SN=GROUPE1 ne sera dorénavant plus supporté.

.opt(l-)
 François Pinard,
 3 août 79.
.opt

Docum5

.inp(b# u_).mar(l+5).par(f# nR p8 s3 u5)
.tit Présentation générale de la logithèque Bonjour.

##-#DESCRIPTION DU PROJET.

La logithèque Bonjour est la conséquence d'un besoin assez précis. Il
s'agissait de rendre facile l'utilisation commune d'un ensemble d'outils
développés séparément par plusieurs programmeurs, tous amateurs du
langage Pascal et de la philosophie interactive.

Le projet PSYC024 existe donc depuis le 18 mars 1975, parrainné par le
département de psychologie (André Maheux) et sous la responsabilité d'un
informaticien (François Pinard). Le titre et la description du projet
sont:

.mar(l+8 r-8)
.opt(l- r-)
UTILITAIRES INTERACTIFS.
.opt

DEVELOPPEMENT ET MISE-AU-POINT D'UNE COLLECTION D'UTILITAIRES INTERACTIFS.
MISE EN BIBLIOTHEQUE, ENTRETIEN ET DOCUMENTATION DE CES UTILITAIRES.
LES USAGES INTERACTIFS SERONT ORIENTES VERS LE LANGAGE PASCAL.
.mar

Puisque les principaux utilisateurs ou contributeurs à la
logithèque Bonjour
sont étudiants, il nous apparaît raisonnable que cette
logithèque Bonjour soit
orientée vers ceux-là qui apprennent à bien programmer et à bien penser.

Le roulement étudiant, au cours des semestres, oblige aussi à des
dispositions spéciales pour garantir la continuité de la logithèque
Bonjour
d'année en année. On ne peut demander aux contributeurs d'être
perpétuellement responsables de leurs programmes.

##-#ADMISSIBILITE DES PROGRAMMES.

Le critère essentiel d'admission d'un programme dans la logithèque
Bonjour est donc l'utilité qu'il peut avoir pour un programmeur qui,
spécifiquement, est adepte de Pascal et de l'interactif.

Quelques critères supplémentaires, s'ils sont suivis, peuvent jouer
en faveur de la survie de la logithèque, sa simplicité de maintien
et sa qualité générale:

.mar(l+8).par(s0 nl u3)
#)#Chacun des éléments de la logithèque devrait être documenté de
façon claire, précise, explicite, complète. L'orthographe et le
style devraient être corrects. La concision devrait être l'un des
moteurs de la compréhension et de la facilité de consultation.

#)#Les "sources" de la logithèque devraient être complets en soi.
Ils devraient être lisibles, bien présentés, bien structurés et
raisonnablement documentés.
De plus, à travers la logithèque, l'auteur devrait les rendre
pleinement accessibles à ceux qui veulent les copier ou les
modifier.

#)#Préférablement, les programmes devraient être compilables par la
version 3 du compilateur Pascal. Les autres langages ne sont pas
interdits, si les programmes s'insèrent convenablement dans l'objectif
général du projet.
Les dépendances de la machine ou du système devraient être réduites
au minimum, bien localisées dans des routines spéciales, écrites
dans un langage approprié à leur fonction et bien disponible.
.mar.par

Depuis l'avènement de la version 3 de Pascal, admettant les inclusions
de textes déclaratifs d'une part, et celui de l'encapsulage d'autre part,
il est à prévoir que Bonjour verra de plus en plus d'ensembles intégrés
de procédures pour Pascal, ou modules.

Quoiqu'idéalement, un programme admis sur la logithèque Bonjour tend
à respecter tous ces critères, il demeure qu'un programme utile, au
sens de la définition du projet, aura toujours sa place dans la
logithèque. Espérons que le niveau de qualité de la programmation
que l'on y trouve restera élevé!

##-#CONCIERGERIE DE BONJOUR.

Le "concierge" de la logithèque Bonjour est un utilisateur qui, à un
moment donné, s'occupe des questions d'exploitation de cette logithèque.
C'est un utilisateur familier avec la logithèque Bonjour comme avec
la logithèque du CYBER, en général. Il est responsable de garantir
les copies de sauvegarde, les épurations périodiques, la mise-en-
place des nouveaux programmes et les questions annexes.

D'une facon plus générale, il cherche à veiller à ce que les
principes mentionnés plus haut soient respectés durant l'époque
de sa conciergerie. Le concierge de Bonjour agit alors à titre
de représentant des utilisateurs de la logithèque Bonjour qui sont
adeptes de Pascal et de l'interactif, il se référera à eux par
voie démocratique si jamais une question litigieuse se présente.

##-#VERSIONS DE TRAVAIL, CONSULTATIONS.

Parce que le temps humain demeure une ressource précieuse,
il y a des mécanismes dans la logithèque Bonjour qui tendent à
diminuer le risque de travail duplicaté.

L'un de ces mécanismes, la documentation des versions en travail,
permet aux utilisateurs de Bonjour de grouper les bonnes idées
de tous et chacun face aux éléments de la logithèque Bonjour, de
rendre disponible les spécifications d'un programme avant le
programme lui-même et de garder trace des suggestions.
Tout utilisateur de la logithèque Bonjour peut ainsi ajouter ses
idées, au profit de ceux qui écriront ou récriront un programme.
En particulier, les spécifications de programmes hypothétiques
mais utiles sont bienvenues.

Le second mécanisme, la consultation préalable avec le concierge,
a pour but de raisonnablement garantir à un utilisateur qu'il
est actuellement seul à jouer sur un élément de la logithèque Bonjour.
Il suffit de tenir le concierge informé de ses projets et de ses
travaux autour de la programmathèque Bonjour, celui-ci pourra
mettre en contact les utilisateurs intéressés par un même groupe
de modifications ou de compositions de programmes.

##-#REPORT DES ERREURS TROUVEES.

Puis-je vous demander votre collaboration afin de détecter les
petites vétilles qui peuvent exister dans la logithèque Bonjour,
par exemple:
.mar(l+8).par(s0 nl)
#)#les erreurs d'orthographe,
#)#les avortements de programmes,
#)#les fichiers non retournés,
#)#les positionnements oubliés,
#)#les documents obscurs, difficiles,
#)#les erreurs de programmation.
.mar.par

Les vétilles seront corrigées assez rapidement. Dans le cas
de problèmes plus sérieux, je pourrai transmettre vos requêtes
au créateur du programme en question (si vous ne le connaissez
pas vous-même).

Il est facile d'envoyer un message (U=16) dès que vous rencontrez
un problème, ne remettez pas à plus tard... Les messages ne
se perdent généralement pas.

##-#HISTORIQUE.

Sous le système d'exploitation SCOPE 3.2, le système de communication
TELUM exécutait à un seul point de contrôle une copie unique du programme
EDIT pour tous les usagers interactifs.
Lors de la refonte du système de communication lors du passage au
système d'exploitation SCOPE 3.3, j'avais beaucoup insisté auprès de
Godefroy Lemonnier pour qu'il soit possible de demarrer un autre
programme que EDIT, après l'identification comptable. Godefroy m'avait
d'ailleurs suggéré qu'il serait joli qu'un tel autre programme se
nomme BONJOUR, en particulier. C'est donc lui qui a nommé ce projet.

Un peu par hasard, j'ai rencontré Serge Froment, nouvel utilisateur
intelligent et enthousiaste du Centre de Calcul. Ayant quelques
programmes et outils intéressants l'un pour l'autre, nous nous
sommes mijotés un petit système ad hoc en permettant le partage.
Entre autres choses, nous nous sommes fabriqués une méthode pour
nous laisser des messages sur nos SYSLIBs respectifs. D'autres
utilisateurs se sont bientôt joint à nous et le besoin s'est fait
sentir de raffiner le système de messagerie. La logithèque ad
hoc a pris un peu d'ampleur et le programme M (messages) est né.
Plus tard, M a été renommé MD (messages différés).

Plus tard, j'ai cherché à obtenir du Centre de Calcul l'autorisation
d'ouvrir un projet spécial pour supporter le petit groupe d'usagers
qui s'était alors formé. Le Centre a montré beaucoup de prudence et
de réticence. Toutefois, Philippe Guay, adjoint administratif du
Centre, m'a aidé à trouver une façon de procéder qui soit
acceptable à la fois du point de vue administratif et du point de
vue informatique. Son aide et son appui m'ont été précieux lors du
démarrage du projet dans sa forme "officielle".
Le département de psychologie, en la personne d'André Maheux, adjoint
administratif de ce département, s'est porté garant de la bonne
moralité du projet. Le département d'informatique, en la personne de
Paul Bratley, m'avait alors promis un appui de remplacement en cas
de complication administrative. Je remercie donc ici ces deux personnes
pour leur compréhension et leur parrainnage.

Par la suite, la logithèque a pris de l'ampleur, en possibilités comme
en popularité.
Au moment de la rédaction de ce document, voici la liste des
contributeurs à la logithèque:
Benoit Sauvageau, Rino Rioux, Michel St-Louis, Guy Lapalme, Daniel
Belzile, Serge Froment, Denis Fortin, Jean-François Lamy, Claude Goutier,
Bertrand Sénécal, Pierre Lamarche, Christophe Dupriez, Patrick Ward et
François Pinard.
Le rôle du Concierge de la logithèque, tenu par moi, a été partagé à
divers moments avec Serge Froment, puis plus tard avec Denis Fortin.
Je désire remercier spécialement Michel Dignard et Claude Goutier,
pour l'aide spéciale et soutenue qu'ils m'ont apportée, chacun à leur
manière, lors de la vie de ce projet.

.opt(l-)
 François Pinard,
 25 mai 78.
.opt

Source

(*$l'porte d''entree a la logitheque bonjour.'*)


programme bonjour(entree/, sortie);


(****************************************************************
*                                                               *
*     bonjour - inititialisation du systeme "bonjour"           *
*     -------   ---------------- -- -------  -------            *
*                                                               *
*     ce programme vise a preparer l'utilisation du systeme     *
*     "bonjour", en interactif ou non, selon certains choix     *
*     fournis par l'utilisateur. la "notice d'utilisation"      *
*     contient l'information complementaire.                    *
*                                                               *
*                                    francois pinard,           *
*                                    (u.m., mai 76).            *
*                                    (refait, mars 81).         *
*                                                               *
****************************************************************)



(*$l- modules 'int' et 'bvar'*)
(*$i'int'/'sysi'*)
(*$i'bvar'/'sysi'*)
(*$l=*)


fonction lon(c: dynamique alfa): entier;
  externe;


const
  blancs = '          ';


var
  ok: booleen;
  pare: booleen;
  pari: booleen;
  parm: booleen;
  parp: booleen;
  parr: booleen;
  paru: entier;


var
  exc: texte;
  ex: booleen;
procedure excfich(var f: texte; var b: booleen);
  externe;
procedure excglob(i: booleen; var a: booleen);
  externe;
(*$l'initialisation/terminaison.'*)


procedure init;
  var
    b: booleen;
  debut
    ok := vrai; ex := faux; excglob(vrai, b);
    intinit;
    si inter alors ecrireln('@/m**1');
  fin;


procedure term;
  var
    x: texte;
    b: booleen;
  debut
    si inter alors ecrireln('@/m**$');
    si ok alors intterm
    sinon
      debut
        ecrireln(x, 'exitel.'); ecrireln(x, 'exit,s.'); excfich(x, b);
        halte('* erreur durant "bonjour".')
      fin
  fin;
(*$l'variables de bonjour.'*)


var
  exis: booleen;
fonction existant(a: alfa): booleen;
  externe;


procedure initvars;
  var
    t: tableau [1..1] de alfa;
    l: entier;

  procedure allervoir;
    var
      x: texte;
      b: booleen;
    debut
      ecrireln(x, 'return,bonjvar.');
      ecrireln(x, 'lib,l,bonjvar,cnt,l=0.');
      ecrireln(x, 'exit,s.'); excfich(x, b); si non b alors halte;
      bvarini; bvarlis(t, 1, l);
      exis := l > 0
    fin;

  debut
    si existant('bonjvar   ') alors
      debut
        bvarini; bvarlis(t, 1, l);
        si l = 0 alors allervoir sinon exis := vrai
      fin
    sinon allervoir;
    bvarmoa('groupe1   ', '+         ')
  fin;


procedure termvars;
  const
    lmax = 250;
    imax = 10;
  var
    t: tableau [1..lmax] de alfa;
    l: entier;
    k: 1..lmax;
    i: 0..imax;
    x: texte;
    b: booleen;
    u: booleen;
  debut
    si ok et inter alors
      si existant('bonjvar   ') alors
        debut
          bvarlis(t, lmax, l); u := faux;
          pour k := 1 haut l faire
            debut
              i := 0; b := faux;
              tantque non b et (i < imax) faire
                debut i := i + 1; si t[k, i] = '%' alors b := vrai fin;
              si b et (t[k] <> 'bonjour%dp') et (t[k] <> 'bonjour%hp')
                  alors u := vrai;
              si non b alors bvareli(t[k])
            fin;
          bvarter;
          si u alors
            debut
              ecrireln(x, 'lib,c,bonjvar.');
              ecrireln(x, 'exit,s.'); excfich(x, b); si non b alors halte
            fin
          sinon si exis alors
            debut
              ecrireln(x, 'lib,p,n=bonjvar.');
              ecrireln(x, 'exit,s.'); excfich(x, b); si non b alors halte
            fin
        fin
      sinon ecrireln(' BONJVAR perdu pendant le travail.')
  fin;
(*$l'decodage des parametres.'*)


procedure decoder;

  (*$l- module 'opt'*)
  (*$i'opt'/'sysi'*)
  (*$l=*)

  debut
    optinit('bonjour   ');
    optb('e', inter, pare);
    optb('i', faux, pari);
    optb('m', faux, parm);
    optb('p', inter, parp);
    optb('r', faux, parr);
    optn('u', 0, paru);
    optterm
  fin;
(*$l'salutations a l''utilisateur.'*)


var
  pren: paquet tableau [1..20] de car;
  lpre: 0..20;


(*$l- module 'usa'*)
(*$i'usa'/'sysi'*)
(*$l=*)


procedure initsalu;
  var
    dat: alfa;
    heu: alfa;
    datp: alfa;
    heup: alfa;
    b: booleen;

  (*$l- module 'dat'*)
  (*$i'dat'/'sysi'*)
  (*$l=*)

  debut
    si ok et inter alors
      debut
        usapre(pren); lpre := lon(pren); date(dat); heure(heu);
        si lpre = 0 alors ecrire(' Bonjour chez vous!!!')
        sinon ecrire(' Bonjour, ', pren: lpre, '!');
        ecrireln('   (ver. 3.0.3)   ', dat, ' ', heu: 5, '.');
        si parp alors
          debut
            datp := blancs; bvarcoa('bonjour%dp', datp);
            heup := blancs; bvarcoa('bonjour%hp', heup);
            si (datp <> blancs) ou (heup <> blancs) alors
              ecrireln(' Session précédente: ',
                  datp, ' ', heup: 5, '.')
          fin;
        bvarmoa('bonjour%dp', dat); bvarmoa('bonjour%hp', heu)
      fin
  fin;


procedure termsalu;
  debut
    si inter alors
      debut
        si ok alors
          si nousag = 6 alors ecrireln('0Prends soin de toi, Claude.')
          sinon si lpre = 0 alors ecrireln(' Bonsoir bien!')
          sinon ecrireln(' Bonsoir ', pren: lpre, '!')
        sinon ecrireln(' Quelque chose ne va pas avec BONJOUR!?!');
        ecrireln
      fin
    fin;
(*$l'preparations de l''execution.'*)


procedure preparer;
  var
    a: alfa;

  (*$l- module 'glob'*)
  (*$i'glob'/'sysi'*)
  (*$l=*)

  procedure filename(var f: texte; var a: alfa);
    externe;

  debut
    si ok alors globajo('sysb      ');
    si ok et pari alors
      debut
        ex := vrai;
        si inter alors a := 'bonjini   ' sinon a := 'bonjlot   ';
        ecrire(exc, 'lib,l,', a: 7);
        si paru > 0 alors ecrire(exc, ',u=', paru: 1);
        ecrireln(exc, ',cnt,l=0.');
        ecrireln(exc, 'exec,f=', a: 7, ',r=f,a,lib.');
        ecrireln(exc, 'return,', a: 7, '.')
      fin;
    si ok et parm alors
      debut
        ex := vrai;
        ecrireln(exc, 'mu,li=r;lm=*.')
      fin;
    si ok et pare alors
      si inter alors
        debut
          filename(exc, a); ex := vrai;
          ecrireln(exc,'return, ', a: lon(a), '.');
          si parr alors
            ecrireln(exc, 'edit,n. bonjour 3.0.3')
          sinon
            ecrireln(exc, 'edit.   bonjour 3.0.3');
        fin
      sinon
        debut
          ok := faux;
          message('EDIT en interactif seulement.')
        fin
  fin;
(*$l'execution proprement dite.'*)


procedure executer;
  debut
    si ok et ex alors
      debut
        si inter alors ecrireln('@/m**$');
        bvarter;
        intterm;
        ecrireln(exc, 'exit,s.'); excfich(exc, ok);
        intinit;
        bvarini;
        si inter alors ecrireln('@/m**1');
        si non ok alors message('Erreur durant l''exécution.')
      fin
  fin;




debut
  init;
    initvars; decoder;
      initsalu;
        preparer;
        executer;
      termsalu;
    termvars;
  term
fin.                         francois pinard, mars 1981.