LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 584|回复: 1

not a grep源代码

[复制链接]
发表于 2003-8-13 19:12:30 | 显示全部楼层 |阅读模式

  1. #define D ++*p
  2. #define B **p
  3. #define W while
  4. #define R return
  5. #define E else
  6. #define Q if
  7. #define G fprintf(stderr,


  8. #include <stdio.h>

  9. #ifndef A
  10. #define A        512
  11. #endif

  12. typedef int I;
  13. typedef char C;
  14. typedef void V;

  15. I z;
  16. I f;
  17. I x;
  18. I a[A], b;


  19. I d[A][A];
  20. I m[A], n, o;

  21. I N();
  22. I M();
  23. I P();
  24. I U();
  25. V X();
  26. V T();
  27. V F();
  28. V L();
  29. V O();

  30. I
  31. main(c, p)
  32. I c;
  33. C B;
  34. {
  35.         I i;
  36.         FILE *j;
  37.         C *k, l[BUFSIZ+1];

  38.         Q (--c < 1) {
  39.                 G "usage:  ag <pattern> [js...]\n");
  40.                 R 2;
  41.         }

  42.        
  43.         N(-3);
  44.         N(-6-b);
  45.         N(0);
  46.         N(-3-b);

  47.         X(&(*++p));

  48.         *l = '\n';
  49.         o = 1;
  50.         i = 1;
  51.         do {
  52.                 k = "-";
  53.                 j = stdin;
  54.                 Q (1 < c && **++p != '-') {
  55.                         Q (!(j = fopen(k = *p, "r"))) {
  56.                                 G
  57.                                         "ag: Failed to open '%s'.\n", k);
  58.                                 i = 3;
  59.                                 continue;
  60.                         }
  61.                 }
  62.                 W (fgets(l+1, BUFSIZ, j)) {
  63.                         Q (M(l)) {
  64.                                 printf("%s:%s", k, l+1);
  65.                                 i = 0;
  66.                         }
  67.                 }
  68.                 fclose(j);
  69.         } W (1 < --c);
  70.         R i;
  71. }


  72. V
  73. X(p)
  74. C B;
  75. {
  76.         I i, j;
  77.         i = N(-3);
  78.         T(p);
  79.         W (B == '|') {
  80.                 D;
  81.                 j = N(-3);
  82.                 N('\n');
  83.                 a[i] = -4-b;
  84.                 i = N(-3);
  85.                 T(p);
  86.                 a[j] = -4-b;
  87.         }
  88. }


  89. V
  90. T(p)
  91. C B;
  92. {
  93.         W (B != '|' && (!x || B != ')')  && B)
  94.                 F(p);
  95. }


  96. V
  97. F(p)
  98. C B;
  99. {
  100.         I i = N(-3);
  101.         Q (B == '^') {
  102.                 D;
  103.                 N('\n');
  104.         } E Q (B == '$') {
  105.                 D;
  106.                 N('\n');
  107.         } E Q (B == '(') {
  108.                 D;
  109.                 ++x;
  110.                 X(p);
  111.                 Q (B != ')') {
  112.                         G "ag: Missing ')'.\n");
  113.                         exit(3);
  114.                 }
  115.                 --x;
  116.                 D;
  117.         } E {
  118.                 L(p);
  119.         }
  120.         Q (B == '*') {
  121.                 D;
  122.                 a[i] = -4-b;
  123.                 N(-5-i);
  124.         } E Q (B == '?') {
  125.                 D;
  126.                 a[i] = -4-b;
  127.         }
  128. }


  129. V
  130. L(p)
  131. C B;
  132. {
  133.         I i, j;
  134.         Q (B == '.') {
  135.                 N(0);
  136.         } E Q (B == '[') {
  137.                 D;
  138.                 i = N(-2);
  139.                 Q (B == '^') {
  140.                         D;
  141.                         a[i] = -1;
  142.                 }
  143.                 Q (B == ']') {
  144.                         D;
  145.                         N(']');
  146.                 }
  147.                 W ((i = B) != ']') {
  148.                         Q ((*p)[1] == '-' && i < (j = (*p)[2])) {
  149.                                 W (i <= j)
  150.                                         N(i++);
  151.                                 *p += 3;
  152.                         } E {
  153.                                 N(i);
  154.                                 D;
  155.                         }
  156.                 }
  157.                 N('\n');
  158.         } E {
  159.                 Q (B == '\\')
  160.                         D;
  161.                 N(B);
  162.         }
  163.         D;
  164. }


  165. I
  166. N(c)
  167. I c;
  168. {
  169.         Q (A <= b) {
  170.                 G "ag: Pattern too long.\n");
  171.                 exit(3);
  172.         }
  173.         a[b] = c;
  174.         R b++;
  175. }


  176. V
  177. O(p)
  178. I p;
  179. {
  180.         I i = n;
  181.         Q (b <= p)
  182.                 R;
  183.         Q (a[p] < -2) {
  184.                 Q (a[p] != -3)
  185.                         O(-4-a[p]);
  186.                 O(p+1);
  187.         } E Q (!a[p] || a[p] == z || P(&p)) {
  188.                
  189.                 W (i < o)
  190.                         Q (m[i++] == p)
  191.                                 R;
  192.                
  193.                 f = U(p+1);

  194.                 Q (A <= o) {
  195.                         G "ag: Out of space.\n");
  196.                         exit(3);
  197.                 }
  198.                
  199.                 m[o++] = p;
  200.         }
  201. }


  202. I
  203. P(p)
  204. I *p;
  205. {
  206.         I i = 0, j = 0;
  207.         Q (a[*p] == -2 || (j = a[*p] == -1)) {
  208.                 W (a[D] != '\n')
  209.                         Q (a[*p] == z)
  210.                                 i = 1;
  211.         }
  212.         R i ^ j;
  213. }


  214. I
  215. U(p)
  216. I p;
  217. {
  218.         R (
  219.                 f || p == b || (
  220.                         a[p] < -2 && (
  221.                                 (a[p] != -3 && U(-4-a[p]))
  222.                                 || U(p+1)
  223.                         )
  224.                 )
  225.         );
  226. }


  227. I
  228. M(p)
  229. C *p;
  230. {
  231.         I c, i, j, k;
  232.         f = c = 0;
  233.         W (*p && 0 <= c) {
  234.                 Q (0 < (i = d[c][*p])) {
  235.                        
  236.                         c = i;
  237.                 } E {
  238.                        
  239.                         z = *p;
  240.                         i = d[c][0];
  241.                         j = n = o;
  242.                         do
  243.                                 O(m[i++]+1);
  244.                         W (m[i] != 2);

  245.                        
  246.                         i = k = 0;
  247.                         W (i < n) {
  248.                                 Q (m[i] == 2) {
  249.                                         j = n;
  250.                                         ++k;
  251.                                 }
  252.                                 Q (m[i++] == m[j]) {
  253.                                         Q (o <= ++j) {
  254.                                                 j = n;
  255.                                                 Q (m[i] == 2) {
  256.                                                        
  257.                                                         o = n;
  258.                                                         break;
  259.                                                 }
  260.                                         }
  261.                                 } E {
  262.                                         j = n;
  263.                                 }
  264.                         }
  265.                         Q (n < o)
  266.                                
  267.                                 d[++k][0] = n;
  268.                         c = d[c][*p] = f ? -1 : k;
  269.                 }
  270.                 ++p;
  271.         }
  272.         R c < 0;
  273. }
复制代码
 楼主| 发表于 2003-8-13 19:16:51 | 显示全部楼层
not a make

  1. #define W while
  2. #define S strspn
  3. #define R return
  4. #define F fprintf(stderr,
  5. #define C continue;

  6. #include <stdlib.h>
  7. #include <stdio.h>
  8. #include <string.h>
  9. #include <sys/stat.h>

  10. #ifndef RULES
  11. #define RULES        500
  12. #endif

  13. #define N(p, i)        (p += i, p += S(p, w), i = strcspn(p, w))

  14. char *b, l[BUFSIZ], *t[RULES], *d[RULES], *c[RULES], w[] = "\n\t ";

  15. time_t M();
  16. int T();
  17. void U();


  18. time_t
  19. M(f)
  20. char *f;
  21. {
  22.         int j, x;
  23.         size_t i = 0;
  24.         struct stat s;
  25.         N(f, i);
  26.         x = f[i];
  27.         f[i] = 0;
  28.         j = stat(f, &s);
  29.         f[i] = x;
  30.         R j < 0 ? 0 : s.st_mtime;
  31. }

  32. int
  33. T(f)
  34. char *f;
  35. {
  36.         char *q;
  37.         size_t i = 0, j, k = 1;
  38.         N(f, i);
  39.         W ((q = t[k])) {
  40.                 j = 0;
  41.                 W (N(q, j)) {
  42.                         if (i == j && !strncmp(f, q, i))
  43.                                 R k;
  44.                 }
  45.                 ++k;
  46.         }
  47.         R 0;
  48. }

  49. void
  50. U(f)
  51. char *f;
  52. {
  53.         time_t t = M(f);
  54.         size_t i = 0, j = !t, k = T(f);
  55.         char *p = d[k], *q = c[k];
  56.         if (!N(p, i) && q && *q != '\t' && j) {
  57.                 F "am: Don't know how to make '%s'.\n", f);
  58.                 exit(1);
  59.         }
  60.         W (0 < i) {
  61.                 U(p);
  62.                 if (t < M(p))
  63.                         j = 1;
  64.                 N(p, i);
  65.         }
  66.         if (j && q && *q == '\t') {
  67.                 sleep(1);
  68.                 W (*q++ == '\t') {
  69.                         i = j = 1;
  70.                         W (0 < S(q, "-+@")) {
  71.                                 if (*q == '@')
  72.                                        
  73.                                         i = 0;
  74.                                 if (*q++ == '-')
  75.                                        
  76.                                         j = 0;
  77.                         }
  78.                         if (i)
  79.                                 puts(q);
  80.                         if (system(q) && j) {
  81.                                 F "am: Error making '%s'\n", f);
  82.                                 exit(1);
  83.                         }
  84.                         q += strlen(q) + 1;
  85.                 }
  86.                 c[k] = 0;
  87.         }
  88. }

  89. int
  90. main(u, v)
  91. int u;
  92. char **v;
  93. {
  94.         FILE *f;
  95.         struct stat s;
  96.         size_t i, j, k;
  97.         char *m, *n, *p, *q, *r;
  98.         if (u < 2) {
  99.                 F "usage: am <makefile> [target]\n");
  100.                 R 2;
  101.         }
  102.         if (stat(*++v, &s) || !(f = fopen(*v, "r")))
  103.                 R 3;
  104.         q = b = malloc(2*s.st_size);
  105.         if (!b)
  106.                 R 4;
  107.         i = 1;
  108.         k = 0;
  109.         m = 0;
  110.         *t = *d = *c = "";
  111.         W ((r = fgets(l, BUFSIZ, f))) {
  112.                 if (RULES <= i) {
  113.                         F "am: Number of target-rules exceeds %d.\n", RULES);
  114.                         R 1;
  115.                 }
  116.                 if (k) {
  117.                         *q++ = ' ';
  118.                         r += S(r, w);
  119.                 } else {
  120.                         if (t[i])
  121.                                 c[i++] = q;
  122.                         if (m && putenv(m))
  123.                                 F "am: No more environment space.\n");
  124.                         m = 0;
  125.                         if (*l == '#' || *l == '\n')
  126.                                 C
  127.                         p = q;
  128.                 }
  129.                 W (!(k = *r == '\\' && r[1] == '\n') && *r) {
  130.                         if (*r == '$') {
  131.                                 if (r[1] == '(') {
  132.                                         n = r+2;
  133.                                         r += strcspn(r, ")");
  134.                                         *r++ = 0;
  135.                                         n = getenv(n);
  136.                                         if (n)
  137.                                                 q = strcpy(q, n) + strlen(n);
  138.                                         C
  139.                                 }
  140.                                 if (*r == r[1])
  141.                                         ++r;
  142.                         }
  143.                         if (*r == '=' && *l != '\t' && !m) {
  144.                                 *q = 0;
  145.                                 m = p;
  146.                                 j = 0;
  147.                                 q = N(m, j) + m;
  148.                                 *q++ = *r;
  149.                                 j = 1;
  150.                                 if (!N(r, j))
  151.                                         *q++ = 0;
  152.                                 C
  153.                         }
  154.                         if (*r == ':') {
  155.                                 t[i] = p;
  156.                                 *r = 0;
  157.                                 d[i] = q+1;
  158.                         }
  159.                         if (*r == '\n')
  160.                                 *r = 0;
  161.                         *q++ = *r++;
  162.                 }
  163.         }
  164.         fclose(f);
  165.         U(2 < u ? *++v : t[1]);
  166.         R 0
  167. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表