#include #include #include #include "etc.h" #include "etc.m" /* Ouverture d'un fichier dans un répertoire virtuel. (voir les fonction vdir_xxxx) Vérifie si le path fname correspond existe localement ou dans l'archive. Si le fichier est ouvert en écriture pour ajout et que le fichier est présent dans l'archive et pas localement, le fichier sera copier localement avant l'ouverture. Retourne NULL si erreur ou ne peut ouvrir ou fichier existe pas. Attention: L'ouverture en écriture seulement est identique à fopen (un peu plus lent peut-être). */ export FILE *vfopen_err ( const char *fname, const char *mode, int quit) /* Termine execution si erreur */ { char reel[MAXSIZ_PATH]; int exist = vdir_exist (fname,reel); if (exist == 2){ /* Le fichier est présent dans l'archive. Si ouverture pour modification (pas seulement écriture), on doit copier le fichier */ if (strchr(mode,'a') != NULL || strchr(mode,'+') != NULL){ if (file_copyp(reel,fname)==-1){ if (quit){ fprintf (stderr,MSG_U(E_CANTCOPY ,"Ne peut pas copier %s -> %s\n") ,reel,fname); exit (-1); } return NULL; } }else if (strchr(mode,'w')==NULL){ fname = reel; } } return fopen_err (fname,mode,quit); } /* Ouvre un fichier en mode binaire avec message d'erreur retourne NULL si peut ouvrir */ export FILE *vfopen_bin( const char *fname, const char *mode) { #if defined(MSDOS) || defined(OS2) || defined (NT) char newmod[10]; if (strchr(mode,'b') == NULL){ newmod[0] = *mode++; newmod[1] = 'b'; strcpy (newmod+2,mode); return vfopen (fname,newmod); } #endif return vfopen (fname,mode); } /* Ouvre un fichier en mode binaire avec message d'erreur retourne NULL si peut ouvrir */ export FILE *vfopen_binerr( const char *fname, const char *mode, int quit) { FILE *f = vfopen_bin (fname,mode); if (f == NULL){ fopen_prterr (fname,strchr(mode,'r')!=NULL,quit); } return f; }