TagItem *FindTaggedItem(const fileheader_t *fh) { if (IsEmptyTagList()) return NULL; return (TagItem*)bsearch( fh->filename, TagList, TagNum, sizeof(TagItem), compare_tagitem); }
TagItem *RemoveTagItem(const fileheader_t *fh) { TagItem *tag = IsEmptyTagList() ? NULL : FindTaggedItem(fh); if (!tag) return tag; TagNum--; memmove(tag, tag + 1, (TagNum - (tag - TagList)) * sizeof(TagItem)); return tag; }
static int _iter_delete_tagged(void *ptr, void *opt) { fileheader_t *fh = (fileheader_t*) ptr; const char *direct = (const char*)opt; if ((fh->filemode & FILE_MARKED) || (fh->filemode & FILE_DIGEST)) return 0; if (!FindTaggedItem(fh)) return 0; // only called by home or board, no need for man. // so backup_direct can be same as direct. delete_file_content(direct, fh, direct, NULL, 0); return IsEmptyTagList(); }
int TagPruner(int bid) { boardheader_t *bp=NULL; char direct[PATHLEN]; assert(bid >= 0); /* bid == 0 means in mailbox */ if (bid && currstat != RMAIL) { bp = getbcache(bid); if (is_readonly_board(bp->brdname)) return DONOTHING; setbdir(direct, bp->brdname); } else if(currstat == RMAIL) { sethomedir(direct, cuser.userid); } else { vmsg("抱歉,程式異常 - 請至 " BN_BUGREPORT " 報告您剛的詳細步驟。"); return FULLUPDATE; } if (IsEmptyTagList() || (currstat == READING && !(currmode & MODE_BOARD))) return DONOTHING; if (vans("刪除所有標記[N]?") != 'y') return READ_REDRAW; // ready to start. outmsg("處理中,請稍後..."); refresh(); // first, delete and backup all files apply_record(direct, _iter_delete_tagged, sizeof(fileheader_t), direct); // now, delete the header #ifdef SAFE_ARTICLE_DELETE if(bp && !(currmode & MODE_DIGEST) && bp->nuser >= SAFE_ARTICLE_DELETE_NUSER) safe_delete_range(currdirect, 0, 0); else #endif delete_range(currdirect, 0, 0); TagNum = 0; if (bid) setbtotal(bid); else if(currstat == RMAIL) setupmailusage(); return NEWDIRECT; }
static int _iter_paste_tag(void *item, void *optarg) { char buf[PATHLEN]; char title[TTLEN + 1] = "◇ "; fileheader_t *fhdr = (fileheader_t*) item; _iter_paste_tag_param *param = (_iter_paste_tag_param*) optarg; param->item ++; // XXX many process crashed here as fhdr.filename[0] == 0 // let's workaround it? or trace? if (!fhdr->filename[0]) { grayout(0, b_lines-2, GRAYOUT_DARK); move(b_lines-1, 0); clrtobot(); prints("處理 #%d 項發生錯誤。 請把你剛剛進行的完整步驟貼到 " BN_BUGREPORT " 板。\n", param->item); vmsg("忽略錯誤並繼續進行。"); return 0; } if (!FindTaggedItem(fhdr)) return 0; if (TagBoard == 0) sethomefile(buf, cuser.userid, fhdr->filename); else { setbfile(buf, param->bh->brdname, fhdr->filename); } if (!dashf(buf)) return 0; strlcpy(title + 3, fhdr->title, sizeof(title) - 3); a_copyitem(buf, title, 0, 0); if (param->mode) { param->mode--; a_pasteitem(param->pm, 0); } else a_appenditem(param->pm, 0); param->copied++; RemoveTagItem(fhdr); return IsEmptyTagList(); }
static int a_pastetagpost(menu_t * pm, int mode) { boardheader_t *bh = NULL; char dirname[PATHLEN]; _iter_paste_tag_param param = {0}; param.pm = pm; param.mode = mode; if (TagBoard == 0){ sethomedir(dirname, cuser.userid); } else{ bh = getbcache(TagBoard); setbdir(dirname, bh->brdname); param.bh = bh; } // prevent if anything wrong if (TagNum > MAXTAGS || TagNum < 0) { vmsg("內部錯誤。請把你剛剛進行的完整步驟貼到 " BN_BUGREPORT " 板。"); return 0; } if (IsEmptyTagList()) return 0; /* since we use different tag features, * copyqueue is not required/used. */ copyqueue_reset(); apply_record(dirname, _iter_paste_tag, sizeof(fileheader_t), ¶m); TagNum = 0; return param.copied; }