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