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