int bbsbkndoc_main() { FILE *fp; char board[80], bkn[80], dir[160], *ptr, genbuf[STRLEN]; struct boardmem *x1; struct fileheader x; int i, start, total; html_header(1); printf("<script src=" BBSJS "></script>\n"); changemode(BACKNUMBER); //check_msg(); getparmboard(board, sizeof(board)); strsncpy(bkn, getparm("bkn"), 32); ptr = bkn; while (*ptr) { if (*ptr != 'B' && *ptr != '.' && !isdigit(*ptr)) http_fatal("错误的过刊号"); ptr++; } if (strlen(bkn) < 3) http_fatal("错误的过刊号"); x1 = getboard(board); if (x1 == 0) nosuchboard(board, "bbsbkndoc"); else { updateinboard(x1); strcpy(board, x1->header.filename); sprintf(dir, "boards/.backnumbers/%s/%s", board, bkn); if (!file_exist(dir)) http_fatal("没有这卷过刊"); sprintf(dir, "boards/.backnumbers/%s/%s/.DIR", board, bkn); fp = fopen(dir, "r"); total = file_size(dir) / sizeof (struct fileheader); start = getdocstart(total, w_info->t_lines); printf("<body topmargin=0>"); printf("<nobr><center>\n"); sprintf(genbuf, "阅览过刊 文章数[%d]", total); printboardtop(x1, 5, genbuf); if (total <= 0) http_fatal("本卷过刊目前没有文章"); printf("<table cellSpacing=0 cellPadding=2>\n"); printf ("<tr class=docbgcolor><td>序号<td>状态<td>作者<td>日期<td>标题<td>星级<td>评价</td>\n"); if (fp) { fseek(fp, (start - 1) * sizeof (struct fileheader), SEEK_SET); for (i = 0; i < w_info->t_lines; i++) { char filename[255]; char *ptr; if (fread(&x, sizeof (x), 1, fp) <= 0) break; if (x.accessed & FH_HIDE) { printf ("<tr><td>%d<td> <td>不详<td>不详<td>-本文已经被删除-<td>\n", start + i); continue; } ptr = flag_str2(x.accessed, 1); sprintf(filename, "boards/.backnumbers/%s/%s/%s", board, bkn, fh2fname(&x)); printf("<tr><td>%d<td>%s<td>%s", start + i, ptr, userid_str(x.owner)); printf("<td>%12.12s", Ctime(x.filetime) + 4); x.title[40] = 0; printf ("<td><a href=bbsbkncon?B=%d&bkn=%s&file=%s&num=%d>%s%s </a>%s", getbnumx(x1), bkn, fh2fname(&x), start + i - 1, strncmp(x.title, "Re: ", 4) ? "○ " : "", void1(titlestr(x.title)), size_str(eff_size(filename))); printf("<td><font color=%s>%d</font>\n", x.staravg50 ? "red" : "black", x.staravg50 / 50); printf("<td><font color=%s>%d人</font>\n", x.hasvoted ? "red" : "black", x.hasvoted); } printf("</table>"); printhr(); fclose(fp); } sprintf(genbuf, "bbsbkndoc?B=%d&bkn=%s", getbnumx(x1), bkn); bbsdoc_helper(genbuf, start, total, w_info->t_lines); printf("<table><tr><td><form name=form1 action=bbsbkndoc>\n"); printf("<input type=hidden name=B value=%d>", getbnumx(x1)); printf("<input type=hidden name=bkn value=%s>", bkn); printf ("<input type=submit value=跳转到> 第 <input type=text name=start size=4> 篇"); printf("</form>\n"); printf("</td><td><form name=form2 action=bbsdoc>\n"); printf ("<input type=submit value=跳转到><input type=text name=board size=5> 讨论区"); printf("</form></td></tr></table>\n"); showfile(MY_BBS_HOME "/wwwtmp/googleanalytics"); printf("</body>"); http_quit(); } return 0; }
int bbstopic_act(char * info) { char board[80], topic[256], curr[256]; int boardmode, start; int total, cnt, i, tmp, ismail, slen; struct fileheader fh[WMLP_TPOST_PER_PAGE], fhs[WMLP_TPOST_PER_PAGE], fh1[WMLP_TPOST_PER_PAGE]; struct shortfile * b; char buf[256], buf2[256]; char * ptr; FILE * fp; if (loginok) { wmlmode (u_info, READING); } strncpy (board, getparm("board"), 79); strncpy (topic, getparm("topic"), 255); strncpy (curr, getparm("curr"), 255); boardmode = atoi(getparm ("mode")); start = atoi(getparm("start")); ismail = !strcmp(board, WML_VB_MAIL); boardModeDir(board, boardmode, buf, buf2); b = getbcache(board); if (!*topic) { strcpy (info, "缺少主题。"); return -1; } if (!loginok || (!ismail && (!has_read_perm(¤tuser, board) ))) { strcpy (info, "权限不够。"); return -2; } fp = fopen (buf, "rb"); if (!fp) { sprintf (info, "无法打开索引。"); return -1; } printf ("<card title=\"主题树 -- %s\">", BBSNAME); if (ismail) { printf ("<p><anchor><go href=\"bbsdoc.wml?board=%s\" />信箱</anchor></p>", WML_VB_MAIL); } else { printf ("<p>板面:<anchor><go href=\"bbsdoc.wml?board=%s&mode=%d\" />%s/%s</anchor></p>", b->filename, boardmode, b->title + 11, b->filename); } w_hsprintf (buf, "%s", topic); printf ("<p>主题:%s</p>", buf); cnt = 0; slen = 0; start --; memset (fhs, 0, sizeof(fhs)); while (tmp = fread(fh, sizeof(struct fileheader), WMLP_TPOST_PER_PAGE, fp)) { for (i = 0; i < tmp; i++) { ptr = (fh + i)->title; if (!strncasecmp(ptr, "Re: ", 3)) { ptr += 4; } if (!strncmp(topic, ptr, 56)) { cnt++; if (start < 0 || start / WMLP_TPOST_PER_PAGE <= cnt / WMLP_TPOST_PER_PAGE) { *(fhs + slen) = *(fh + i); slen = slen % WMLP_TPOST_PER_PAGE + 1; //循环使用好吧。 } if (curr && !strcmp((fh + i)->filename, curr)) { start = (cnt - 1) / WMLP_TPOST_PER_PAGE * WMLP_TPOST_PER_PAGE; } if (cnt == WMLP_TPOST_PER_PAGE) { memcpy (fh1, fhs, sizeof(fh1)); } } } } if (start < 0) { if (cnt > WMLP_TPOST_PER_PAGE) { memcpy (fhs, fh1, sizeof(fh1)); slen = WMLP_TPOST_PER_PAGE; } start = 0; } printf ("<p>同主题%d篇,以下显示%d至%d。</p>", cnt, start + 1, start + slen); for (i = 0; i < slen; i++) { ptr = ismail ? (((fhs + i)->accessed[0] & FILE_READ) ? "" : "N") : flag_str2 ((fhs + i)->accessed[0], brc_has_read((fhs + i)->filename)); printf ("<p>%s %s ", strncasecmp((fhs + i)->title, "Re: ", 3) ? "T" : "R", ptr); strncpy (buf, (fhs + i)->owner, IDLEN + 1); for (ptr = buf; *ptr; ptr++) { if (!(isalnum(*ptr))) { *ptr = 0; break; } } printf ("<anchor><go href=\"bbsqry.wml?userid=%s\" />%s</anchor> ", buf, buf); printf ("<anchor><go href=\"bbscon.wml?board=%s&mode=%d&file=%s\" />", board, boardmode, (fhs + i)->filename); datetime (buf, atoi((fhs + i)->filename + 2)); w_hprintf ("%s", buf); printf ("</anchor></p>"); } if (cnt > WMLP_TPOST_PER_PAGE) { printf ("<p>"); strcpy (buf, urlencode2(topic)); for (i = 0; i <= cnt / WMLP_TPOST_PER_PAGE; i++) { if (i == 0 || i == cnt / WMLP_TPOST_PER_PAGE || abs(i - (start / WMLP_TPOST_PER_PAGE)) < 3) { if (i == start / WMLP_TPOST_PER_PAGE) { printf ("%d ", i + 1); } else { printf ("<anchor><go href=\"bbstopic.wml?board=%s&mode=%d&topic=%s&start=%d\" />%d</anchor> ", board, boardmode, buf, (i * WMLP_TPOST_PER_PAGE) + 1, i + 1); } } } printf ("</p>"); } return 0; }