Advertisement
Guest User

Untitled

a guest
Dec 26th, 2014
523
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. implement Egrep;
  2.  
  3. include "sys.m";
  4.     sys: Sys;
  5.     FD: import Sys;
  6.     stdin, stderr, stdout: ref FD;
  7.  
  8. include "draw.m";
  9.     Context: import Draw;
  10.  
  11. include "regex.m"; #модуль для работы с регексами
  12.     regex: Regex;
  13.     Re: import regex;
  14.  
  15. include "bufio.m";
  16.     bufio: Bufio;
  17.     Iobuf: import bufio;
  18.  
  19. include "arg.m"; #Модуль для считывания параметров ком строки
  20.  
  21.  
  22. Egrep: module
  23. {
  24.     init:   fn(ctxt: ref Context, argv: list of string);
  25. };
  26.  
  27. init(nil: ref Context, argv: list of string)
  28. {
  29.     sys = load Sys Sys->PATH;
  30.     stdin = sys->fildes(0);
  31.     stderr = sys->fildes(2);
  32.  
  33.     arg := load Arg Arg->PATH;
  34.  
  35.     regex = load Regex Regex->PATH;
  36.  
  37.     bufio = load Bufio Bufio->PATH;
  38.  
  39.     arg->init(argv);
  40.     argv = arg->argv();
  41.     arg = nil;
  42.  
  43.     pattern := hd argv; # наш образец
  44.    
  45.     argv = tl argv; # имя входного файла
  46.  
  47.     (re, err) := regex->compile(pattern,0);  # компилируем образец для того чтобы потом с ним сравнивать
  48.    
  49.     if(re == nil) {
  50.         sys->fprint(stderr, "egrep: %s\n", err);
  51.         exit;
  52.     }
  53.  
  54.     matched := 0;
  55.    
  56.     if(argv == nil)
  57.         matched = egrep(re, bufio->fopen(stdin, Bufio->OREAD), "stdin");  # если файла нет то из командной строки берется все
  58.     else {
  59.        
  60.         f := bufio->open(hd argv, Bufio->OREAD);  # записываем содержимое файла в строку
  61.         if(f == nil)
  62.             sys->fprint(stderr, "egrep: cannot open %s:\n", hd argv);
  63.         else
  64.             matched = egrep(re, f, hd argv);
  65.     }
  66.     if (!matched)
  67.         sys->print("fail:no matches\n");
  68. }
  69.  
  70. egrep(re: Re, f: ref Iobuf, file: string): int
  71. {
  72.     matched := 0;
  73.     for(line := 1; ; line++) {
  74.         s := t := f.gets('\n');  # считываем все до перевода каретки, то есть строку
  75.         if(s == nil)
  76.             break;
  77.        
  78.         if((regex->executese(re, s, (0, len s-1), 1, 1) != nil)) {  # здесь непосредственный поиск подстроки в строке
  79.             matched = 1;
  80.             sys->print("%d:%s\n", line, t);
  81.         }
  82.     }
  83.  
  84.     return matched;
  85. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement