view pyrect/translator/template/grep.c @ 56:ee9945561f80

add parallel I/O grep (per line) with pthread. but it's very slow. really slow..
author Ryoma SHINYA <shinya@firefly.cr.ie.u-ryukyu.ac.jp>
date Wed, 27 Oct 2010 20:46:41 +0900
parents 7f4221018adf
children 81b44ae1cd73
line wrap: on
line source

typedef struct _thread_arg {
  unsigned char *buf;
  int match;
} thread_arg_t;

void* thread_dfa(void *arg) {
  thread_arg_t* targ = (thread_arg_t*)arg;
  targ->match = DFA(targ->buf);
  return NULL;
}

int paragrep(char *regexp, FILE *f, char *name) {
  int nmatch, used_buf = 0,
    reading = 1;
  char lbuf[THREAD_NUM][LINEBUFSIZE];
  pthread_t hundle[THREAD_NUM];
  thread_arg_t targ[THREAD_NUM];
  int i, j, n, m;
  do {
    for (i = 0; i < THREAD_NUM; i++) {
      if (fgets(lbuf[i], sizeof lbuf[i], f) == NULL) {
        reading = 0;
        break;
      } else {
        n = strlen(lbuf[i]);
        if (n > 0 && lbuf[i][n-1] == '\n')
          lbuf[i][n-1] = '\0';
      }
    }
    for (j = 0; j < i; j++) {
      targ[j].buf = (unsigned char *)lbuf[j];
      pthread_create(&hundle[j], NULL, (void *)thread_dfa, (void *)&targ[j]);
    }
    for (j = 0; j < i; j++) {
      pthread_join(hundle[j], NULL);
      if (targ[j].match) {
        nmatch++;
        if (name != NULL)
          printf("%s:", name);
        printf("%s\n", targ[j].buf);
      }
    }
  } while (i != 0);
  return nmatch;
}

int grep(char *regexp, FILE *f, char *name) {
  int n, nmatch;
  char lbuf[LINEBUFSIZE];
  buf = (unsigned char *)lbuf;
  nmatch = 0;
  while (fgets(lbuf, sizeof lbuf, f) != NULL) {
    n = strlen(lbuf);
    if (n > 0 && buf[n-1] == '\n')
      lbuf[n-1] = '\0';
    if (DFA(buf)) {
      nmatch++;
      if (name != NULL)
        printf("%s:", name);
      printf("%s\n", lbuf);
    }
  }
  return nmatch;
}

int main(int argc, char* argv[]) {
  int i, nmatch;
  FILE *f;

  if (argc < 2) {
    fprintf(stderr, "usage: grep regexp [file ...]");
    exit(0);
  }
  nmatch = 0;
  if (argc == 2) {
    if (GREP(argv[1], stdin, NULL))
      nmatch++;
  } else {
    for (i = 2; i < argc; i++) {
      f = fopen(argv[i], "r");
      if (f == NULL) {
        fprintf(stderr, "can't open %s:", argv[i]);
        continue;
      }
      if (READBUFSIZE > 0)
        setvbuf(f, readbuf, _IOFBF, READBUFSIZE);
      if (GREP(argv[1], f, argc > 3 ? argv[i] : NULL) > 0)
        nmatch++;
      fclose(f);
    }
  }

  return nmatch;
}