Mercurial > hg > Game > Cerium
annotate example/regex/ppe/grep.c @ 1467:d585a7614cd5 draft
look like working now.
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Sun, 15 Jul 2012 17:33:50 +0900 |
parents | 2abd68a1ac2a |
children |
rev | line source |
---|---|
1198
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1 #include <stdio.h> |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
2 #include <stdlib.h> |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
3 #include <sys/mman.h> |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
4 #include <sys/types.h> |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
5 #include <sys/stat.h> |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
6 #include <fcntl.h> |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
7 #include <unistd.h> |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
8 #include <string.h> |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
9 |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
10 typedef unsigned char UCHAR; |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
11 typedef unsigned char* UCHARP; |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
12 |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
13 typedef enum BOOL { |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
14 FALSE = 0, |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
15 TRUE = 1 |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
16 } BOOL; |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
17 |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
18 typedef struct ENV { |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
19 // BOOL print_count; |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
20 // BOOL print_filename; |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
21 bool print_count; |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
22 bool print_filename; |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
23 int count; |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
24 char *filename; |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
25 } *ENVP; |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
26 |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
27 void filter(UCHARP beg, UCHARP buf, UCHARP end, ENVP env); |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
28 void predict(UCHARP beg, UCHARP buf, UCHARP end, ENVP env); |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
29 void reject(UCHARP beg, UCHARP buf, UCHARP end, ENVP env); |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
30 void accept(UCHARP beg, UCHARP buf, UCHARP end, ENVP env); |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
31 void s0(UCHARP beg, UCHARP buf, UCHARP end, ENVP env); |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
32 #define __REGEX__ "h.s" |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
33 |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
34 UCHARP get_line_beg(UCHARP p, UCHARP beg) { |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
35 while(p > beg) { |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
36 if ((*--p) == '\n') return p+1; |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
37 } |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
38 return beg; |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
39 } |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
40 |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
41 void print_line(UCHARP beg, UCHARP end) { |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
42 fwrite(beg, sizeof(char), (end - beg + 1), stdout); |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
43 } |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
44 |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
45 void grep(int fd, ENVP env) { |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
46 caddr_t file_mmap; |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
47 UCHARP buf, end, beg; |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
48 off_t size; |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
49 struct stat sb; |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
50 |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
51 if (fstat(fd, &sb)) { |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
52 fprintf(stderr, "can't fstat %s\n", env->filename); |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
53 exit(0); |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
54 } |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
55 |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
56 size = sb.st_size; |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
57 file_mmap = (char*)mmap(NULL, size, PROT_READ, MAP_SHARED, fd, (off_t)0); |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
58 |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
59 if (file_mmap == (caddr_t)-1) { |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
60 fprintf(stderr, "can't mmap %s\n", env->filename); |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
61 exit(0); |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
62 } |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
63 |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
64 beg = buf = (UCHARP) file_mmap; |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
65 end = beg + size - 1; |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
66 env->count = 0; |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
67 |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
68 s0(beg, beg, end, env); |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
69 |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
70 munmap(file_mmap, size); |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
71 return; |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
72 } |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
73 |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
74 void stdingrep(ENVP env) { |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
75 char buf_[BUFSIZ]; |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
76 UCHARP buf, beg, end; |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
77 buf = beg = (UCHARP) buf_; |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
78 |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
79 while (fgets(buf_, BUFSIZ, stdin) != NULL) { |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
80 env->count = 0; |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
81 end = buf + strlen(buf_) - 1; |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
82 s0(beg, buf, end, env); |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
83 } |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
84 } |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
85 |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
86 int main(int argc, char* argv[]) { |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
87 int i, fd, opt, with_filename = 0; |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
88 |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
89 ENVP env = (ENVP)calloc(sizeof(ENVP), 1); |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
90 |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
91 while ((opt=getopt(argc, argv, "chH")) != -1) { |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
92 switch (opt) { |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
93 case 'c': |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
94 env->print_count = 1; |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
95 break; |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
96 case 'h': |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
97 with_filename = -1; |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
98 break; |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
99 case 'H': |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
100 with_filename = 1; |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
101 break; |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
102 default: |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
103 fprintf(stderr, "invalid option."); |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
104 exit(0); |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
105 } |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
106 } |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
107 |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
108 if (optind == argc) { |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
109 if (with_filename) { |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
110 /* handle -h/-H as help */ |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
111 printf("grep pattern: %s\n", __REGEX__); |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
112 exit(1); |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
113 } else { |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
114 stdingrep(env); |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
115 } |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
116 } else { |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
117 switch (with_filename) { |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
118 case 0: //default |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
119 if (argc == optind + 1) { |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
120 /* just grep 1 file. */ |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
121 env->print_filename = false; |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
122 } else { |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
123 /* grep 1 more files. */ |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
124 env->print_filename = true; |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
125 } |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
126 break; |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
127 // option |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
128 case -1: |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
129 env->print_filename = false; |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
130 break; |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
131 case 1: |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
132 env->print_filename = true; |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
133 break; |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
134 default: break; |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
135 } |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
136 for (i = optind; i < argc; i++) { |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
137 fd = open(argv[i], O_RDONLY, 0666); |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
138 if (fd == 0) { |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
139 printf("%d, %s\n", i, argv[i]); |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
140 fprintf(stderr, "can't open %s:", argv[i]); |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
141 continue; |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
142 } |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
143 env->filename = argv[i]; |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
144 grep(fd, env); |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
145 close(fd); |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
146 } |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
147 } |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
148 |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
149 return 0; |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
150 } |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
151 void s1(UCHARP beg, UCHARP buf, UCHARP end, ENVP env); |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
152 void s2(UCHARP beg, UCHARP buf, UCHARP end, ENVP env); |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
153 void s3(UCHARP beg, UCHARP buf, UCHARP end, ENVP env); |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
154 void s4(UCHARP beg, UCHARP buf, UCHARP end, ENVP env); |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
155 void s5(UCHARP beg, UCHARP buf, UCHARP end, ENVP env); |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
156 void s6(UCHARP beg, UCHARP buf, UCHARP end, ENVP env); |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
157 |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
158 void s0(UCHARP beg, UCHARP buf, UCHARP end, ENVP env) { |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
159 return filter(beg, buf, end, env); |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
160 } |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
161 |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
162 void filter(UCHARP beg, UCHARP buf, UCHARP end, ENVP env) { |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
163 static const UCHARP key = (UCHARP)"h"; |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
164 int i, len = 1; |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
165 loop: |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
166 while ((buf = (UCHARP)memchr(buf, key[0], end-buf))) { |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
167 for(i = 1; i < len; i++) { |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
168 if (buf[i] != key[i]) { |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
169 buf++; |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
170 goto loop; |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
171 } |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
172 } |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
173 goto next; |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
174 } |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
175 return reject(beg, end, end, env); |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
176 next: |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
177 return s1(beg, buf, end, env); |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
178 } |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
179 |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
180 void s1(UCHARP beg, UCHARP buf, UCHARP end, ENVP env) { |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
181 static void (*tbl[256])(UCHARP, UCHARP, UCHARP, ENVP) = {[0 ... 255] = (void*)s1, /* NL */ [10] = (void*)reject, /* h */ [104] = (void*)s2 }; |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
182 if (buf > end) return tbl['\n'](beg, buf, end, env); |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
183 return tbl[*buf++](beg, buf, end, env); |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
184 } |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
185 |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
186 void s2(UCHARP beg, UCHARP buf, UCHARP end, ENVP env) { |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
187 static void (*tbl[256])(UCHARP, UCHARP, UCHARP, ENVP) = {[0 ... 255] = (void*)s3, /* NL */ [10] = (void*)reject, /* h */ [104] = (void*)s4}; |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
188 if (buf > end) return tbl['\n'](beg, buf, end, env); |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
189 return tbl[*buf++](beg, buf, end, env); |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
190 } |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
191 |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
192 void s3(UCHARP beg, UCHARP buf, UCHARP end, ENVP env) { |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
193 static void (*tbl[256])(UCHARP, UCHARP, UCHARP, ENVP) = {[0 ... 255] = (void*)s1, /* NL */ [10] = (void*)reject, /* h */ [104] = (void*)s2, /* s */ [115] = (void*)s5}; |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
194 if (buf > end) return tbl['\n'](beg, buf, end, env); |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
195 return tbl[*buf++](beg, buf, end, env); |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
196 } |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
197 |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
198 void s4(UCHARP beg, UCHARP buf, UCHARP end, ENVP env) { |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
199 static void (*tbl[256])(UCHARP, UCHARP, UCHARP, ENVP) = {[0 ... 255] = (void*)s3, /* NL */ [10] = (void*)reject, /* h */ [104] = (void*)s4, /* s */ [115] = (void*)s6}; |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
200 if (buf > end) return tbl['\n'](beg, buf, end, env); |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
201 return tbl[*buf++](beg, buf, end, env); |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
202 } |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
203 |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
204 void s5(UCHARP beg, UCHARP buf, UCHARP end, ENVP env) { |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
205 return accept(beg, buf - 1, end, env);} |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
206 |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
207 void s6(UCHARP beg, UCHARP buf, UCHARP end, ENVP env) { |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
208 return accept(beg, buf - 1, end, env);} |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
209 |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
210 void |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
211 accept(UCHARP beg, UCHARP buf, UCHARP end, ENVP env) |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
212 { |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
213 if (buf < beg) buf = beg; |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
214 UCHARP ret = (buf < end) ? (UCHARP) memchr(buf, '\n', (end - buf)) : NULL; |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
215 if (env->print_count) { |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
216 env->count++; |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
217 if (ret == NULL) { |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
218 if (env->print_filename) { |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
219 printf("%s:", env->filename); |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
220 } |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
221 printf("%d\n", env->count); |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
222 return; |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
223 } |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
224 beg = buf = ret + 1; |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
225 } else { |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
226 beg = get_line_beg(buf, beg); |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
227 if (env->print_filename) { |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
228 printf("%s:", env->filename); |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
229 } |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
230 if (ret == NULL) { |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
231 print_line(beg, end); |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
232 return; |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
233 } |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
234 print_line(beg, ret); |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
235 beg = buf = ret + 1; |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
236 } |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
237 return s0(beg, buf, end, env); |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
238 } |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
239 |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
240 void |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
241 reject(UCHARP beg, UCHARP buf, UCHARP end, ENVP env) { |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
242 UCHARP ret; |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
243 if (buf >= end) { |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
244 ret = NULL; |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
245 } else { |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
246 if (*(buf-1) == '\n') { |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
247 ret = buf-1; |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
248 } else { |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
249 ret = (UCHARP)memchr(buf, '\n', (end - buf)); |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
250 } |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
251 } |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
252 if (ret == NULL) { |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
253 if (env->print_count) { |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
254 if (env->print_filename) { |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
255 printf("%s:", env->filename); |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
256 } |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
257 printf("%d\n", env->count); |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
258 } |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
259 return; |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
260 } |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
261 beg = buf = ret + 1; |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
262 return s0(beg, buf, end, env); |
2abd68a1ac2a
add example/regex
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
263 } |