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).
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.
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.
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.
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.
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()
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()
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()
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()
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()
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()
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.
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).
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.
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.