#include #include #include #include "projet.h" /* V‚rifie si un fichier est ascii. On utilise cette fonction avant d'appeler rcs. Ca ‚vite des problŠmes. La fonction lit les 1000 premiers bytes du fichier et v‚rifie: 1- Longueur maximum d'un ligne == 250 2- Seul le set ascii visible >= 32 et < 128, les caractŠres de controles \r \n ^l, et les caractŠres fran‡ais suivant ‚Š…—ƒˆ“–‡ (IBM PC et ISO LATIN). Retourne -1 si fichier pas ASCII. */ int ascii_test (const char *fname) { char accept[256]; memset (accept,'\0',sizeof(accept)); accept['\n'] = 1; accept['\r'] = 1; accept['\t'] = 1; accept[12] = 1; // ^L form feed accept[26] = 1; // ^Z for (int i=' '; i<128; i++) accept[i] = 1; // CaractŠres fran‡ais. J'aurais pu ecrire accept['‚'] = 1. // Ca aurait ‚t‚ plus joli. Mais le pr‚processeur (pcpp) traduit // de IBM-PC … ISO en compilant. Ce source n'aurait pas ‚t‚ portable. // CaractŠres fran‡ais du IBM PC accept['\202'] = 1; // ‚ accept['\205'] = 1; // … accept['\212'] = 1; // Š accept['\227'] = 1; // — accept['\203'] = 1; // ƒ accept['\210'] = 1; // ˆ accept['\214'] = 1; // Œ accept['\223'] = 1; // “ accept['\226'] = 1; // – accept['\207'] = 1; // ‡ // CaractŠres fran‡ais systŠme ISO accept['\351'] = 1; // ‚ accept['\340'] = 1; // … accept['\350'] = 1; // Š accept['\371'] = 1; // — accept['\342'] = 1; // ƒ accept['\352'] = 1; // ˆ accept['\356'] = 1; // Œ accept['\364'] = 1; // “ accept['\373'] = 1; // – accept['\347'] = 1; // ‡ int ret = -1; FILE *fin = fopen_err (fname,"rb",0); if (fin != NULL){ char buffer[1000]; int len = fread(buffer,1,1000,fin); fclose (fin); /* #Sp‚cification: archivage / fichiers binaires Un fichier vide est consid‚r‚ comme un fichier ASCII. */ if (len >= 0){ char *pt = buffer; char *deblin = buffer; ret = 0; buffer[len] = '\0'; for (; len > 0; len--){ char carac = *pt++; if (carac == '\0'){ // \0 au milieu du texte #ifdef TEST printf ("0 au milieu\n"); #endif ret = -1; break; }else if (carac == '\r' && pt[0] != '\n' && len > 1){ // \r pas … la fin d'une ligne #ifdef TEST printf (" au milieu\n"); #endif ret = -1; break; }else #if 0 if (!accept[carac]){ ret = -1; break; }else #endif if (carac == '\n'){ if ((int)(pt-deblin) > 250){ #ifdef TEST printf ("Ligne trop longue\n"); #endif ret = -1; break; } deblin = pt; } } if ((int)(pt-deblin) > 250){ ret = -1; } } } return ret; } #ifdef TEST #include int main(int argc, char *argv[]) { int arg1 = 1; int nbsub = 0; if (strcmp(argv[1],"-s")==0){ nbsub = 100; arg1 = 2; } for (int i=arg1; i