回精華區
作者verit.bbs@bbs.yzu.edu.tw (BBS 站長大會), 看板: installbbs
標題[WindTop]BBS字型產生器
時間元智大學風之塔 (Tue Sep 9 19:57:26 2003) Updated: 2003/09/10
: menu.c 適當的選單加入

  "bin/font.so:main_font", 0, - M_XMODE,
  "OFont      ♂ 字型產生 ♀",

: run/font

  建立此目錄

: run/font/help 新增此檔案

1. 投稿字型格式如下 :

╔╦═╮
╠╬═╣
╚╝  ╰
╔╦═╮
╠╬═╮
╚╩═╯
╭╦═╮
╠╣
╰╩═╯
╔╦═╮
╠╣  ║
╚╩═╯
..... 依此類推,從A到Z ~

2. 字型沒有長、寬的限制。

3. 字型不能有控制碼。

4. 盡量所有字體統一大小。

: src/so/Makeifle

SO =    .... font.so

: src/so/font.c 新增此程式

/*-------------------------------------------------------*/
/* font.c       ( YZU_CSE WindTop BBS )                  */
/*-------------------------------------------------------*/
/* author : verit.bbs@bbs.yzu.edu.tw                     */
/* target : bbs 字型產生器                               */
/* create : 03/09/08                                     */
/* update :   /  /                                       */
/*-------------------------------------------------------*/


#include "bbs.h"

#define DEF_PATH    "run/font/"

extern XZ xz[];
extern char xo_pool[];

static int font_add();

typedef struct
{
  char name[32];
  char fpath[16];
  char author[32];
  int height;
  int width;
  char tmp[40];
}      FONT;


static void
font_item(num, font)
  int num;
  FONT *font;
{
  prints("%6d     %-32s%-s\n", num, font->name, font->author);
}


static int
font_body(xo)
  XO *xo;
{
  FONT *font;
  int num, max, tail;

  move(3, 0);
  clrtobot();
  max = xo->max;
  if (max <= 0)
  {
    if (vans("要新增資料嗎(Y/N)?[N] ") == 'y')
      return font_add(xo);
    return XO_QUIT;
  }

  font = (FONT *) xo_pool;
  num = xo->top;
  tail = num + XO_TALL;
  if (max > tail)
    max = tail;

  do
  {
    font_item(++num, font++);
  } while (num < max);

  return XO_FOOT;
}


static int
font_head(xo)
  XO *xo;
{
  vs_head("字型產生器", str_site);
  outs("[←]離開 [Enter]產生字型 [q]瀏覽 [^P]新增 [c]修改 [d]刪除 [h]投稿格式\n"
    "\033[30;47m  編號     字  型  名  稱                  作     者                          \033[m");
  return font_body(xo);
}


static int
font_load(xo)
  XO *xo;
{
  xo_load(xo, sizeof(FONT));
  return font_body(xo);
}


static int
font_init(xo)
  XO *xo;
{
  xo_load(xo, sizeof(FONT));
  return font_head(xo);
}


static int
font_edit(font, echo)
  FONT *font;
  int echo;
{
  char fpath[64];

  if (echo == DOECHO)
  {
    time_t t = time(0);
    memset(font, 0, sizeof(FONT));
    archiv32(t, font->fpath);
  }

  if (vget(b_lines, 0, "字型名稱:", font->name, sizeof(font->name), echo))
  {
    sprintf(fpath, "%s%s", DEF_PATH, font->fpath);
    if (!vedit(fpath, 0))
    {
      vget(b_lines, 0, "字型作者:", font->author, sizeof(font->author), echo);
      sprintf(fpath, "%d", font->height);
      vget(b_lines, 0, "字型高度:", fpath, 3, echo);
      font->height = atoi(fpath);
      sprintf(fpath, "%d", font->width);
      vget(b_lines, 0, "字型寬度:", fpath, 3, echo);
      font->width = atoi(fpath);
      return 1;
    }

    vmsg(echo == DOECHO ? "取消新增" : "取消修改");
  }

  return 0;
}


static int
font_add(xo)
  XO *xo;
{
  FONT font;

  if (!HAS_PERM(PERM_SYSOP))
    return XO_NONE;

  if (font_edit(&font, DOECHO))
  {
    rec_add(xo->dir, &font, sizeof(FONT));
    xo->pos = XO_TAIL;
    xo_load(xo, sizeof(FONT));
  }
  return font_head(xo);
}


static int
font_delete(xo)
  XO *xo;
{
  if (!HAS_PERM(PERM_SYSOP))
    return XO_NONE;

  if (vans(msg_del_ny) == 'y')
  {
    if (!rec_del(xo->dir, sizeof(FONT), xo->pos, NULL))
    {
      FONT *font;
      char fpath[64];
      font = (FONT *) xo_pool + (xo->pos - xo->top);
      sprintf(fpath, "%s%s", DEF_PATH, font->fpath);
      unlink(fpath);
      return font_load(xo);
    }
  }
  return XO_FOOT;
}


static int
font_change(xo)
  XO *xo;
{
  FONT *font, mate;
  int pos, cur;

  if (!HAS_PERM(PERM_SYSOP))
    return XO_NONE;

  pos = xo->pos;
  cur = pos - xo->top;
  font = (FONT *) xo_pool + cur;

  mate = *font;
  font_edit(font, GCARRY);
  if (memcmp(font, &mate, sizeof(FONT)))
  {
    rec_put(xo->dir, font, sizeof(FONT), pos, NULL);
    move(3 + cur, 0);
    font_item(++pos, font);
  }

  return XO_INIT;
}

static int
font_browser(xo)
  XO *xo;
{
  FONT *font;
  int pos, cur;
  char fpath[64];

  pos = xo->pos;
  cur = pos - xo->top;
  font = (FONT *) xo_pool + cur;
  sprintf(fpath, "%s%s", DEF_PATH, font->fpath);
  more(fpath, NULL);
  return XO_INIT;
}

static int
font_create(xo)
  XO *xo;
{
  FONT *font;
  int pos, cur;
  char fpath[64];
  char buf[26][128];
  FILE *fp;
  char str[9];
  int len;
  int x;

  if (!vget(b_lines, 0, "請輸入欲產生的字串 : ", str, sizeof(str), DOECHO))
    return XO_FOOT;

  pos = xo->pos;
  cur = pos - xo->top;
  font = (FONT *) xo_pool + cur;
  sprintf(fpath, "%s%s", DEF_PATH, font->fpath);

  fp = fopen(fpath, "r");
  if (!fp)
    return XO_FOOT;

  pos = 0;
  cur = 0;
  memset(buf, sizeof(buf), 0);
  while (fgets(fpath, sizeof(fpath), fp))
  {
    for (len = strlen(fpath) - 1; len < font->width; ++len)
      fpath[len] = ' ';
    fpath[len] = 0;

    if (cur)
      strcat(buf[pos], fpath);
    else
      strcpy(buf[pos], fpath);
    if (++cur >= font->height)
    {
      ++pos;
      cur = 0;
    }
    if (pos >= 26)
      break;
  }

  fclose(fp);
  clear();
  vs_head("字型產生器", str_site);

  x = 3;
  move(x, 0);
  prints("你要產生的字串為 : %s", str);
  x += 2;
  move(x, 0);
  len = strlen(str);
  for (cur = 0; cur < font->height; ++cur)
  {
    for (pos = 0; pos < len; ++pos)
    {
      /* 小寫 */
      if (str[pos] >= 'a' && str[pos] <= 'z')
      {
        strncpy(fpath, &(buf[str[pos] - 'a'][font->width * cur]), font->width);
        outs(fpath);
      }
      else if (str[pos] >= 'A' && str[pos] <= 'Z')
      {
        strncpy(fpath, &(buf[str[pos] - 'A'][font->width * cur]), font->width);
        outs(fpath);
      }
    }
    outc('\n');
  }
  vmsg(NULL);
  return XO_INIT;
}

static int
font_help(xo)
  XO *xo;
{
  char fpath[64];

  sprintf(fpath, "%shelp", DEF_PATH);
  more(fpath, NULL);
  return font_head(xo);
}


KeyFunc font_cb[] =
{
  XO_INIT, font_init,
  XO_LOAD, font_load,
  XO_HEAD, font_head,
  XO_BODY, font_body,

  Ctrl('P'), font_add,
  'r', font_create,
  'q', font_browser,
  'c', font_change,
  'd', font_delete,
  'h', font_help
};


int
main_font()
{
  XO *xo;
  char fpath[64];

  /* 借用 XZ_PAL,所以 feeter 會不對,沒差 :p */
  sprintf(fpath, "%sindex", DEF_PATH);
  xz[XZ_PAL - XO_ZONE].xo = xo = xo_new(fpath);
  xz[XZ_PAL - XO_ZONE].cb = font_cb;
  xover(XZ_PAL);
  free(xo);

  return 0;
}

--
※ Origin: 元智大學 風之塔 <bbs.yzu.edu.tw> 
※ From  : bbs.yzu.edu.tw
精華選讀←離開[主題上]主題下(k)上篇(j)下篇S/a搜尋 G串列 TAB精華 ↑↓捲 Pg/Space翻