Exemplo n.º 1
0
/**
 * Split a range into two halves by deleting a middle portion
 * @param r the range to split-delete
 * @param q the range to delete from r
 * @return NULL if it aligned at either end else the second half
 */
range *range_split_delete( range *r, range *q )
{
    if ( q->start == r->start )
    {
        r->len -= q->len;
        r->start += q->len;
        return NULL;
    }
    else if ( range_end(q) == range_end(r) )
    {
        r->len -= q->len;
        return NULL;
    }
    else
    {
        range *q2 = range_create( r->name, r->html_name, r->start, r->len );
        if ( q2 != NULL )
        {
            q2->start = range_end(q);
            q2->len = range_end(r) - q->start;
            r->len = q->start-r->start;
        }
        return q2;
    }
}
Exemplo n.º 2
0
void su_seq(su_state *s, int idx, int reverse) {
	value_t v;
	value_t *seq = STK(TOP(idx));
	switch (su_type(s, idx)) {
		case SU_NIL:
			su_pushnil(s);
			return;
		case SU_VECTOR:
			v = it_create_vector(s, seq->obj.vec, reverse);
			break;
		case SU_MAP:
			v = tree_create_map(s, seq->obj.m);
			break;
		case SU_STRING:
			v = it_create_string(s, seq->obj.str, reverse);
			break;
		case SU_SEQ:
			if (reverse) {
				su_seq_reverse(s, idx);
				return;
			} else {
				v = *seq;
			}
			break;
		case SU_NUMBER:
			if (reverse)
				v = range_create(s, (int)seq->obj.num, 0);
			else
				v = range_create(s, 0, (int)seq->obj.num);
			break;
		case SU_FUNCTION:
		case SU_NATIVEFUNC:
			if (!reverse) {
				v = lazy_create(s, seq);
				break;
			}
		default:
			su_error(s, "Can't sequence object of type: %s", type_name((su_object_type_t)seq->type));
	}
	push_value(s, &v);
}
Exemplo n.º 3
0
static struct _CacheEntry* cache_entry_create (fuse_ino_t ino)
{
    struct _CacheEntry* entry = g_malloc (sizeof (struct _CacheEntry));

    entry->ino = ino;
    entry->avail_range = range_create ();
    entry->ll_lru = NULL;
    entry->modification_time = time (NULL);
    entry->version_id = NULL; // version not set

    return entry;
}
Exemplo n.º 4
0
data_t * _range_create(data_t *self, char *name, arguments_t *args) {
  data_t *from;
  data_t *to;
  int     infix = !strcmp(name, "~");

  if (data_debug) {
    _debug("_range_create");
    if (infix) {
      _debug("'%s' ~ '%s'", data_tostring(self), arguments_arg_tostring(args, 0));
    } else {
      _debug("range('%s', '%s')", arguments_arg_tostring(args, 0), arguments_arg_tostring(args, 1));
    }
  }
  from = (infix) ? self : arguments_get_arg(args, 0);
  to = arguments_get_arg(args, (infix) ? 0 : 1);
  return range_create(from, to);
}
Exemplo n.º 5
0
/**
 * Copy a range
 * @param r the range to copy
 * @return the duplicated range
 */
range *range_copy( range *r )
{
    range *r2 = range_create( r->name, r->html_name, r->start, r->len );
    if ( r2 != NULL )
    {
        annotation *a = r->annotations;
        r2->reloff = r->reloff;
        r2->rightmost = r->rightmost;
        while ( a != NULL )
        {
            annotation *a_copy = annotation_clone( a );
            range_add_annotation( r2, a_copy );
            a = annotation_get_next( a );
        }
    }
    else
        warning("range: failed to duplicate range\n");
    return r2;
}
Exemplo n.º 6
0
void su_range(su_state *s, int idx) {
	value_t v = range_create(s, STK(TOP(idx))->obj.num, STK(-1)->obj.num);
	push_value(s, &v);
}
Exemplo n.º 7
0
geo_t *geo_load(geo_t *g, char *filename, int geo_mode) {
    int             n;
    FILE            *fp;
    char            buf[MAX_LINE];
    char            *p;
    unsigned char   *field[2];

    if (!filename) {
        return NULL;
    }

    if (geo_mode != GEO_RANGE && geo_mode != GEO_CIDR) {
        return NULL;
    }

    if (!g) {
        g = (geo_t *)malloc(sizeof(geo_t));
        if (!g) {
            return NULL;
        }

        g->geo_mode = geo_mode;
        if (geo_mode == GEO_RANGE) {
            g->u.range = range_create();
            if (!g->u.range) {
                free(g);
                return NULL;
            }
        } else if (geo_mode == GEO_CIDR) {
            g->u.tree = radix_tree_create();
            if (!g->u.tree) {
                free(g);
                return NULL;
            }
        } else {
            return NULL;
        }
    }

    fp = fopen(filename, "r");
    if (!fp) {
        return NULL;
    }

    while (fgets(buf, MAX_LINE, fp)) {
        n = strlen(buf);
        if (buf[n - 1] == '\n') {
            buf[n - 1] = '\0';
        }

        p = buf;
        while (*p == ' ' || *p == '\t') {
            ++p;
        }

        if (*p == '\0' || *p == '#' || (*p == '/' && *(p + 1) == '/')) {
            continue;
        }

        if (str_explode(NULL, (unsigned char *)p, field, 2) != 2) {
            goto error;
        }

        if (strcmp((char *)field[0], "include") == 0) {
            if (geo_load(g, (char *)field[1], geo_mode) == NULL) {
                goto error;
            }
            continue;
        }

        if (geo_mode == GEO_RANGE) {
            if (geo_parse_range(g, (char *)field[0], (char *)field[1]) != 0) {
                goto error;
            }
        } else if (geo_mode == GEO_CIDR) {
            if (geo_parse_cidr(g, (char *)field[0], (char *)field[1]) != 0) {
                goto error;
            }
        } else {
            /* should NOT get here */
            assert(0);
        }
    }

    fclose(fp);
    return g;

error:
    fclose(fp);
    geo_unload(g);
    return NULL;
}