回文章列表
作者dust.bbs@bbs.tcfsh.tc.edu.tw (灰塵 (......)) 看板: itoc
標題[修正] board.c xover.c 閱讀看板自動跳去非置底文
時間龍夢紀元 (2008/06/24 Tue 19:20:10)
讓游標自動跳去最後一篇非置底文,而不是最後一篇



缺點
1.增加I/O
2.說不定會有人沒看到新的置底文



: board.c

-#ifdef AUTO_JUMPPOST
    xz[XZ_POST - XO_ZONE].xo = xo = xo_get_post(fpath, brd);
-#else
-   xz[XZ_POST - XO_ZONE].xo = xo = xo_get(fpath);
-#endif


: xover.c 從 #ifdef AUTO_JUMPPOST 到 #endif 這段砍掉,加上這段

XO *
xo_get_post(path, brd)      /* itoc.010910: 參考 xover.c xo_get(),為 XoPost
量
身
打造 */
  char *path;
  BRD *brd;
{
  XO *xo;
#ifdef AUTO_JUMPPOST
  time_t chrono;
  int fd;
  int pos, locus, mid;  /* locus:左指標 mid:中指標 pos:右指標 */

  for (xo = xo_root; xo; xo = xo->nxt)
  {
    if (!strcmp(xo->dir, path))
      return xo;
  }

  xo = xo_new(path);
  xo->nxt = xo_root;
  xo_root = xo;
  xo->xyz = NULL;

  /* 尚未更新 brd->blast 或 最後一篇已讀 或 只有一篇,則游標直接放最後 */
  if (brd->btime < 0 || !brh_unread(brd->blast) ||
    (pos = rec_num(path, sizeof(HDR))) <= 1 || (fd = open(path, O_RDONLY)) <
0)
  {
    xo->pos = XO_TAIL;  /* 游標放在最後面 */
    return xo;
  }

  /* 找第一篇未讀 binary search */
  pos--;
  locus = 0;
  while (1)
  {
    if (pos <= locus + 1)
      break;

    mid = locus + ((pos - locus) >> 1);
    lseek(fd, (off_t) (sizeof(HDR) * mid), SEEK_SET);
    if (read(fd, &chrono, sizeof(time_t)) == sizeof(time_t))
    {
      if (brh_unread(chrono))
    pos = mid;
      else
    locus = mid;
    }
    else
    {
      break;
    }
  }

  /* 特例: 如果右指標停留在 1,有二種可能,一是恰讀到第二篇,另一為連第一篇都
沒讀 */
  if (pos == 1)
  {
    /* 檢查第一篇是否已讀 */
    lseek(fd, (off_t) 0, SEEK_SET);
    if (read(fd, &chrono, sizeof(time_t)) == sizeof(time_t))
    {
      if (brh_unread(chrono))   /* 若連第一篇也未讀,pos 調回去第一篇 */
    pos = 0;
    }
  }

  close(fd);
  xo->pos = pos;    /* 第一次進入時,將游標放在第一篇未讀 */

#else
  int i, fd;
  HDR hdr;

  for (xo = xo_root; xo; xo = xo->nxt)
  {
    if (!strcmp(xo->dir, path))
      return xo;
  }

  xo = xo_new(path);
  xo->nxt = xo_root;
  xo_root = xo;
  xo->xyz = NULL;
  xo->pos = XO_TAIL;

  if((fd = open(path, O_RDONLY))>=0)
  {
    for(i=0;read(fd, &hdr, sizeof(HDR))>0;i++)
    {
      if(!(hdr.xmode & POST_BOTTOM))
      {
        xo->pos = i;
      }
    }
  }
  close(fd);

 #endif

  return xo;
}



--
c▄�c          �
        / \  少女呼風中...      ◣東方project系列y ● ● \|      ● ● ̄ ̄ ̄ ̄ ̄ ̄ ̄
    \eee/� �ee▂�c▃▃▃▃▃▃▃▃▃   持續推廣ing<i"i) <ii▇�h▃▁          █◤
◣       /_:\      ▇▆▅▆▇ψ涼宮 域  gbwind   

--
◢◣◢◤    #  Origin  #  台中一中  龍夢紀元  bbs.tcfsh.tc.edu.tw
◥◣◥◣  #  Author  # dust
  ◢◤◥◤  #  From    # proxy2.tcfsh.tc.edu.tw
文章選讀←離開[主題上]主題下(k)上篇(j)下篇S/a搜尋 G串列 TAB精華 ↑↓捲 Pg/Space翻