int main() { int fd, n; SCHEMA *usr; struct stat st; chdir(BBSHOME); if ((fd = open(FN_SCHEMA, O_RDONLY)) < 0) { printf("ERROR at open file\n"); exit(1); } fstat(fd, &st); usr = (SCHEMA *) malloc(st.st_size); read(fd, usr, st.st_size); close(fd); printf("\n%s ==> %ld bytes\n", FN_SCHEMA, st.st_size); fd = st.st_size / sizeof(SCHEMA); for (n = 0; n < fd; n++) { /* userno: 在 .USR 中是第幾個 slot */ /* uptime: 註冊的時間 (若 ID 是空白則是被 reaper 掉的時間) */ /* userid: ID (若是空白表示此人被 reaper 了) */ printf("userno:%d uptime:%s userid:%-12.12s\n", n + 1, Btime(&usr[n].uptime), usr[n].userid); if (n % 23 == 22) /* 每 23 筆按任意鍵繼續 */ { printf("-== Press ENTER to continue and 'q + ENTER' to quit ==-\n"); if (getchar() == 'q') break; } } free(usr); return 0; }
static int pad_draw() { int i, cc, fdr, color; FILE *fpw; Pad pad; char *str, buf[3][71]; /* itoc.註解: 不想用高彩度,太花 */ static char pcolors[6] = {31, 32, 33, 34, 35, 36}; /* itoc.010309: 留言板提供不同的顏色 */ color = vans("心情顏色 1) \033[41m \033[m 2) \033[42m \033[m 3) \033[43m \033[m " "4) \033[44m \033[m 5) \033[45m \033[m 6) \033[46m \033[m [Q] "); if (color < '1' || color > '6') return XEASY; else color -= '1'; do { buf[0][0] = buf[1][0] = buf[2][0] = '\0'; move(MENU_XPOS, 0); clrtobot(); outs("\n請留言 (至多三行),按[Enter]結束"); for (i = 0; (i < 3) && vget(16 + i, 0, ":", buf[i], 71, DOECHO); i++); cc = vans("(S)存檔觀賞 (E)重新來過 (Q)算了?[S] "); if (cc == 'q' || i == 0) return 0; } while (cc == 'e'); time(&(pad.tpad)); /* itoc.020812.註解: 改版面的時候要注意 struct Pad.msg[] 是否夠大 */ str = pad.msg; sprintf(str, "╭┤\033[1;46m %s - %s \033[m├", cuser.userid, cuser.username); for (cc = strlen(str); cc < 60; cc += 2) strcpy(str + cc, "─"); if (cc == 60) str[cc++] = ' '; sprintf(str + cc, "\033[1;44m %s \033[m╮\n" "│ \033[1;%dm%-70s\033[m │\n" "│ \033[1;%dm%-70s\033[m │\n" "╰ \033[1;%dm%-70s\033[m ╯\n", Btime(&(pad.tpad)), pcolors[color], buf[0], pcolors[color], buf[1], pcolors[color], buf[2]); f_cat(FN_RUN_NOTE_ALL, str); if (!(fpw = fopen(FN_RUN_NOTE_TMP, "w"))) return 0; fwrite(&pad, sizeof(pad), 1, fpw); if ((fdr = open(FN_RUN_NOTE_PAD, O_RDONLY)) >= 0) { Pad *pp; i = 0; cc = pad.tpad - NOTE_DUE * 60 * 60; mgets(-1); while (pp = mread(fdr, sizeof(Pad))) { fwrite(pp, sizeof(Pad), 1, fpw); if ((++i > NOTE_MAX) || (pp->tpad < cc)) break; } close(fdr); } fclose(fpw); rename(FN_RUN_NOTE_TMP, FN_RUN_NOTE_PAD); pad_view(); return 0; }