⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 grep.c

📁 美国mit操作系统课程所用的一个教学操作系统xv6
💻 C
字号:
// Simple grep.  Only supports ^ . * $ operators.#include "types.h"#include "stat.h"#include "user.h"char buf[1024];int match(char*, char*);voidgrep(char *pattern, int fd){  int n, m;  char *p, *q;    m = 0;  while((n = read(fd, buf+m, sizeof(buf)-m)) > 0){    m += n;    p = buf;    while((q = strchr(p, '\n')) != 0){      *q = 0;      if(match(pattern, p)){        *q = '\n';        write(1, p, q+1 - p);      }      p = q+1;    }    if(p == buf)      m = 0;    if(m > 0){      m -= p - buf;      memmove(buf, p, m);    }  }}intmain(int argc, char *argv[]){  int fd, i;  char *pattern;    if(argc <= 1){    printf(2, "usage: grep pattern [file ...]\n");    exit();  }  pattern = argv[1];    if(argc <= 2){    grep(pattern, 0);    exit();  }  for(i = 2; i < argc; i++){    if((fd = open(argv[i], 0)) < 0){      printf(1, "grep: cannot open %s\n", argv[i]);      exit();    }    grep(pattern, fd);    close(fd);  }  exit();}// Regexp matcher from Kernighan & Pike,// The Practice of Programming, Chapter 9.int matchhere(char*, char*);int matchstar(int, char*, char*);intmatch(char *re, char *text){  if(re[0] == '^')    return matchhere(re+1, text);  do{  // must look at empty string    if(matchhere(re, text))      return 1;  }while(*text++ != '\0');  return 0;}// matchhere: search for re at beginning of textint matchhere(char *re, char *text){  if(re[0] == '\0')    return 1;  if(re[1] == '*')    return matchstar(re[0], re+2, text);  if(re[0] == '$' && re[1] == '\0')    return *text == '\0';  if(*text!='\0' && (re[0]=='.' || re[0]==*text))    return matchhere(re+1, text+1);  return 0;}// matchstar: search for c*re at beginning of textint matchstar(int c, char *re, char *text){  do{  // a * matches zero or more instances    if(matchhere(re, text))      return 1;  }while(*text!='\0' && (*text++==c || c=='.'));  return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -