Esempio n. 1
0
/*
    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;
}
Esempio n. 2
0
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;
}