/*-------------------------------------------------------*/
/* font.c ( YZU_CSE WindTop BBS ) */
/*-------------------------------------------------------*/
/* author : verit.bbs@bbs.yzu.edu.tw */
/* target : bbs 字型產生器 */
/* create : 2003/09/08 */
/*-------------------------------------------------------*/
#undef _MODES_C_
#include "bbs.h"
#define DEF_PATH "/home/bbs/so_tmp/font/"
extern XZ xz[];
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_NONE;
}
static int
font_head(xo)
XO *xo;
{
vs_head("字型產生器", str_site);
outs("\
[←]離開 [Enter]產生字型 [q]查看字型 [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[128];
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, NA))
{
if(echo == DOECHO)
vmsg("取消新增");
else
vmsg("取消修改");
return 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;
}
else
return 0;
}
static int
font_add(xo)
XO *xo;
{
FONT font;
if(!HAVE_PERM(PERM_SYSOP))
return XO_FOOT;
if(font_edit(&font,DOECHO))
{
rec_add(xo->dir, &font, sizeof(FONT));
xo->pos = XO_TAIL /* xo->max */ ;
xo_load(xo, sizeof(FONT));
}
return font_head(xo);
}
static int
font_delete(xo)
XO *xo;
{
if(!HAVE_PERM(PERM_SYSOP))
return XO_FOOT;
if (vans(msg_del_ny) == 'y')
{
if (!rec_del(xo->dir, sizeof(FONT), xo->pos, NULL, NULL))
{
return font_load(xo);
}
}
return XO_FOOT;
}
static int
font_change(xo)
XO *xo;
{
FONT *font, mate;
int pos, cur;
if(!HAVE_PERM(PERM_SYSOP))
return XO_FOOT;
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);
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[128];
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[128];
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[128];
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,
's', font_init,
'd', font_delete,
'h', font_help
};
int
main_font()
{
XO *xo;
char fpath[64];
utmp_mode(M_OMENU);
sprintf(fpath, "%sindex",DEF_PATH);
xz[XZ_OTHER - XO_ZONE].xo = xo = xo_new(fpath);
xz[XZ_OTHER - XO_ZONE].cb = font_cb;
xover(XZ_OTHER);
free(xo);
return 0;
}
--
※ Origin: 元智大學 風之塔 <bbs.yzu.edu.tw>
※ From : bbs.yzu.edu.tw