home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 4 / Apprentice-Release4.iso / Languages / Caml Light 0.7 / examples / grep / grep.ml < prev    next >
Encoding:
Text File  |  1995-06-01  |  1.5 KB  |  55 lines  |  [TEXT/MPS ]

  1. #open "expr";;
  2. #open "auto";;
  3. #open "determ";;
  4.  
  5. let ligne_trouvée = ref false;;
  6.  
  7. let grep_sur_canal auto nom_fich canal =
  8.   try
  9.     while true do
  10.       let ligne = input_line canal in
  11.       if reconnaît auto ligne then begin
  12.         ligne_trouvée := true;
  13.         print_string nom_fich;
  14.         print_string": ";
  15.         print_endline ligne
  16.       end
  17.     done
  18.   with End_of_file -> ();;
  19.  
  20. let grep_sur_fichier auto nom_fich =
  21.   try
  22.     let canal = open_in nom_fich in
  23.     try grep_sur_canal auto nom_fich canal; close_in canal
  24.     with exc -> close_in canal; raise exc
  25.   with sys__Sys_error message ->
  26.     prerr_string "Erreur sur le fichier ";
  27.     prerr_string nom_fich;
  28.     prerr_string ": ";
  29.     prerr_endline message;;
  30.  
  31. let construire_auto expr =
  32.   déterminise(expr_vers_automate(lire(stream_of_string expr)));;
  33.  
  34. let grep expr fichier =
  35.   grep_sur_fichier (construire_auto expr) fichier;;
  36.  
  37. if sys__interactive then () else
  38.   if vect_length sys__command_line < 2 then begin
  39.     prerr_endline "Utilisation: grep <motif> <fichiers>";
  40.     exit 2
  41.   end else begin
  42.     let auto =
  43.       try construire_auto sys__command_line.(1)
  44.       with Parse_error | Parse_failure ->
  45.         prerr_endline "Erreur de syntaxe dans l'expression";
  46.         exit 2 in
  47.     if vect_length sys__command_line >= 3 then
  48.       for i = 2 to vect_length sys__command_line - 1 do
  49.         grep_sur_fichier auto sys__command_line.(i)
  50.       done
  51.     else
  52.       grep_sur_canal auto "(entrée standard)" std_in;
  53.     exit (if !ligne_trouvée then 0 else 1)
  54.   end;;
  55.