/* insert a horizontal line at given y coordinate into the grid. it returns the resulting index of the insertion. */ int RectManager::h_line_insert(Rect_Set * rs, int v) { int tmp, index, i; int success = range_insert(&rs->ys, v, &index); if(!success) return index; if(index > 0) { int v0; range_inserti(&rs->ysum, index, rs->ysum.points[index - 1]); v0 = rs->ys.points[index - 1] & 0xffff; for(i = 0; i < rs->xs.length - 1; i++) { int m = (rs->xs.points[i] << 16) | v0; int p = range_search(&rs->ms, m); if(p >= 0 && rs->ms.points[p] == m) { range_insert(&rs->ms, (rs->xs.points[i] << 16) | (v & 0xffff), &tmp); rs->xsum.points[i] ^= (v & 0xffff); } } } else if(rs->ysum.length < rs->ys.length) { range_inserti(&rs->ysum, index, 0); } return index; }
static int geo_parse_range(geo_t *g, char *range, char *value) { uint32_t ip_addr; struct in_addr in; uint32_t start, end; if (strcmp(range, "default") == 0) { if (inet_aton(value, &in) == 0) { return -1; } ip_addr = ntohl(in.s_addr); range_set_def(g->u.range, ip_addr); } else if (strcmp(range, "delete") == 0) { if (parse_range(value, &start, &end) != 0) { return -1; } range_delete(g->u.range, start, end); return 0; } else { if (inet_aton(value, &in) == 0) { return -1; } ip_addr = ntohl(in.s_addr); if (parse_range(range, &start, &end) != 0) { return -1; } return range_insert(g->u.range, start, end, ip_addr); } return 0; }