LibSAP

LibSAP est une librarie de manipulation des archives SAP écrite en ANSI C. Elle fournit à la fois des routines de manipulation bas-niveau des archives SAP considérées comme format physique (images de disquettes) et des routines de manipulation haut-niveau des archives SAP considérées comme format logique (compatible avec le DOS BASIC Thomson).

Ouverture d'une archive SAP

sapID sap_OpenArchive(const char filename[], int *format);
filename : nom de l'archive SAP
format : retour du format de l'archive SAP (sap_FORMAT1 ou sap_FORMAT2)

Retourne l'identificateur de l'archive SAP. En cas d'erreur, sap_ERROR est retourné et sap_errno contient l'un des codes d'erreur suivants:
SAP_ETOOMANY : trop d'archives SAP sont ouvertes simultanément.
SAP_ENOENT : l'archive SAP spécifiée n'existe pas.
SAP_EBADF : le fichier spécifié n'est pas une archive SAP.

Création d'une archive SAP

sapID sap_CreateArchive(const char filename[], int format);
filename : nom de l'archive SAP
format : format de l'archive SAP (sap_FORMAT1 ou sap_FORMAT2)

Retourne l'identificateur de l'archive SAP. En cas d'erreur, SAP_ERROR est retourné et 'sap_errno' contient l'un des codes d'erreur suivants:
SAP_ETOOMANY : trop d'archives SAP sont ouvertes simultanément.
SAP_EPERM : impossible de créer le fichier sur le support d'enregistrement.

Fermeture d'une archive SAP

int sap_CloseArchive(sapID id);
id : identificateur de l'archive SAP

Retourne SAP_OK. En cas d'erreur, SAP_ERROR est retourné et 'sap_errno' contient l'un des codes d'erreur suivants:
SAP_EINVAL : le numéro d'identification (sapID) est invalide.

Remplissage une archive SAP

int sap_FillArchive(sapID id, sapsector_t *sapsector);
id : identificateur de l'archive SAP
sapsector : pointeur sur la structure de secteur

Cette routine remplie une archive créée par sap_CreateArchive() secteur par secteur, en commençant par le secteur 1 de la piste 0. A chaque appel le numéro de secteur est incrémenté de 1 et, si la piste courante devient pleine, la piste suivante est sélectionnée.
Retourne SAP_OK. En cas d'erreur, SAP_ERROR est retourné et 'sap_errno' contient l'un des codes d'erreur suivants:
SAP_EINVAL : le numéro d'identification (sapID) est invalide.
SAP_ENOSPC : l'archive SAP est pleine.

Lecture d'un secteur SAP

int sap_ReadSector(sapID id, int track, int sect, sapsector_t *sapsector);
id : identificateur de l'archive SAP
track : numéro de piste
sect : numéro de secteur
sapsector : pointeur sur la structure de secteur

Le résultat de la lecture est dans la structure désignée par 'sapsector'.
Retourne SAP_OK ou une combinaison des flags suivants:
SAP_NO_STD_FMT : le format du secteur est non standard.
SAP_PROTECTED : le secteur est protégé en écriture.
SAP_BAD_SECTOR : le secteur a de mauvais identificateurs (piste, secteur)
SAP_CRC_ERROR : erreur de CRC sur les données du secteur.

En cas d'erreur, SAP_ERROR est retourné et 'sap_errno' contient l'un des codes d'erreur suivants:
SAP_EINVAL : le numéro d'identification (sapID) est invalide.
SAP_EEMPTY : l'archive SAP est vide. SAP_EBUSY : l'archive SAP est en train d'être remplie par sap_FillArchive()

Lecture d'une série de secteurs SAP

int sap_ReadSectorEx(sapID id, int track, int sect, int nsects, unsigned char data[]);
id : identificateur de l'archive SAP
track : numéro de piste de départ
sect : numéro de secteur de départ
nsect : nombre de secteurs à lire
data : pointeur sur le buffer de secteurs

Retourne SAP_OK. En cas d'erreur, SAP_ERROR est retourné et 'sap_errno' contient l'un des codes d'erreur suivants:
SAP_EINVAL : le numéro d'identification (sapID) est invalide.
SAP_EEMPTY : l'archive SAP est vide. SAP_EBUSY : l'archive SAP est en train d'être remplie par sap_FillArchive()

Écriture d'un secteur SAP

int sap_WriteSector(sapID id, int track, int sect, sapsector_t *sapsector);
id : identificateur de l'archive SAP
track : numéro de piste
sect : numéro de secteur
sapsector : pointeur sur la structure de secteur

Tous les champs du secteur doivent être spécifiés, exceptés les deux champs relatifs au CRC qui seront calculés par la routine elle-même.
Retourne SAP_OK. En cas d'erreur, SAP_ERROR est retourné et 'sap_errno' contient l'un des codes d'erreur suivants:
SAP_EINVAL : le numéro d'identification (sapID) est invalide.
SAP_EEMPTY : l'archive SAP est vide. SAP_EBUSY : l'archive SAP est en train d'être remplie par sap_FillArchive()

Écriture d'une série de secteurs SAP

int sap_WriteSectorEx(sapID id, int track, int sect, int nsects, const unsigned char data[]);
id : identificateur de l'archive SAP
track : numéro de piste de départ
sect : numéro de secteur de départ
nsect : nombre de secteurs à écrire
data : pointeur sur le buffer de secteurs

Retourne SAP_OK. En cas d'erreur, SAP_ERROR est retourné et 'sap_errno' contient l'un des codes d'erreur suivants:
SAP_EINVAL : le numéro d'identification (sapID) est invalide.
SAP_EEMPTY : l'archive SAP est vide. SAP_EBUSY : l'archive SAP est en train d'être remplie par sap_FillArchive()

Formatage d'une archive SAP

int sap_FormatArchive(sapID id, int capacity);
id : identificateur de l'archive SAP
capacity : sap_TRK80 (80 pistes) ou sap_TRK40 (40 pistes)

Retourne SAP_OK. En cas d'erreur, SAP_ERROR est retourné et 'sap_errno' contient l'un des codes d'erreur suivants:
SAP_EINVAL : le numéro d'identification (sapID) ou le format est invalide.
SAP_EBUSY : l'archive SAP est en train d'être remplie par sap_FillArchive()

Récupération d'un répertoire SAP

int sap_ListArchive(sapID id, char buffer[], int buffer_size);
id : identificateur de l'archive SAP
buffer : buffer de répertoire
buffer_size : taille du buffer de répertoire

Retourne le nombre de lignes de la liste. En cas d'erreur, 0 est retourné et 'sap_errno' contient l'un des codes d'erreur suivants:
SAP_EINVAL : le numéro d'identification (sapID) est invalide.
SAP_EEMPTY : l'archive SAP est vide. SAP_EBUSY : l'archive SAP est en train d'être remplie par sap_FillArchive()

Ajout d'un fichier à l'archive SAP

int sap_AddFile(sapID id, const char filename[]);
id : identificateur de l'archive SAP
filename : nom du fichier à ajouter

Retourne la taille du fichier en octets. En cas d'erreur, 0 est retourné et 'sap_errno' contient l'un des codes d'erreur suivants:
SAP_EINVAL : le numéro d'identification (sapID) est invalide.
SAP_EEMPTY : l'archive SAP est vide. SAP_EBUSY : l'archive SAP est en train d'être remplie par sap_FillArchive()
SAP_ENOENT : le fichier n'existe pas. SAP_ENFILE : le fichier est vide. SAP_ENOSPC : le répertoire de l'archive SAP est plein.
SAP_EFBIG : le fichier est trop gros pour l'espace libre de l'archive SAP.

Effacement de fichier(s) de l'archive SAP

int sap_DeleteFile(sapID id, const char pattern[]);
id : identificateur de l'archive SAP
pattern : pattern des fichiers à effacer ('*' et '?' sont supportés)

Retourne la taille du (des) fichier(s) en octets. En cas d'erreur, 0 est retourné et 'sap_errno' contient l'un des codes d'erreur suivants:
SAP_EINVAL : le numéro d'identification (sapID) est invalide.
SAP_EEMPTY : l'archive SAP est vide. SAP_EBUSY : l'archive SAP est en train d'être remplie par sap_FillArchive()
SAP_ENOENT : le fichier n'existe pas dans l'archive SAP (erreur non valide lorsque pattern contient au moins une wilcard).

Extraction de fichier(s) de l'archive SAP

int sap_ExtractFile(sapID id, const char pattern[]);
id : identificateur de l'archive SAP
pattern : pattern des fichiers à extraire ('*' et '?' sont supportés)

Retourne la taille du (des) fichier(s) en octets. En cas d'erreur, 0 est retourné et 'sap_errno' contient l'un des codes d'erreur suivants:
SAP_EINVAL : le numéro d'identification (sapID) est invalide.
SAP_EEMPTY : l'archive SAP est vide. SAP_EBUSY : l'archive SAP est en train d'être remplie par sap_FillArchive()
SAP_ENOENT : le fichier n'existe pas dans l'archive SAP (erreur non valide lorsque 'pattern' contient au moins une wilcard). SAP_EPERM : impossible d'écrire le ou les fichiers sur le support.

Lecture des informations de fichier

int sap_GetFileInfo(sapID id, const char filename[], sapfileinfo_t *info);
id : identificateur de l'archive SAP
filename : nom du fichier à examiner
info : pointeur sur la structure d'information

Retourne SAP_OK. En cas d'erreur, SAP_ERROR est retourné et 'sap_errno' contient l'un des codes d'erreur suivants:
SAP_EINVAL : le numéro d'identification (sapID) est invalide.
SAP_EEMPTY : l'archive SAP est vide. SAP_EBUSY : l'archive SAP est en train d'être remplie par sap_FillArchive()
SAP_ENOENT : le fichier n'existe pas dans l'archive SAP.