Mercurial > hg > Members > shinya > pyrect
view pyrect/translator/template/grep.c @ 62:a05baa7dc7ba
modify I/O routine. use mmap. it's really faster than fgets ;-)
author | Ryoma SHINYA <shinya@firefly.cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 05 Nov 2010 01:37:35 +0900 |
parents | fd3d0b8326fe |
children |
line wrap: on
line source
/* typedef struct _thread_arg { unsigned char *buf; int len; int match; } thread_arg_t; void* thread_dfa(void *arg) { thread_arg_t* targ = (thread_arg_t*)arg; targ->match = DFA(targ->buf, targ->len); return NULL; } int paradfa(unsigned char *text, int len) { pthread_t hundle[THREAD_NUM]; thread_arg_t targ[THREAD_NUM]; if (len + REG_MAX_LEN <= REG_MAX_LEN) return dfa(text, len); int i, t_len = (len + THREAD_NUM - 1) / THREAD_NUM; for (i = 0; i < THREAD_NUM; i++) { targ[i].buf = text + (unsigned char)(i * t_len); targ[i].len = t_len + REG_MAX_LEN; } targ[THREAD_NUM - 1].len = len - (t_len * (THREAD_NUM - 1)); for (i = 0; i < THREAD_NUM; i++) { pthread_create(&hundle[i], NULL, (void *)thread_dfa, (void *)&targ[i]); } for (i = 0; i < THREAD_NUM; i++) { pthread_join(hundle[i], NULL); } for (i = 0; i < THREAD_NUM; i++) { if (targ[i].match) return 1; } return 0; } */ void print_line(unsigned char *beg, unsigned char *end) { fwrite(beg, sizeof(char), (end - beg + 1), stdout); } void grep(char *regexp, int fd, char *name) { caddr_t file_mmap; unsigned char *buf, *end, *beg; off_t size; struct stat sb; if (fstat(fd, &sb)) { fprintf(stderr, "can't fstat %s\n", name); exit(0); } size = sb.st_size; file_mmap = mmap(NULL, size, PROT_READ, MAP_SHARED, fd, (off_t)0); if (file_mmap == (caddr_t)-1) { fprintf(stderr, "can't mmap %s\n", name); exit(0); } beg = buf = (unsigned char *) file_mmap; end = beg + size - 1; dfa(beg, beg, end); munmap(file_mmap, size); return; } int main(int argc, char* argv[]) { int i, fd; if (argc < 2) { fprintf(stderr, "usage: grep regexp [file ...]"); exit(0); } if (argc == 2) { GREP(argv[1], stdin, NULL); } else { for (i = 2; i < argc; i++) { fd = open(argv[i], O_RDONLY, 0666); if (fd == 0) { fprintf(stderr, "can't open %s:", argv[i]); continue; } GREP(argv[1], fd, argc > 3 ? argv[i] : NULL); close(fd); } } return 0; }