精華區beta SetupBBS 關於我們 聯絡資訊
/*-------------------------------------------------------*/ /* 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