ETAT_BIN: A SuperBASIC Extension

See all articles from QL_DOC n12
Author(s): W. Lenerz
Publication: QL_DOC
Pub Details: QL_DOC n12 (Issue 12)
Date: October-November 1989
Pages: 5-7

In English: ETAT_BIN by W. Lenerz, from the QLCF, adds a SuperBASIC function ETAT that tests whether a file exists before a program tries to copy or open it, returning 0 or the QDOS error code instead of stopping the program with an error. The article explains how to load and call it, gives two usage examples (one a safe file-copy routine), and lists the commented 68000 assembler source, a table of the returned codes, and a universal BASIC loader (CHARGEUR_BAS) with the DATA lines that create ETAT_BIN.

Printed title: ETAT_BIN. The article below is in French, as printed in QL_DOC n12 (October-November 1989).


Ce nouveau mot-clé S-Basic peut vous aider dans la manipulation de vos fichiers. En effet, un des désavantages du S-Basic est que, lorsqu’on veut faire une opération sur un fichier (copie, ouverture etc…) et que celui-ci n’existe pas, le S-Basic s’arrête avec une erreur. Ce n’est pas grave lorsqu’on travaille en mode directe, mais c’est embêtant dans un programme, car l’erreur va arrêter le programme. ETAT est une nouvelle fonction qui vous permettra de tester l’état d’un fichier avant de faire une opération dessus.

Le nouveau mot-clé se charge par:

a=RESPR(200): LBYTES <unité>_etat_bin,a:CALL a

Vous disposez à ce moment d’une nouvelle fonction, appelée ETAT.

Syntaxe: ETAT (“nom_du_fichier”); où nom_du_fichier doit être le nom du fichier à tester, y compris le nom de l’unité microdrive, disquette ou ramdisque. Ce nom doit être compris entre guillemets et entre parenthèses. Cependant, on peut utiliser aussi un nom de variable, qui contient le nom du fichier. Dans ce cas, il ne faut plus mettre les guillemets – mais il faut toujours mettre les parenthèses (v. exemple 2). Le nouveau mot-clé ETAT est une fonction. Il faut donc l’utiliser dans des lignes du genre: PRINT ETAT (‘nom du fichier’) ou LET a=ETAT(‘Nom du fichier’). La fonction ETAT vous renverra un code d’erreur. Si ce code est égal à 0, le fichier en question existe sur l’unité en question. Sinon, la valeur renvoyée par ETAT correspond aux différents codes d’erreur du QDOS. Vous trouverez dans le manuel du QL (section ‘CONCEPTS’ – titre ‘Error Handling’) le sens de chacun des codes d’erreur (négatifs) ren-voyés.

EXEMPLES D’UTILISATION

Exemple.1 Utilisation en mode direct:

PRINT ETAT('mdv1_coucou')

Ceci va imprimer un chiffre à l’écran, qui correspond au code d’erreur.

Exemple 2: On demande le nom d’un fichier à copier, source et destination:

10 INPUT "Vous voulez copier quel fichier ?";a$
20 testa=ETAT(a$)
30 IF testa<>0 THEN PRINT "Ce fichier n'existe pas!":
GOTO 10
40 INPUT "Copier vers quel fichier?";b$
50 testb=ETAT(b$)
60 IF testb<>-7 THEN PRINT "Ce fichier existe déjà ou
est en usage!":GOTO 40
70 COPY a$ TO b$

ETAT_BIN de W. Lenerz (QLCF)

*******************************
* ETAT_BIN *
* de W. Lenerz *
* source QLCF *
*******************************
debut MOVE.W $110,A2 Vecteur pour lier mots dans la liste
LEA procs,A1 des mots S-basic
JMP (A2) A1 pointe vers le mots-clé
procs DC.W 0 nombre de procédures
DC.W 0 fin des procédures
DC.W 1 nombre de fonctions
DC.W etat-* pointeur vers début de la routine
DC.B 4 longueur du nom
DC.B 'ETAT' nom
DC.L 0 fin du bloc de définition
etat MOVEA.W $0116,A0 vecteur pour chercher un paramètre alpha, qui
JSR (A0) est mis sur le pile, avec un mot indiquant
TST.L D0 sa longueur. Ce paramètre, c'est le nom du fichier
BNE.S sortie si erreur: on sort
CMPI.W #1,D3 D3 contient le nombre de paramètres
BNE.S sortie si <> de 1, il y a une erreur: on sort
MOVE.L A1,A2 A1 (et maintenant A2) pointe vers la pile, par rapport
ADDA.L A6,A2 à A6. En additionnant A6, A2 en devient indépendant
MOVE.W (A2)+,D2 D2 contient le mot indiquant sa longueur
LEA buffer,A1
MOVE.W D2,(A1)+ et on le transfère dans le buffer
SUBQ.W #1,D2
boucle MOVE.B (A2)+,(A1)+
DBF D2,boucle puis on transfère le nom du fichier dans le
MOVEQ #0,D3 buffer, qu'on va utiliser pour ouvrir
MOVEQ #-1,D1 le fichier
LEA buffer,A0
MOVEQ #1,D0
TRAP #2 et on tente d'ouvrir le fichier
TST.L D0
BNE.S sortie
MOVEQ #2,D0 on referme le fichier
TRAP #2
sortie MOVEA.L $58(A6),A1 $58(A6) contient la pile S-Basic
SUBQ.W #2,A1 on se fait de la place
MOVE.L A1,$0058(A6) et on y met le paramètre de retour,
MOVE.W D0,$00(A6,A1.L) à savoir le code d'erreur contenu dans D0
MOVEQ #$03,D4 on signale qu'on va retourner un entier
MOVEQ #$00,D0
RTS et on y va
buffer DS.L 10
END
+--------------------------------------------------------+
:         Codes retournés par la fonction ETAT           :
:                                                        :
:          0       Opération OK                          :
:         -7       Fichier n'existe pas (not found)      :
:         -8       Fichier existe déjà  (already exists) :
:         -9       Fichier non-disponible (in use)       :
:        -11       Lecteur plein (drive full)            :
:        -16       Erreur d'opération                    :
:                          (bad or changed medium)       :
+--------------------------------------------------------+

Chargeur BASIC universel

100 REMark CHARGEUR_BAS
110 REMark pour QL_DOC
120 :
130 INPUT "Où sauver les codes (ex. flp1_)?";sauve$
140 IF LEN(sauve$)=0:sauve$="flp1_"
150 PRINT "Un instant s.v.p.";
160 :
170 RESTORE 1000
180 memoire=RESPR(1000):base_memoire=memoire
190 compte=0
200 :
210 REPeat boucle
220 IF EOF:EXIT boucle
230 READ octet:POKE memoire,octet:memoire=memoire+1
240 compte=compte+1
250 PRINT ".";
260 END REPeat boucle

( insérer içi les DATA nécessaires )

DATA pour la création de ETAT_BIN

900 PRINT"Une touche pour sauver "&sauve$&"ETAT_BIN "
910 PRINT "("&compte&" octets)"
920 PAUSE
930 SBYTES sauve$&"etat_bin",base_memoire,compte
940 PRINT "Ok!"
950 :
1000 DATA 52, 120, 1, 16, 67, 250, 0, 4, 78, 210
1001 DATA 0, 0, 0, 0, 0, 1, 0, 12, 4, 69
1002 DATA 84, 65, 84, 0, 0, 0, 0, 0, 48, 120
1003 DATA 1, 22, 78, 144, 74, 128, 102, 46, 12, 67
1004 DATA 0, 1, 102, 40, 36, 73, 213, 206, 52, 26
1005 DATA 67, 250, 0, 52, 50, 194, 83, 66, 18, 218
1006 DATA 81, 202, 255, 252, 118, 0, 114, 255, 65, 250
1007 DATA 0, 34, 112, 1, 78, 66, 74, 128, 102, 4
1008 DATA 112, 2, 78, 66, 34, 110, 0, 88, 85, 73
1009 DATA 45, 73, 0, 88, 61, 128, 152, 0, 120, 3
1010 DATA 112, 0, 78, 117, 0, 0, 0, 0, 0, 0
1011 DATA 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.