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;
}