コード例 #1
0
ファイル: pdfselect_i.c プロジェクト: NovaCygni/aur-mirror
void apply_range(char* buffer, int npages, const char* range) {
    if (range != NULL) {
        int sr;
        int er;
        const char* t;
        enum {
            brange = 1,
            erange = 2,
            end = 4,
            none = 8
        } state;
        state = brange;
        memset(buffer, 1, npages); /* no pages. */
        t = range;
        while ((state & end) == 0) {
            switch (*range) {
                case '0': case '1': case '2': case '3': case '4':
                case '5': case '6': case '7': case '8': case '9':
                    ++range;  /* case [:digit:] */
                    break;
                case '-':
                    ++range;
                    if ((state & brange) != 0) {
                        sscanf(t, "%d-", &sr);
                        state &= ~brange;
                        state |= erange;
                    }
                    t = range;
                    break;
                case '\0':
                    state |= end;
                    --range; /* no break */
                case ',':
                    ++range;
                    if ((state & brange) != 0) {
                        sscanf(t, "%d,", &sr);
                        add_page(buffer, sr, npages);
                    } else if ((state & erange) != 0) {
                        state &= ~erange;
                        state |= brange;
                        sscanf(t, "%d-", &er);
                        add_pages(buffer, sr, er, npages);
                    }
                    t = range;
                    break;
                default:
                    t = range;
                    ++range;
            }
        }
    }
}
コード例 #2
0
ファイル: neighlistlike.cpp プロジェクト: nchong/hertzstone
void NeighListLike::fill(struct params *input) {
  inum = input->nnode;
  for (int ii=0; ii<inum; ii++) {
    ilist[ii] = ii;
  }
  int p = 0;
  int npnt = 0;
  int lasti=0;
  for (int e=0; e<input->nedge; e++) {
    int i = input->edge[(e*2)  ];
    int j = input->edge[(e*2)+1];

    //index i must be monotonically increasing
    assert(lasti <= i); lasti = i;

    //move onto next page and add_pages if necessary
    if (pgsize - npnt < oneatom) {
      if (p == (maxpage-1)) {
        add_pages();
      }
      npnt = 0;
      p++;

      //fix-up if the current particle neighbors over two pages
      if (numneigh[i] > 0) {
        memcpy(&pages[p][0], firstneigh[i], numneigh[i]*sizeof(int));
        memcpy(&dpages[p][0], firstdouble[i], numneigh[i]*3*sizeof(double));
        memcpy(&tpages[p][0], firsttouch[i], numneigh[i]*sizeof(int));
        firstneigh[i] = &pages[p][0];
        firstdouble[i] = &dpages[p][0];
        firsttouch[i] = &tpages[p][0];
        npnt = numneigh[i];
      }
    }
    assert(npnt < pgsize);

    //fill pages and dpages
    if (numneigh[i] == 0) {
      firstneigh[i] = &pages[p][npnt];
      firstdouble[i] = &dpages[p][npnt*3];
      firsttouch[i] = &tpages[p][npnt];
    }
    pages[p][npnt] = j;
    dpages[p][(npnt*3)  ] = input->shear[(e*3)  ];
    dpages[p][(npnt*3)+1] = input->shear[(e*3)+1];
    dpages[p][(npnt*3)+2] = input->shear[(e*3)+2];
    tpages[p][npnt] = 1;
    numneigh[i]++;
    //check for overflow
    assert(numneigh[i] < oneatom);
    npnt++;
  }

  //fix-up neighbor list so there are no NULL values
  for (int ii=0; ii<inum; ii++) {
    int i = ilist[ii];
    if (firstneigh[i] == NULL) {
      if (i == 0) {
        firstneigh[i] = pages[0];
      } else {
        int j = i;
        do {
          j--;
          assert(j > 0);
        } while (firstneigh[j] == NULL);
        firstneigh[i] = firstneigh[j] + numneigh[j];
      }
    }
    assert(firstneigh[i] != NULL);
  }
}