bbslib.c
来自「linux/unix环境下的建站系统」· C语言 代码 · 共 1,534 行 · 第 1/4 页
C
1,534 行
long attachPos[MAXATTACHMENTCOUNT]; long attachLen[MAXATTACHMENTCOUNT]; char* attachFileName[MAXATTACHMENTCOUNT]; enum ATTACHMENTTYPE attachType[MAXATTACHMENTCOUNT]; int attachShowed[MAXATTACHMENTCOUNT]; char outbuf[512]; int outbuf_len; size_t article_len = buflen; /* hardcode everything for supporting [upload=%d][/upload], hehe. - atppp */ char *UBBUpload1 = "upload="; int UBBUpload1_len = 7; char *UBBUpload2 = "][/upload]"; int UBBUpload2_len = 10; if (buf == NULL) return; STATE_ZERO(ansi_state); bzero(ansi_val, sizeof(ansi_val)); bzero(attachShowed, sizeof(attachShowed)); attachmatched = 0; if (attachlink != NULL) { long attach_len; char *attachptr, *attachfilename; if (preview_attach_dir) { char filepath[MAXPATH]; char inputbuf[256]; FILE *fp2; snprintf(filepath, MAXPATH, "%s/.index", preview_attach_dir); if ((fp2 = fopen(filepath, "r")) != NULL) { while (!feof(fp2)) { char *name; char *ptr; struct stat st; if (attachmatched >= MAXATTACHMENTCOUNT) break; fgets(inputbuf, 256, fp2); name = strchr(inputbuf, ' '); if (name == NULL) continue; *name = 0; name++; ptr = strchr(name, '\n'); if (ptr) *ptr = 0; attachPos[attachmatched] = attachmatched+1; if (stat(inputbuf, &st) < 0) attachLen[attachmatched] = 0; else attachLen[attachmatched] = st.st_size; attachFileName[attachmatched] = (char*)malloc(256); strncpy(attachFileName[attachmatched], name, 255); attachFileName[attachmatched][255] = '\0'; attachType[attachmatched] = get_attachment_type(name); attachmatched++; } fclose(fp2); } } else { for (i = 0; i < buflen ; i++ ) { if (attachmatched >= MAXATTACHMENTCOUNT) break; if (((attachfilename = checkattach(buf + i, buflen - i, &attach_len, &attachptr)) != NULL)) { i += (attachptr-buf-i) + attach_len - 1; if (i > buflen) continue; attachPos[attachmatched] = attachfilename - buf; attachLen[attachmatched] = attach_len; attachFileName[attachmatched] = (char*)malloc(256); strncpy(attachFileName[attachmatched], attachfilename, 255); attachFileName[attachmatched][255] = '\0'; attachType[attachmatched] = get_attachment_type(attachfilename); attachmatched++; } } if (attachmatched > 0) article_len = attachPos[0] - ATTACHMENT_SIZE; } } for (i = 0; i < article_len; i++) { if (STATE_ISSET(ansi_state, STATE_NEW_LINE)) { STATE_CLR(ansi_state, STATE_NEW_LINE); if (i < (buflen - 1) && !STATE_ISSET(ansi_state,STATE_TEX_SET) && (buf[i] == ':' && buf[i + 1] == ' ')) { STATE_SET(ansi_state, STATE_QUOTE_LINE); if (STATE_ISSET(ansi_state, STATE_FONT_SET)) BUFFERED_OUTPUT(output, "</font>", 7); /* * set quoted line styles */ STYLE_SET(font_style, FONT_STYLE_QUOTE); STYLE_SET_FG(font_style, FONT_COLOR_QUOTE); STYLE_CLR_BG(font_style); print_font_style(font_style, output); BUFFERED_OUTPUT(output, &buf[i], 1); STATE_SET(ansi_state, STATE_FONT_SET); STATE_CLR(ansi_state, STATE_ESC_SET); /* * clear ansi_val[] array */ bzero(ansi_val, sizeof(ansi_val)); ival = 0; continue; } else STATE_CLR(ansi_state, STATE_QUOTE_LINE); } if (is_tex) { if ((buf[i] == '$') && ((i==0) || (buf[i-1] != '\\'))) { if (STATE_ISSET(ansi_state, STATE_TEX_SET)) { STATE_CLR(ansi_state, STATE_TEX_SET); } else { if (STATE_ISSET(ansi_state, STATE_QUOTE_LINE)) { BUFFERED_OUTPUT(output, "</font>", 7); STYLE_CLR(font_style, FONT_STYLE_QUOTE); STATE_CLR(ansi_state, STATE_QUOTE_LINE); STATE_CLR(ansi_state, STATE_FONT_SET); } else if (STATE_ISSET(ansi_state, STATE_FONT_SET)) { BUFFERED_OUTPUT(output, "</font>", 7); STATE_CLR(ansi_state, STATE_FONT_SET); } STATE_SET(ansi_state, STATE_TEX_SET); } } } /* * is_tex 情况下,\[upload 优先匹配 \[ 而不是 [upload * is_tex 情况下应该还有一个问题是 *[\[ 等,不过暂时不管了 - atppp */ if (i < (buflen - 1) && is_tex && !STATE_ISSET(ansi_state,STATE_ESC_SET) && (buf[i] == '\\' && buf[i + 1] == '[')) { if (STATE_ISSET(ansi_state, STATE_QUOTE_LINE)) { BUFFERED_OUTPUT(output, "</font>", 7); STYLE_CLR(font_style, FONT_STYLE_QUOTE); STATE_CLR(ansi_state, STATE_QUOTE_LINE); STATE_CLR(ansi_state, STATE_FONT_SET); } else if (STATE_ISSET(ansi_state, STATE_FONT_SET)) { BUFFERED_OUTPUT(output, "</font>", 7); STATE_CLR(ansi_state, STATE_FONT_SET); } STATE_SET(ansi_state, STATE_TEX_SET); } if (buf[i] == '[' && !STATE_ISSET(ansi_state, STATE_ESC_SET)) { if (is_tex && (i > 0) && (buf[i-1] == '\\')) { } else if (attachmatched > 0) { /* * determine if this is correct attachment [upload], if correct, output html, and skip i to the end of [/upload] * otherwise, do nothing and keep i unchanged */ int num = 0; int k; char *buf_p; char *end_buf_p; char *UBB_p; buf_p = &buf[i]; end_buf_p = &buf[buflen]; buf_p++; if (buf_p + UBBUpload1_len - 1 >= end_buf_p) { goto atppp_never_use_goto; } for (UBB_p = UBBUpload1, k = 0; k < UBBUpload1_len; k++, UBB_p++, buf_p++) { if (*UBB_p != *buf_p) { goto atppp_never_use_goto; } } while(buf_p < end_buf_p) { if ((*buf_p >= '0') && (*buf_p <= '9')) { num = num * 10 + (*buf_p - '0'); } else { break; } buf_p++; } if (buf_p + UBBUpload2_len - 1 >= end_buf_p) { goto atppp_never_use_goto; } for (UBB_p = UBBUpload2, k = 0; k < UBBUpload2_len; k++, UBB_p++, buf_p++) { if (*UBB_p != *buf_p) { goto atppp_never_use_goto; } } if ((num > 0) && (num <= attachmatched)) { switch(attachType[num-1]) { case ATTACH_IMG: snprintf(outbuf, 511, "<a href=\"%s&ap=%ld\" target=\"_blank\"><img src=\"%s&ap=%ld\" border=\"0\" title=\"按此在新窗口浏览图片\" onload=\"javascript:resizeImg(this)\" /></a> ", attachlink, attachPos[num-1],attachlink, attachPos[num-1]); break; case ATTACH_FLASH: snprintf(outbuf, 511, "<object classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" codebase=\"http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0\" > <param name=\"MOVIE\" value=\"%s&ap=%ld\" />" "<embed src=\"%s&ap=%ld\"></embed></object>", attachlink, attachPos[num-1], attachlink, attachPos[num-1]); break; case ATTACH_OTHERS: snprintf(outbuf, 511, "<br />附件: <a href=\"%s&ap=%ld\">%s</a> (%ld 字节)<br />", attachlink, attachPos[num-1], attachFileName[num-1], attachLen[num-1]); break; } outbuf_len = strlen(outbuf); BUFFERED_OUTPUT(output, outbuf, outbuf_len); attachShowed[num-1]=1; i = buf_p - buf - 1; continue; }atppp_never_use_goto: ; } } else if (is_tex && (buf[i] == ']') && (i > 0) && (buf[i-1] == '\\')) { STATE_CLR(ansi_state, STATE_TEX_SET); } if (i < (buflen - 1) && !STATE_ISSET(ansi_state,STATE_TEX_SET) && (buf[i] == 0x1b && buf[i + 1] == '[')) { if (STATE_ISSET(ansi_state, STATE_ESC_SET)) { /* *[*[ or *[13;24*[ */ size_t len; ansi_end = &buf[i - 1]; len = ansi_end - ansi_begin + 1; print_raw_ansi(ansi_begin, len, output); } STATE_SET(ansi_state, STATE_ESC_SET); ansi_begin = &buf[i]; i++; /* skip the next '[' character */ } else if (buf[i] == '\n') { if (STATE_ISSET(ansi_state, STATE_ESC_SET)) { /* *[\n or *[13;24\n */ size_t len; ansi_end = &buf[i - 1]; len = ansi_end - ansi_begin + 1; print_raw_ansi(ansi_begin, len, output); STATE_CLR(ansi_state, STATE_ESC_SET); } if (STATE_ISSET(ansi_state, STATE_QUOTE_LINE)) { /* * end of a quoted line */ BUFFERED_OUTPUT(output, "</font>", 7); STYLE_CLR(font_style, FONT_STYLE_QUOTE); STATE_CLR(ansi_state, STATE_FONT_SET); } if (!STATE_ISSET(ansi_state,STATE_TEX_SET)) { BUFFERED_OUTPUT(output, " <br /> ", 8); } STATE_CLR(ansi_state, STATE_QUOTE_LINE); STATE_SET(ansi_state, STATE_NEW_LINE); } else { if (STATE_ISSET(ansi_state, STATE_ESC_SET)) { if (buf[i] == 'm') { /* *[0;1;4;31m */ if (STATE_ISSET(ansi_state, STATE_FONT_SET)) { BUFFERED_OUTPUT(output, "</font>", 7); STATE_CLR(ansi_state, STATE_FONT_SET); } if (i < buflen - 1) { generate_font_style(&font_style, ansi_val, ival + 1); if (STATE_ISSET(ansi_state, STATE_QUOTE_LINE)) STYLE_SET(font_style, FONT_STYLE_QUOTE); print_font_style(font_style, output); STATE_SET(ansi_state, STATE_FONT_SET); STATE_CLR(ansi_state, STATE_ESC_SET); /* * STYLE_ZERO(font_style); */ /* * clear ansi_val[] array */ bzero(ansi_val, sizeof(ansi_val)); ival = 0; } } else if (isalpha(buf[i])) { /* *[23;32H */ /* * ignore it */ STATE_CLR(ansi_state, STATE_ESC_SET); STYLE_ZERO(font_style); /* * clear ansi_val[] array */ bzero(ansi_val, sizeof(ansi_val)); ival = 0; continue; } else if (buf[i] == ';') { if (ival < sizeof(ansi_val) - 1) { ival++; /* go to next ansi_val[] element */ ansi_val[ival] = 0; } } else if (buf[i] >= '0' && buf[i] <= '9') { ansi_val[ival] *= 10; ansi_val[ival] += (buf[i] - '0'); } else { /* *[1;32/XXXX or *[* or *[[ */ /* * not a valid ANSI string, just output it */ size_t len; ansi_end = &buf[i]; len = ansi_end - ansi_begin + 1; print_raw_ansi(ansi_begin, len, output); STATE_CLR(ansi_state, STATE_ESC_SET); /* * clear ansi_val[] array */ bzero(ansi_val, sizeof(ansi_val)); ival = 0; } } else print_raw_ansi(&buf[i], 1, output); } } if (STATE_ISSET(ansi_state, STATE_FONT_SET)) { BUFFERED_OUTPUT(output, "</font>", 7); STATE_CLR(ansi_state, STATE_FONT_SET); } for ( i = 0; i<attachmatched ; i++ ){ if (!attachShowed[i]) { switch(attachType[i]) { case ATTACH_IMG: snprintf(outbuf, 511, "<br /><img src=\"images/img.gif\" border=\"0\" />此主题相关图片如下:%s (%ld 字节)<br /><a href=\"%s&ap=%ld\" target=\"_blank\"><img src=\"%s&ap=%ld\" border=\"0\" title=\"按此在新窗口浏览图片\" onload=\"javascript:resizeImg(this)\" /></a> ",attachFileName[i], attachLen[i], attachlink, attachPos[i],attachlink, attachPos[i]); break; case ATTACH_FLASH: snprintf(outbuf, 511, "<br />Flash动画: " "<a href=\"%s&ap=%ld\">%s</a> (%ld 字节)<br />" "<object classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" codebase=\"http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0\" > <param name=\"MOVIE\" value=\"%s&ap=%ld\" />" "<embed src=\"%s&ap=%ld\"></embed></object><br />", attachlink, attachPos[i], attachFileName[i], attachLen[i], attachlink, attachPos[i], attachlink, attachPos[i]); break; case ATTACH_OTHERS: snprintf(outbuf, 511, "<br />附件: <a href=\"%s&ap=%ld\">%s</a> (%ld 字节)<br />", attachlink, attachPos[i], attachFileName[i], attachLen[i]); break; } outbuf_len = strlen(outbuf); BUFFERED_OUTPUT(output, outbuf, outbuf_len); attachShowed[i]=1; } free(attachFileName[i]); } BUFFERED_FLUSH(output);}/* ent 是 1-based 的*/int del_post(int ent, struct fileheader *fileinfo, const struct boardheader *bh){ struct write_dir_arg delarg; int ret; char direct[PATHLEN]; ret = deny_del_article(bh, fileinfo, getSession()); switch(ret) { case -3: return 4; break; case -6: return 1; break; default: if (ret) return 1; break; } init_write_dir_arg(&delarg); setbdir(DIR_MODE_NORMAL, direct, bh->filename); delarg.filename=direct; delarg.ent=ent; ret=do_del_post(getCurrentUser(),&delarg,fileinfo,bh->filename,DIR_MODE_NORMAL,0,getSession()); free_write_dir_arg(&delarg); if (ret != 0) return 3; return 0;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?