Mercurial > hg > Members > shinya > pyrect
view pyrect/translator/template/grep.c @ 64:c981dc66b258
add (maybe :-p) non_blocking_print_line. it's used pthread.
author | Ryoma SHINYA <shinya@firefly.cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Sat, 06 Nov 2010 00:46:09 +0900 |
parents | 020ba001c58a |
children |
line wrap: on
line source
typedef struct _targ_t { char *beg; char *end; struct _targ_t *p; pthread_t *t; pthread_attr_t *a; } targ_t; void *print_line_(void *arg) { targ_t *targ = (targ_t *)arg; fwrite(targ->beg, sizeof(char), (targ->end - targ->beg + 1), stdout); pthread_attr_destroy(targ->a); free(targ->a); free(targ->t); free(targ->p); } void non_block_print_line(unsigned char *beg, unsigned char *end) { targ_t *targ = (targ_t *)malloc(sizeof(targ_t)); targ->a = (pthread_attr_t *)malloc(sizeof(pthread_attr_t)); targ->t = (pthread_t *)malloc(sizeof(pthread_t)); targ->p = targ; pthread_attr_init(targ->a); pthread_attr_setdetachstate(targ->a , PTHREAD_CREATE_DETACHED); pthread_create(targ->t , targ->a , print_line_ , NULL); fwrite(beg, sizeof(char), (end - beg + 1), stdout); } 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); pthread_exit(NULL); return; } int main(int argc, char* argv[]) { int i, fd; if (argc < 2) { fprintf(stderr, "usage: grep regexp [file ...]"); exit(0); } if (argc == 2) { return; } 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; }