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

📄 grep.c

📁 国外网站上的一些精典的C程序
💻 C
📖 第 1 页 / 共 2 页
字号:
            case 'A':               store(ALPHA);               break;            case 'd':            case 'D':               store(DIGIT);               break;            case 'n':            case 'N':               store(NALPHA);               break;            case ' ':               store(PUNCT);               break;            default:               badpat("Unknown : type", source, s);            }            break;         }         else    badpat("No : type", source, s);      case '\\':         if (*s)            c = *s++;      default:         store(CHAR);         store(tolower(c));      }   }   store(ENDPAT);   store(0);                /* Terminate string     */   if (debug) {      for (lp = pbuf; lp < pp;) {         if ((c = (*lp++ & 0377)) < ' ')            printf("\\%o ", c);         else    printf("%c ", c);        }        printf("\n");   }}/*** Compile a class (within []) ***********************/char *cclass(source, src)char       *source;   /* Pattern start -- for error msg. */char       *src;      /* Class start */{   register char   *s;        /* Source pointer    */   register char   *cp;       /* Pattern start     */   register int    c;         /* Current character */   int             o;         /* Temp              */   s = src;   o = CLASS;   if (*s == '^') {      ++s;      o = NCLASS;   }   store(o);   cp = pp;   store(0);                          /* Byte count      */   while ((c = *s++) && c!=']') {      if (c == '\\') {                /* Store quoted char    */         if ((c = *s++) == '\0')      /* Gotta get something  */            badpat("Class terminates badly", source, s);         else    store(tolower(c));      }      else if (c == '-' &&            (pp - cp) > 1 && *s != ']' && *s != '\0') {         c = pp[-1];             /* Range start     */         pp[-1] = RANGE;         /* Range signal    */         store(c);               /* Re-store start  */         c = *s++;               /* Get end char and*/         store(tolower(c));      /* Store it        */      }      else {         store(tolower(c));      /* Store normal char */      }   }   if (c != ']')      badpat("Unterminated class", source, s);   if ((c = (pp - cp)) >= 256)      badpat("Class too large", source, s);   if (c == 0)      badpat("Empty class", source, s);   *cp = c;   return(s);}/*** Store an entry in the pattern buffer **************/store(op)   int op;{   if (pp >= &pbuf[PMAX])      error("Pattern too complex\n");   *pp++ = op;}/*** Report a bad pattern specification ****************/badpat(message, source, stop)char  *message;       /* Error message */char  *source;        /* Pattern start */char  *stop;          /* Pattern end   */{   fprintf(stderr, "-GREP-E-%s, pattern is\"%s\"\n", message, source);   fprintf(stderr, "-GREP-E-Stopped at byte %d, '%c'\n",         stop-source, stop[-1]);   error("?GREP-E-Bad pattern\n");}/*** Scan the file for the pattern in pbuf[] ***********/grep(fp, fn)FILE       *fp;       /* File to process            */char       *fn;       /* File name (for -f option)  */{   register int lno, count, m;   lno = 0;   count = 0;   while (fgets(lbuf, LMAX, fp)) {      ++lno;      m = match();      if ((m && !vflag) || (!m && vflag)) {         ++count;         if (!cflag) {            if (fflag && fn) {               file(fn);               fn = 0;            }            if (nflag)               printf("%d\t", lno);            printf("%s\n", lbuf);         }      }   }   if (cflag) {      if (fflag && fn)         file(fn);      printf("%d\n", count);   }}/*** Match line (lbuf) with pattern (pbuf) return 1 if match ***/match(){   register char   *l;        /* Line pointer       */   for (l = lbuf; *l; ++l) {      if (pmatch(l, pbuf))         return(1);   }   return(0);}/*** Match partial line with pattern *******************/char *pmatch(line, pattern)char               *line;     /* (partial) line to match      */char               *pattern;  /* (partial) pattern to match   */{   register char   *l;        /* Current line pointer         */   register char   *p;        /* Current pattern pointer      */   register char   c;         /* Current character            */   char            *e;        /* End for STAR and PLUS match  */   int             op;        /* Pattern operation            */   int             n;         /* Class counter                */   char            *are;      /* Start of STAR match          */   l = line;   if (debug > 1)      printf("pmatch(\"%s\")\n", line);   p = pattern;   while ((op = *p++) != ENDPAT) {      if (debug > 1)         printf("byte[%d] = 0%o, '%c', op = 0%o\n",               l-line, *l, *l, op);      switch(op) {      case CHAR:         if (tolower(*l++) != *p++)            return(0);         break;      case BOL:         if (l != lbuf)            return(0);         break;      case EOL:         if (*l != '\0')            return(0);         break;      case ANY:         if (*l++ == '\0')            return(0);         break;      case DIGIT:         if ((c = *l++) < '0' || (c > '9'))            return(0);         break;      case ALPHA:         c = tolower(*l++);         if (c < 'a' || c > 'z')            return(0);         break;      case NALPHA:         c = tolower(*l++);         if (c >= 'a' && c <= 'z')            break;         else if (c < '0' || c > '9')            return(0);         break;      case PUNCT:         c = *l++;         if (c == 0 || c > ' ')            return(0);         break;      case CLASS:      case NCLASS:         c = tolower(*l++);         n = *p++ & 0377;         do {            if (*p == RANGE) {               p += 3;               n -= 2;               if (c >= p[-2] && c <= p[-1])                  break;            }            else if (c == *p++)               break;         } while (--n > 1);         if ((op == CLASS) == (n <= 1))            return(0);         if (op == CLASS)            p += n - 2;         break;      case MINUS:         e = pmatch(l, p);       /* Look for a match    */         while (*p++ != ENDPAT); /* Skip over pattern   */         if (e)                  /* Got a match?        */            l = e;               /* Yes, update string  */         break;                  /* Always succeeds     */      case PLUS:                 /* One or more ...     */         if ((l = pmatch(l, p)) == 0)            return(0);           /* Gotta have a match  */      case STAR:                 /* Zero or more ...    */         are = l;                /* Remember line start */         while (*l && (e = pmatch(l, p)))            l = e;               /* Get longest match   */         while (*p++ != ENDPAT); /* Skip over pattern   */         while (l >= are) {      /* Try to match rest   */            if (e = pmatch(l, p))               return(e);            --l;                 /* Nope, try earlier   */         }         return(0);              /* Nothing else worked */      default:         printf("Bad op code %d\n", op);         error("Cannot happen -- match\n");      }   }   return(l);}/*** Report an error ***********************************/error(s)char *s;{   fprintf(stderr, "%s", s);   exit(EXIT_FAILURE);}

⌨️ 快捷键说明

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