Mercurial > hg > Applications > Grep
annotate regex/main.cc @ 42:cdb4fd81c31f
add regex mode
author | Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 02 Mar 2015 23:59:24 +0900 |
parents | e1c5ecbf8836 |
children | ead0a307449e |
rev | line source |
---|---|
38 | 1 #include <stdio.h> |
2 #include <stdlib.h> | |
3 #include <unistd.h> | |
4 #include <math.h> | |
5 #include <string.h> | |
6 #include <sys/mman.h> | |
7 #include <sys/stat.h> | |
8 #include <sys/types.h> | |
9 #include <fcntl.h> | |
41
e1c5ecbf8836
add bmsearch.cc
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
40
diff
changeset
|
10 #include "regex.h" |
38 | 11 |
12 const char *usr_help_str = "Usage: ./regex [-file filename] [-sw SearchWord]\n"; | |
42
cdb4fd81c31f
add regex mode
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
41
diff
changeset
|
13 const char *usr_help_mode = "Please add -bm or -regex"; |
41
e1c5ecbf8836
add bmsearch.cc
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
40
diff
changeset
|
14 extern int *createBMskiptable(BMDataPtr); |
e1c5ecbf8836
add bmsearch.cc
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
40
diff
changeset
|
15 extern void *BMmethod(BMDataPtr,ResultPtr); |
38 | 16 |
17 int main(int argc, char* argv[]) { | |
18 | |
19 char *filename = 0; | |
39
120c8116e831
refactoring
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
38
diff
changeset
|
20 char *searchWord = 0; |
42
cdb4fd81c31f
add regex mode
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
41
diff
changeset
|
21 bool bmSearchFlag = false; |
cdb4fd81c31f
add regex mode
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
41
diff
changeset
|
22 bool regexFlag = false; |
38 | 23 |
24 // check argument | |
25 for (int i = 0; argv[i]; i++) { | |
26 if (strcmp(argv[i], "-file") == 0) { | |
27 filename = (char*)argv[i+1]; i++; | |
28 }else if (strcmp(argv[i], "-sw") == 0) { | |
39
120c8116e831
refactoring
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
38
diff
changeset
|
29 searchWord = (char*)argv[i+1]; i++; |
42
cdb4fd81c31f
add regex mode
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
41
diff
changeset
|
30 }else if (strcmp(argv[i], "-bm") == 0) { |
cdb4fd81c31f
add regex mode
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
41
diff
changeset
|
31 bmSearchFlag = true; |
cdb4fd81c31f
add regex mode
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
41
diff
changeset
|
32 }else if (strcmp(argv[i], "-regex") == 0) { |
cdb4fd81c31f
add regex mode
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
41
diff
changeset
|
33 regexFlag = true; |
38 | 34 } |
35 } | |
36 | |
37 // prepare file read | |
38 if (filename == 0) { | |
39 puts(usr_help_str); | |
40 exit(1); | |
41 } | |
42 | |
43 struct stat sb; | |
44 long fd = 0; | |
45 char *textfile; | |
46 | |
47 if ((fd=open(filename,O_RDONLY,0666))==0) { | |
48 fprintf(stderr,"can't open %s\n",filename); | |
49 } | |
50 | |
51 if (fstat(fd,&sb)) { | |
52 fprintf(stderr,"can't fstat %s\n",filename); | |
53 } | |
54 | |
55 textfile = (char*)malloc(sb.st_size); | |
56 read(fd,textfile,sb.st_size); | |
57 | |
58 if (textfile == (char*)-1) { | |
59 fprintf(stderr,"Can't mmap file\n"); | |
60 perror(NULL); | |
61 exit(0); | |
62 } | |
63 | |
42
cdb4fd81c31f
add regex mode
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
41
diff
changeset
|
64 if (bmSearchFlag == true) { |
cdb4fd81c31f
add regex mode
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
41
diff
changeset
|
65 BMDataPtr bmdata = (BMDataPtr)malloc(sizeof(BMData)); |
cdb4fd81c31f
add regex mode
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
41
diff
changeset
|
66 ResultPtr result = (ResultPtr)malloc(sizeof(Result)); |
38 | 67 |
42
cdb4fd81c31f
add regex mode
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
41
diff
changeset
|
68 bmdata->readText = textfile; |
cdb4fd81c31f
add regex mode
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
41
diff
changeset
|
69 bmdata->readTextLen = sb.st_size; |
cdb4fd81c31f
add regex mode
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
41
diff
changeset
|
70 bmdata->skipTable = (int*)malloc(sizeof(int)*256); |
cdb4fd81c31f
add regex mode
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
41
diff
changeset
|
71 |
cdb4fd81c31f
add regex mode
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
41
diff
changeset
|
72 // prepare Boyer Moore Search |
cdb4fd81c31f
add regex mode
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
41
diff
changeset
|
73 bmdata->searchWord = searchWord; |
cdb4fd81c31f
add regex mode
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
41
diff
changeset
|
74 bmdata->searchWordLen = strlen((const char*)bmdata->searchWord); |
cdb4fd81c31f
add regex mode
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
41
diff
changeset
|
75 bmdata->skipTable = createBMskiptable(bmdata); |
38 | 76 |
42
cdb4fd81c31f
add regex mode
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
41
diff
changeset
|
77 BMmethod(bmdata,result); |
cdb4fd81c31f
add regex mode
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
41
diff
changeset
|
78 |
cdb4fd81c31f
add regex mode
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
41
diff
changeset
|
79 printf("sword: %s len: %d\n",bmdata->searchWord,bmdata->searchWordLen); |
cdb4fd81c31f
add regex mode
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
41
diff
changeset
|
80 printf("Match : %d\n",result->matchNum); |
38 | 81 |
42
cdb4fd81c31f
add regex mode
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
41
diff
changeset
|
82 free(result); |
cdb4fd81c31f
add regex mode
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
41
diff
changeset
|
83 free(bmdata); |
cdb4fd81c31f
add regex mode
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
41
diff
changeset
|
84 }else if (regexFlag == true) { |
38 | 85 |
42
cdb4fd81c31f
add regex mode
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
41
diff
changeset
|
86 }else{ |
cdb4fd81c31f
add regex mode
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
41
diff
changeset
|
87 puts(usr_help_mode); |
cdb4fd81c31f
add regex mode
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
41
diff
changeset
|
88 exit(1); |
cdb4fd81c31f
add regex mode
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
41
diff
changeset
|
89 } |
cdb4fd81c31f
add regex mode
Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp>
parents:
41
diff
changeset
|
90 |
38 | 91 return 0; |
92 } |