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