void fill_2d(double *data, IDL_LONG xsize, IDL_LONG ysize, int i, int j, int all, double thresh, UCHAR *result) { int off; int top, capacity = xsize; off = OFF2(i,j,xsize); int *stack; // easy case: seed position is zero. quit if (*(data + off) <= thresh || (i < 1) || (i >= xsize - 1) || (j < 1) || (j >= ysize - 1)) { printf("XXX Quitting\n"); return; } stack = malloc(capacity * sizeof(int)); top = -1; *(stack + ++top) = OFF2(i,j, xsize); while(top >= 0) { // grow stack, if needed if(top + 10 > capacity) { int newcap = MIN(capacity * 2, xsize * ysize); //printf("growing %i\n", capacity); int *newstack; if(!(newstack = malloc(newcap * sizeof(int)))) { printf("Memory allocation failure in fill_2d. Aborting"); return; } memcpy(newstack, stack, capacity * sizeof(int)); free(stack); stack = newstack; capacity = newcap; } off = *(stack + top--); i = off % xsize; j = off / xsize; *(result + off) = 1; // add neighbors to the stack STACK2(1,0); STACK2(-1,0); STACK2(0,1); STACK2(0,-1); if (all != 0) { STACK2(1,1); STACK2(1,-1); STACK2(-1,1); STACK2(-1,-1); } } // top >= 0 free(stack); }
int main(int argc, char** argv) { int i, j; double data[25], thresh; UCHAR result[25]; thresh = 1; for(i = 0; i < 25; i++) *(data + i) = 0; for (i = 1; i < 3; i++) { for (j = 1; j < 3; j++) { int off = OFF2(i,j, 5); *(data + off) = 3; } } for(i = 0; i < 25; i++) *(result + i) = 0; fill_2d(data, 5, 5, 2,2,1,thresh,result); for(i = 0; i < 25; i++) printf("%f ", *(data + i)); printf("\n"); for(i = 0; i < 25; i++) printf("%i ", *(result + i)); printf("\n"); return 0; }
#define OFF(x) offsetof(PyShmMemoryObject, x) #define OFF1(x) OFF(ds) + offsetof(struct shmid_ds, x) #define OFF2(x) OFF1(shm_perm) + offsetof(struct ipc_perm, x) /* List of members for shared memory objects */ /* Note: member types are set in the initshm function. Members which need separate processing are: - addr --> it is not part of the shmid_ds structure - attached --> function depending on addr - nattch --> system dependent declaration in shmid_ds (unknown type) - perm --> return permission (lower 9) bits only of ds.shm_perm.mode */ static struct memberlist memory_memberlist[] = { {"cgid", T_INT, OFF2(cgid), RO}, /* 0 (gid_t) */ {"cpid", T_INT, OFF1(shm_cpid), RO}, /* 1 (pid_t) */ {"cuid", T_INT, OFF2(cuid), RO}, /* 2 (uid_t) */ {"key", T_INT, OFF2(key), RO}, /* 3 (key_t) */ {"lpid", T_INT, OFF1(shm_lpid), RO}, /* 4 (pid_t) */ {"shmid", T_INT, OFF(shmid), RO}, /* 5 (int) */ {"size", T_INT, OFF1(shm_segsz), RO}, /* 6 (int) */ {"gid", T_INT, OFF2(gid), RO}, /* 7 (gid_t) */ {"uid", T_INT, OFF2(uid), RO}, /* 8 (uid_t) */ /* The following members are implemented without this table */ {"addr", T_INT, 0, RO}, /* 9 (void *) */ {"attached",T_INT, 0, RO}, /* 10 (int) */ {"nattch", T_INT, 0, RO}, /* 11 sys.dep. */ {"perm", T_INT, 0, RO}, /* 12 (mode_t) */ {NULL} /* sentinel */ };