作者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