Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- implement Egrep;
- include "sys.m";
- sys: Sys;
- FD: import Sys;
- stdin, stderr, stdout: ref FD;
- include "draw.m";
- Context: import Draw;
- include "regex.m"; #модуль для работы с регексами
- regex: Regex;
- Re: import regex;
- include "bufio.m";
- bufio: Bufio;
- Iobuf: import bufio;
- include "arg.m"; #Модуль для считывания параметров ком строки
- Egrep: module
- {
- init: fn(ctxt: ref Context, argv: list of string);
- };
- init(nil: ref Context, argv: list of string)
- {
- sys = load Sys Sys->PATH;
- stdin = sys->fildes(0);
- stderr = sys->fildes(2);
- arg := load Arg Arg->PATH;
- regex = load Regex Regex->PATH;
- bufio = load Bufio Bufio->PATH;
- arg->init(argv);
- argv = arg->argv();
- arg = nil;
- pattern := hd argv; # наш образец
- argv = tl argv; # имя входного файла
- (re, err) := regex->compile(pattern,0); # компилируем образец для того чтобы потом с ним сравнивать
- if(re == nil) {
- sys->fprint(stderr, "egrep: %s\n", err);
- exit;
- }
- matched := 0;
- if(argv == nil)
- matched = egrep(re, bufio->fopen(stdin, Bufio->OREAD), "stdin"); # если файла нет то из командной строки берется все
- else {
- f := bufio->open(hd argv, Bufio->OREAD); # записываем содержимое файла в строку
- if(f == nil)
- sys->fprint(stderr, "egrep: cannot open %s:\n", hd argv);
- else
- matched = egrep(re, f, hd argv);
- }
- if (!matched)
- sys->print("fail:no matches\n");
- }
- egrep(re: Re, f: ref Iobuf, file: string): int
- {
- matched := 0;
- for(line := 1; ; line++) {
- s := t := f.gets('\n'); # считываем все до перевода каретки, то есть строку
- if(s == nil)
- break;
- if((regex->executese(re, s, (0, len s-1), 1, 1) != nil)) { # здесь непосредственный поиск подстроки в строке
- matched = 1;
- sys->print("%d:%s\n", line, t);
- }
- }
- return matched;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement