/* programme pour compter les mots. Testé avec Borland C++ compilé en C en modèle small */ #include #include #include #include #include #define BUFFER_SIZE 0x8000 /* taille max d'un block */ int main(int, char **); int main(int argc, char **argv) { int Handle; unsigned int BlockSize; long FileSize; unsigned long WordCount = 0; char *Buffer, CharFlag = 0, PredCharFlag, *BufferPtr, Ch; if (argc != 2) { printf("syntaxe: wc \n"); exit(1); } if ((Buffer = malloc(BUFFER_SIZE)) == NULL) { printf("ne peut pas allouer la mémoire adéquate\n"); exit(1); } if ((Handle = open(argv[1], O_RDONLY | O_BINARY)) == -1) { printf("ne peut pas ouvrir le fichier %s\n", argv[1]); exit(1); } if ((FileSize = filelength(Handle)) == -1) { printf("erreur de taille du fichier %s\n", argv[1]); exit(1); } /* Traitement par blocs */ while (FileSize > 0) { /* récupère le prochain bloc */ FileSize -= (BlockSize = min(FileSize, BUFFER_SIZE)); if (read(Handle, Buffer, BlockSize) == -1) { printf("Erreur de lecture du fichier %s\n", argv[1]); exit(1); } /* Compte les mots dans le bloc */ BufferPtr = Buffer; do { PredCharFlag = CharFlag; Ch = *BufferPtr++ & 0x7F; CharFlag = ((Ch >= 'a') && (Ch <= 'z')) || ((Ch >= 'A') && (Ch <= 'Z')) || ((Ch >= '0') && (Ch <= '9')) || (Ch == '\''); if ((!CharFlag) && PredCharFlag) { WordCount++; } } while (--BlockSize); } /* traite le denier mot, si nécessaire */ if (CharFlag) { WordCount++; } printf("\nbre Total de mots dans le fichier: %lu\n", WordCount); return(0); }