コード例 #1
0
/* Aplica una funcion a todos los elementos del árbol */
void map_tree(void (*func)(void *), TREE *t)
{
    TREE *c;

    if(t->childs != NULL)
    {
        c = (TREE *)first_l(t->childs);
        while(c != NULL)
        {
            map_tree(func, c);
            c = (TREE *)next_l(t->childs);
        }
    }
    (*func)(t->value);
}
コード例 #2
0
ファイル: tree.c プロジェクト: BorderCloud/4store
fs_index_node fs_tree_new_index_node(fs_tree *t)
{
    //TIME(NULL);
    while (t->header->length >= t->header->size) {
        int length = t->header->length;
        int size = t->header->size;
        unmap_tree(t);
        map_tree(t, length, size + FS_INDEX_ROOTS);
        //TIME("grow tree");
    }

    memset(&t->data[t->header->length], 0, sizeof(fs_tree_index));
    fs_index_node ret = FS_TREE_NODE(t->header->length);
    (t->header->length)++;
    //TIME("new tree node");

    return ret;
}
コード例 #3
0
ファイル: RCSDATA.C プロジェクト: daemqn/Atari_ST_Sources
VOID zap_objindex(LONG tree, WORD obj)
{
	map_tree(tree, obj, GET_NEXT(tree, obj), (fkt_parm)del_objindex);
}
コード例 #4
0
ファイル: tree.c プロジェクト: BorderCloud/4store
fs_tree *fs_tree_open_filename(fs_backend *be, const char *name, const char *filename, int flags)
{
    struct tree_header header;

    fs_tree *t = calloc(1, sizeof(fs_tree));
    int fd = open(filename, FS_O_NOATIME | O_RDWR | flags, FS_FILE_MODE);
    if (fd == -1) {
        fs_error(LOG_ERR, "failed to open tree file '%s': %s", filename, strerror(errno));
        return NULL;
    }
    t->filename = (char *)filename;
    t->fd = fd;
    t->be = be;
    int ret = read(fd, &header, sizeof(header));
    if (ret == 0 || flags & O_TRUNC) {
        /* it's a blank file, probably */
        int ret = ftruncate(fd, 0);
        if (ret == -1) {
            fs_error(LOG_WARNING, "failed to truncate treefile");
        }
        t->bc = fs_chain_open(be, name, flags);
        map_tree(t, FS_INDEX_ROOTS, FS_INDEX_ROOTS * 2);
        strncpy(t->header->chainfile, t->bc->filename, 256);
        t->header->id = TREE_ID;

        return t;
    }
    if (header.id != TREE_ID) {
        fs_error(LOG_ERR, "'%s' does not appear to be a valid treefile", filename);
        close(fd);

        return NULL;
    }
    t->bc = fs_chain_open_filename(header.chainfile, flags);
    if (!t->bc) {
        fs_error(LOG_CRIT, "failed to open chain file '%s'", header.chainfile);

        return NULL;
    }

    map_tree(t, header.length, header.size);

    char *blfile = g_strdup_printf("%sbl", t->filename);
    int blfd = open(blfile, FS_O_NOATIME | O_CREAT | O_RDONLY, FS_FILE_MODE);
    if (blfd == -1) {
        fs_error(LOG_WARNING, "failed to open to blacklist file %s: %s",
                blfile, strerror(errno));
    } else {
        int ret;
        fs_rid ab[2];
        do {
            ret = read(blfd, &ab, 2 * sizeof(fs_rid));
            if (ret == 2 * sizeof(fs_rid)) {
                fs_tree_blacklist_index(t, ab[0], ab[1]);
            }
        } while (ret == 2 * sizeof(fs_rid));
        if (ret == -1) {
            fs_error(LOG_ERR, "error reading blacklist file %s: %s", blfile,
                    strerror(errno));
        }
    }
    g_free(blfile);
   
    return t;
}
コード例 #5
0
ファイル: RCSEDIT.C プロジェクト: daemqn/Atari_ST_Sources
VOID edit_icon(LONG tree, WORD sobj)
{
	LONG	obspec, taddr; 
	WORD	where, type, itmp, exitobj, ok;
	GRECT	p;
	BYTE	text[14], valid[2], name[9]; 
	WORD	trule, crule, w, h;

	if (rcs_state != ALRT_STATE)
	{
		get_fields(tree, sobj, &type, &obspec, &p);

		ini_tree(&tree, ICONDIAL);
		where = set_obname(tree, ICONNAME, name, ad_view, sobj);
		taddr = LLGET(obspec);
		set_text(tree, IBTEXT, (LONG)ADDR(&text[0]), 13);
		set_text(tree, IBCHAR, (LONG)ADDR(&valid[0]), 2);
		icon_set(taddr, &text[0], &valid[0]);
		trule = icon_twhich(LWGET(IB_YTEXT(taddr)), LWGET(IB_HICON(taddr)));
		sel_obj(tree, IBTPOS0 + trule);
		itmp = icon_cwhich(LWGET(IB_YCHAR(taddr)),
			gl_hschar, LWGET(IB_HICON(taddr)));
		crule = icon_cwhich(LWGET(IB_XCHAR(taddr)),
			gl_wschar, LWGET(IB_WICON(taddr)));
		crule += 3 * itmp;
		sel_obj(tree, IBCPOS0 + crule);

		do {
			exitobj = hndl_dial(tree, IBTEXT, &p);
			desel_obj(tree, exitobj);
			ok = DEFAULT & GET_FLAGS(tree, exitobj);
		} while (ok && !name_ok(name, where, TRUE));

		if (ok)
		{
			rcs_edited = TRUE;
			get_obname(name, ad_view, sobj);
			icon_get(taddr, &text[0], &valid[0]);
			itmp = encode(tree, IBTPOS0, 3);
			if (itmp != trule)
			{		
				itmp = icon_tapply(itmp, gl_hschar,
					LWGET(IB_HICON(taddr)));
				LWSET(IB_YTEXT(taddr), itmp);
			}
			LWSET(IB_WTEXT(taddr), (WORD)(gl_wschar * strlen(text)));
			icon_tfix(taddr);
			itmp = encode(tree, IBCPOS0, 9);
			if (itmp != crule)
			{
				crule = itmp;
				itmp = icon_capply(crule / 3, gl_hschar,
					LWGET(IB_HICON(taddr)));
				LWSET(IB_YCHAR(taddr), itmp);
				itmp = icon_capply(crule % 3, gl_wschar,
					LWGET(IB_WICON(taddr)));
				LWSET(IB_XCHAR(taddr), itmp);
			}
			icon_wh(taddr, &w, &h);
			newsize_obj(ad_view, sobj, w, h, FALSE);
		}
		map_tree(tree, ROOT, NIL, (fkt_parm)desel_obj);	/* clear radio buttons */
	}
}
コード例 #6
0
ファイル: RCSEDIT.C プロジェクト: daemqn/Atari_ST_Sources
VOID edit_text(LONG tree, WORD sobj)
{
	LONG	obspec, taddr; 
	WORD	min_width, where, type, deftext, w, h, exitobj, ok;
	GRECT	p;
	BYTE	text[73], valid[73], tmplt[73], name[9]; 

	if (rcs_state != ALRT_STATE)
	{
		get_fields(tree, sobj, &type, &obspec, &p);
		taddr = LLGET(obspec);
		if (type == G_FTEXT || type == G_FBOXTEXT)
			if (LSTRLEN(LLGET(TE_PTMPLT(taddr))) > 72)
				return;
		ini_tree(&tree, TEXTDIAL);
		where = set_obname(tree, TEXTNAME, name, ad_view, sobj);
		set_text(tree, OTMPITEM, (LONG)ADDR(&tmplt[0]), 73);
		set_text(tree, OVALITEM, (LONG)ADDR(&valid[0]), 73);
		set_text(tree, OTEXITEM, (LONG)ADDR(&text[0]), 73);
		LLSTRCPY(LLGET(TE_PTMPLT(taddr)), (LONG)ADDR(&tmplt[0]));
		ted_set(taddr, &tmplt[0], &valid[0], &text[0]);

		if (type == G_TEXT || type == G_BOXTEXT)
		{
			if (LSTRLEN(LLGET(TE_PTEXT(taddr))) > 72)
				return;
			hide_obj(tree, TMPLTTAG);
			hide_obj(tree, OTMPITEM);
			hide_obj(tree, VALIDTAG);
			hide_obj(tree, OVALITEM);
			deftext = OTEXITEM;
		}		   
		else
			deftext = (tmplt[0] != '@')? OTMPITEM: OTEXITEM;
		do {
			exitobj = hndl_dial(tree, deftext, &p);
			desel_obj(tree, exitobj);
			ok = DEFAULT & GET_FLAGS(tree, exitobj);
		} while (ok && !name_ok(name, where, TRUE));

		if (ok)
		{
			rcs_edited = TRUE;
			get_obname(name, ad_view, sobj);
			ted_get(taddr, &tmplt[0], &valid[0], &text[0]);
			if (type == G_TEXT || type == G_FTEXT || type == G_BOXTEXT)
			{
				text_wh(taddr, type, &w, &h);
				min_width = GET_WIDTH(ad_view, sobj);
				if ( w > min_width)
					newsize_obj(ad_view, sobj, w, h, TRUE);
			}
		}

		unhide_obj(tree,TMPLTTAG);
		unhide_obj(tree,OTMPITEM);
		unhide_obj(tree, VALIDTAG);
		unhide_obj(tree,OVALITEM);
		map_tree(tree, ROOT, NIL, (fkt_parm)desel_obj);	/* clear radio buttons */
	}
}