# LBR (format de fichier)

Le format de fichier LBR (abréviation de Library, « bibliothèque » en anglais) est un format de fichier d'archive utilisé sur les systèmes d'exploitation CP/M et MS-DOS au début des années 1980. Les Fichiers LBR étaient générés par le programme LU, puis NULU. De nombreux outils tels que LT et QL sont capables d'extraire des archives LBR.

## Historique

Le format de fichier LBR, ressemble au format de fichier tar. Les fichiers membres sont enregistrées dans le fichier archive, sans compression. Comme le transfert de fichiers LBR par modem était commun, il était pratique courante pour l'archivage d'une collection de fichiers de les compresser en utilisant les programmes SQ ou CRUNCH puis de les stocker dans une archive LBR. Plus rarement, les fichiers membres étaient assemblés dans une archive LBR qui était alors compressée avec un logiciel comme SQ ou CRUNCH ; L'archive compressée prenait alors l'extension ".LQR" ou ".LQZ"
La popularité de LBR a décliné avec celle du système d'exploitation CP/M. Le développement de l'outil d'archivage de fichiers ARC (archive compressée), très présent sous MS-DOS, a fortement contribué à la disparition des archives LBR.

## Structure d'une archive

Une archive LBR est un fichier de données logiquement divisé en une ou plusieurs parties appelées membres. Ces fichiers sont traités comme des fichiers à accès direct par les programmes ; ils peuvent toutefois être parcourus comme des fichiers à accès séquentiels en toute sécurité.
Les membres sont identifiés par un nom qui peut avoir jusqu'à 8 caractères, et une extension de 3 caractères au plus. La règle de nommage est celle des fichiers sous CP/M-80. Chaque combinaison d'un nom et d'une extension doit être un identifiant unique dans l'archive.
Une archive doit contenir, au minimum, un membre, le répertoire (directory en anglais), et peut contenir un nombre quelconque d'autres membres, jusqu'à la limite imposée par le système d'exploitation. L'archive peut également contenir des secteurs non utilisés, auxquels ne sont assignés aucun membre : ces secteurs peuvent résulter de la destruction de membres ou d'une opération d'adjonction qui a échoué.
Aucune contrainte ne porte sur le contenu des membres, sauf pour le répertoire, qui est toujours le premier membre de l'archive, et qui a un format spécifique. Conceptuellement, l'archive dans son entier et chacun de ses membres sont organisés en "secteurs" de 128 octets de long. Chaque secteur appartient au plus à un membre de l'archive. Chaque membre comprend un nombre entier de secteurs. Toutefois, le dernier secteur d'un membre peut être déclaré comme "secteur court" : bien qu'il ait la même taille que les autres secteurs, le "secteur court", comprenant moins de 128 octets de données, est complété par des octets de bourrage.
Le début et la fin d'un membre sont définis par un pointeur dans le répertoire. Les secteurs ne peuvent pas être imbriqués : tous les octets entre le début et la fin d'un membre appartiennent à ce membre. L'archive peut assembler les membres dans un ordre différent de celui dans lequel apparaissent leurs identifiants. Ainsi le fichier LBR peut toujours proposer un "répertoire" trié, sans avoir à déplacer physiquement les membres eux-mêmes.

## Format du "répertoire"

Le répertoire est le premier membre d'une archive LBR et doit commencer au secteur 0 du fichier. Il doit comprendre au moins un secteur, et peut être allongé autant que le système d'exploitation le permet.
Chaque entrée débute par une marque d'état : active, détruite, inutilisée. La première entrée est toujours active, et correspond au répertoire lui-même.
Les entrées inutilisées prennent toujours place après les entrées actives et les entrées détruites.

### Format d'une entrée de répertoire

Les 32 octets d'une entrée de répertoire sont répartis comme suit :
| Octet(s) | Signification |
| 0 | STATUS Les valeurs possibles sont : * 00 Entrée active * FE Entrée supprimée * FF Entrée inutilisée |
| 1-8 | NOM (il suit les règles de nommage des noms de fichiers) |
| 9-11 | EXTENSION (il suit les mêmes règles que le nom) |
| 12-13 | INDEX (pointeur sur le premier secteur du membre) |
| 14-15 | LONGUEUR (longueur du membre, en secteurs) |
| 16-17 | CRC (contrôle de redondance cyclique, calculé avec l'algorithme du CCITT utilisé pour le protocole XModem |
| 18-19 | DATE DE CREATION (nombre de jours depuis le 31 décembre 1977; la valeur 0 indiquant que l'information n'est pas disponible) |
| 20-21 | DATE DE (dernière) MODIFICATION (au même format que la date de création) |
| 22-23 | HEURE DE CREATION (5 bits pour l'heure, 6 bits pour les minutes, 5 bits pour les bi-secondes) |
| 24-25 | HEURE DE (dernière) MODIFICATION (au même format que l'heure de création) |
| 26 | PAD COUNT (nombre d'octets de bourrage, utilisés pour les systèmes avec lesquels la longueur d'un fichier n'est pas nécessairement un multiple de 128 octets) |
| 27-31 | FILLER (mis à 0 et réservés pour un usage futur) |