回精華區
作者TKyo.bbs@cpu.tfcis.org (暗黑貴公子) 看板: plan
標題[新增] window.c pans() pmsg() 支援 ANSI 字元碼
時間動力核心 (2005/04/11 Mon 18:00:23) Updated: 2005/04/11
/* 本程式碼需先更新過 windows.c pans/pmsg 置中程式碼 */

: maple/window.c
#include "bbs.h"

/* 新增函式 : 剔除 ANSI 字元碼及傳回真正字串長度 */
static int
chk_ansi(char *str)
{
  int i = 0, ch;
  int is_ansi = 0;

  while (ch = *str)
  {
    if (is_ansi)
    {
      if (ch == 'm')
        is_ansi = 0;
    }
    else
    {
      if (ch == KEY_ESC)
        is_ansi = 1;
      else
        i++;
    }
    str++;
  }

  return i;
}

: maple/window.c : pans()
int             /* 傳回小寫字母或數字 */
pans(x, y, title, desc)
  int x, y;
  char *title;
  char *desc[];
{
- int cur, old_cur, max, ch;
+ int cur, old_cur, max, ch, i; /* 新增變數 i, 加速用 */
  char hotkey;

   /* 找出 title 及 desc 中最長的長度 */
  char buf[512];        /* tsaikd.041005 title 可能有好幾行 */
  strcpy(buf, title);
- desc_maxlen = strlen(strtok(buf, "\n"));
+ desc_maxlen = chk_ansi(strtok(buf, "\n"));
  char *tmp;
- while ( (tmp = strtok(NULL, "\n")) !=NULL )
-   desc_maxlen = (desc_maxlen > strlen(tmp)) ? desc_maxlen : strlen(tmp);
+ while ((tmp = strtok(NULL, "\n")) != NULL)
+   desc_maxlen = ((i = chk_ansi(tmp)) > desc_maxlen) ? i : desc_maxlen;

- for( ch=1 ; desc[ch] ; ch++ )
-   desc_maxlen = (desc_maxlen > strlen(desc[ch])) ?
-\       desc_maxlen : strlen(desc[ch]);
+ for (ch = 1; desc[ch]; ch++)
+   desc_maxlen = ((i = chk_ansi(desc[ch])) > desc_maxlen) ? i : desc_maxlen;
  .
  .
  .
}

: maple/window.c : draw_item()
{
  .
  .
  .
- sprintf(buf, " │%s%c %c%c%c%-25s  \033[m│ ",
+ sprintf(buf, " │%s%c %c%c%c%-s%*c\033[m│ ",
  .
  .
  .
- (hotkey == *desc) ? ']' : ')', desc + 1);
+ (hotkey == *desc) ? ']' : ')', desc + 1,
+ (desc_maxlen - chk_ansi(desc + 1)), ' ');
  .
  .
  .
}

: maple/window.c : draw_menu()
{
  .
  .
  .
  /* tsaikd.041005 借用 meet */
- meet = strlen(ptitle[i]) + (strlen(ptitle[i]) % 2);
+ meet = chk_ansi(ptitle[i]) + (chk_ansi(ptitle[i]) % 2);
  .
  .
  .
}

: maple/window.c : pmsg()
- int len, x, y, i;
+ int len, x, y, i, j; /* 新增變數 j, 加速用 */

- len = strlen(strtok(buf, "\n"));
- for( i=1 ; (pbuf = strtok(NULL, "\n")) != NULL ; i++ )
-   len = len<strlen(pbuf) ? strlen(pbuf) : len;

+ len = chk_ansi(strtok(buf, "\n"));
+ for (i = 1; (pbuf = strtok(NULL, "\n")); i++)
+   len = ((j = chk_ansi(pbuf)) > len) ? j : len;
  .
  .
  .
}

--
  Origin:  Maple-itoc˙動力核心  cpu.tfcis.org 
  Author: TKyo cszone.twbbs.org 發表
精華選讀←離開[主題上]主題下(k)上篇(j)下篇S/a搜尋 G串列 TAB精華 ↑↓捲 Pg/Space翻