int closeElf(elf_t *elf) { int res; if (elf == NULL) return EINVAL; while (elf->orgShnum) { elf->orgShnum--; if (elf->scns[elf->orgShnum].content != NULL) free(elf->scns[elf->orgShnum].content); } free(elf->scns); res = freeSegs(elf->segs, elf->ehdr.e_phnum); if (fclose(elf->fp)) { perror(elf->path); return errno; } return res; }
void RenderTreeIntoWindow(comment_item_tree* tree) { zlog_info(c, "Rendering window %dX%d", win->_maxy, win->_maxx); wbkgd(win, COLOR_PAIR(1)); refresh(); wmove(win, 2, 1); //wattron(win, A_BOLD | A_BLINK); wattron(win, A_BOLD); wattron(win, COLOR_PAIR(2)); zlog_info(c, "Starting to parse the tree"); if(mode == MODE_LOADING){ wprintw(win, "Loading in articles...one moment please "); }else{ wprintw(win, "News Comments for article ( %d in total) ", TotalSize(tree) ); } wattroff(win, COLOR_PAIR(2)); wattroff(win, A_BOLD); int row = 4; while (row < 30) { wmove(win, row, 1); wprintw(win, "%*s", 120, ""); row++; } if(msg1 != NULL && mode == MODE_LOADING){ wmove(win, LINES - 4, 1); wprintw(win, "%s", msg1); } row = 4; int txcol = 7; if(_flat != NULL){ free(_flat); } ResetFlatTree(tree); _flat = ToFlatTree(tree, &_total_tree_size); zlog_info(c, "Rendering total of %d rows", _total_tree_size); while (true) { if ( (row - 4) == _total_tree_size || (row - 4) >= WINDOW_SIZE) { break; } int chosen_element = MAX(row + start_row - 4, 0); if(chosen_element >= _total_tree_size){ zlog_info(c, "Hit Max, stopping iteration.."); break; } zlog_info(c, ">>Rendering row %d, ray elem %d - real elem/index %d ", row, row + start_row - 4, chosen_element); RenderRow(win, _flat[chosen_element], &row, txcol, row - 4, 0, -1); } mvwhline(win, 4 + WINDOW_SIZE + 1, 1, ACS_HLINE, COLS ); int _text_start = (int)(LINES/2); if(_selected > -1){ row = _text_start; while (row < LINES - 2) { wmove(win, row, 2); wprintw(win, "%*s", 120, ""); row++; } wmove(win, _text_start, 1); s_segments* segs = splitIntoSegments(_flat[_selected]->text, 90); int _p = 0; for (_p = 0; _p < segs->count; _p++) { wmove(win, _text_start + _p, 4); wprintw(win, "%s", segs->segments[_p]->string); } freeSegs(segs); if(msg1 != NULL){ free(msg1); } msg1 = malloc(50); memset(msg1, 0, 50); sprintf(msg1, "ID: %d", _flat[_selected]->id); wmove(win, LINES - 4, 1); wprintw(win, "%120s", ""); wmove(win, LINES - 4, 1); wprintw(win, "%s", msg1); } /* int BOX_W = 11; int BOX_H = 3; int _stx = 1; int _sty = 21; while (_sty < 35) { while (_stx < 120) { //wattron(win, A_BOLD | A_BLINK); DrawBox(win, BOX_H, BOX_W, _sty, _stx, _stx == 1, _stx > 68); //wattroff(win, A_BOLD | A_BLINK); _stx += BOX_W; } _sty += BOX_H; _stx = 1; } */ }
void PrintTreeItem(const ND* node, int offset, int *counter, node_method method) { int newoffset = offset + 1; int i = 0; ND* tmp = (ND*)node; if (tmp == NULL) return; bool firstChild = true; while (tmp != NULL) { (*counter)++; char* prefix = calloc(20, sizeof(char)); i++; if (offset == 0) { strcpy(prefix, "|"); int y = 0; while (y < 18) { prefix = strcat(prefix, " "); y++; } }else{ int y = 0; while (y < offset) { prefix = strcat(prefix, " "); y++; } if (firstChild) { prefix = strcat(prefix, "\\"); }else{ prefix = strcat(prefix, "|_"); } y = strlen(prefix); while (y < 18) { prefix = strcat(prefix, " "); y++; } } /* printf("[%d] %s %d(%10p,nx=%10p, prev=%10p,Parent=%10p,F/%d) -> %30s (CC=%d)\n" , offset , prefix , isExpanded(tmp) , tmp , tmp->next , tmp->previous , tmp->parent , tmp->flags , tmp->text ,ChildCount(tmp, false) ); printf("[%d - %d - %2d] %s %-25s TS=%4d (id=%d) F=%d) (CC_nr=%d, CC_R=%d, T=%d)\n" , offset , isExpanded(tmp) , *counter , prefix , substring(tmp->text,10) , TotalSize(tmp) , tmp->id , tmp->flags , ChildCount(tmp, false) , ChildCount(tmp, true) , TotalNodeCount(tmp) ); */ s_segments* segs = splitIntoSegments(tmp->text, 60); int y = 0; if (tmp->text != NULL) { /// printf("||%s||@%zu||\n", tmp->text, strlen(tmp->text)); } if (segs->segments[0] == NULL || segs->segments[0]->string == NULL) { printf("Weird....first segment was zero... %s\n", segs->debugText); exit(0); } int c =0; while(c < strlen(segs->segments[0]->string)){ //printf("char at %d (%d) => %c\n", c, (segs->segments[0]->string)[c], (segs->segments[0]->string)[c]); c++; } printf("[depth=%d-id/%d-count/%2d] %s %s \n" , offset , tmp->id , *counter , prefix , segs->segments[y]->string ); if (segs->count > 1) { for (y = 1; y < segs->count; y++) { printf("[%d]%40s%s\n", y, " ", segs->segments[y]->string ); } } if(tmp->linkcount > 0){ int lc=0; for(lc = 0;lc < tmp->linkcount;lc += 2){ printf("%20s Link at %d is (%s)\n"," ", lc, tmp->links[lc]); } } freeSegs(segs); if (ChildCount(tmp, false) > 0 && (method == PRINT_ALL_TREE || isExpanded(tmp))) { PrintTreeItem(tmp->children, newoffset, counter, method); } tmp = tmp->next; firstChild = false; free(prefix); } }