/* 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); }
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; }
VOID zap_objindex(LONG tree, WORD obj) { map_tree(tree, obj, GET_NEXT(tree, obj), (fkt_parm)del_objindex); }
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; }
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 */ } }
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 */ } }