(*$d-*)
(*$s-*)
program ppsy(input,output);
uses crt,ulogo;
const	phpsy=1;
	nk=250;		(* nombre de mots clés *)
	ns=100; 	(* nombre de groupes de mots clé *)
	nb=600;		(* nombre de reponses - a diminuer si < 512 k. *)
	nbmemo=10;	(* nombre de phrases mémorisées *)
	nt=30;		(* nombre de mots a échanger *)
	nc=80;		(* taille d'une ligne *)
	nm=20;		(* taille d'un mot *)
type
	tstring=string[90];
	pmmot=packed array [1..nm] of char;
	lig=packed array[1..nc] of char;
	plig=^lig;
	ksr = record	(* descripteur d'un groupe de mots clé *)
		nrep	:integer;	(* nombre de réponses *)
		rep	:integer;	(* numéro 1ère réponse *)
		alea	:integer;	(* pointeur dans les réponses *)
		imem	:boolean;	(* phrase … mémoriser *)
		end;
	keyt = record	(* descripteur d'un mot clé *)
		psr	:integer;	(* numéro du groupe *)
		key	:pmmot;		(* caractères du mot *)
		nckey	:integer;	(* nombre de caractères *)
		end;
var
	tposi		:array[1..nc] of integer; (* index des mots dans
						la phrase *)
	tkey		:array[1..nk] of keyt;	(* table des cles *)
	tsr		:array[1..ns] of ksr;	(* table des groupes *)
	ttrad1		:array[1..nt] of pmmot; (* mot1 a echanger *)
	ttrad2		:array[1..nt] of pmmot; (* mot2 a echanger *)
	nctrad1		:array[1..nt] of integer; (* taille mot1 *)
	nctrad2		:array[1..nt] of integer; (* taille mot2 *)
	ntrad		:integer;	(* nombre de mots a echanger *)
	memolig		:array[1..nbmemo] of lig; (* phrases mémorisées *)
	memomi		:array[1..nbmemo] of integer; (* taille des mémo*)
	tbar		:array[0..nb] of plig;  (* table phrases *)
	nbar		:integer;	(* nombre phrases *)

	indoc		:integer;	(* fin du programme *)
	mem		:boolean;	(* phrase … mémoriser *)
	nkey		:integer;	(* nombre de cles *)
	nsr		:integer;	(* nombre de groupes *)
	logne,lagne	:pmmot;		(* mots a echanger *)
	sli		:lig;		(* ligne frappee precedente *)
	ligne		:lig;		(* ligne frappee *)
	phrase		:plig;		(* message *)
	psy		:text;		(* fichier de données *)
	c_		:tstring;
	z		:boolean;
	mi,smi		:integer;	(* taille de la phrase frappée *)
	la,sla		:integer;	(* pointeur dans la phrase *)
	xmem,ymem,zmem,imm:integer;
	sm1,sm2,sm3	:integer;
	i,j,k,ik,is	: integer;
	nr,vi,id,n1,n2,xx,xxx,y,pz:integer;
	az,x		:integer;
	car		:char;
	ind,posi	:integer;

	(* quelques procédures pour remplacer celles de Pmais *)
procedure aleat;
begin	(* tu dis oui, ou tu dis non ? *)
z :=  not z;
end;

procedure ecrnom;
begin
write(output,'schmoldu ');
end;

procedure lirepsy(x:integer);
var	i,j:integer;
begin		(* lecture d'une ligne du fichier psy.txt *)
read(psy,c_);
for i := 1 to nc do	ligne[i] := ';';
j := length(c_);
for i := 1 to j do	ligne[i] := c_[i];
readln(psy);
xxx := nbar+1;
end;

procedure stomes(i:integer);
begin		(* stockage d'une phrase de réponse *)
nbar := nbar+1;
new(tbar[nbar]);
tbar[nbar]^ := ligne;
end;

procedure liremes(x:integer);
begin		(* reprise d'une phrase de réponse *)
phrase^ := tbar[x]^;
end;

procedure lirephrase;
var	i:integer;	cc:char;
begin		(* lecture d'une phrase *)
write(output,' ? ');	read(input,c_);	readln(input); writeln(output);
for i := 1 to 80 do	ligne[i] := ' ';
j := length(c_);
for i := 1 to j do
	begin	(* on enlève les accents *)
	cc := c_[i];
	(* if (cc = 'é') or (cc = 'è') or (cc = 'ê') then	cc := 'e'; *)
	if cc in ['A'..'Z'] then cc := chr(ord(cc)+ord('a')-ord('A'));
	ligne[i] := cc;
	end;
smi := j;
if smi <> 0	then	smi := smi+1;
end;

(*$i psymais.gen *)

procedure inipsy;
begin		(* initialisations *)
nbar := 0;	z := true;
new(phrase);
assign(psy,'psy.txt');
(*$i-*) reset(psy); (*$i+*)
if ioresult <> 0
then	begin
	writeln(output,'où as tu mis le fichier psy.txt ?');
	halt;
	end;
initpsy;
close(psy);
end;
						(***************)
begin						(* code de psy *)
logo('psy','dialogue et analyse psychiatrique','');(***************)
inipsy;
writeln(output,'quels sont tes problèmes, bibiche');
indoc := 0;
while indoc = 0 do
	begin
	lirephrase;		(* lecture d'une phrase *)
	if c_ = 'fin' then	indoc := 1;
	if indoc = 0
	then	begin
		pentree;	(* séparation de la phrase en mots *)
		if mi <> 0
		then	begin
			psyc;	(* recherche des mots cle *)
			repon;	(* réponse *)
			end;
		end;
	end;
end.
