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&amp;ap=%ld\" target=\"_blank\"><img src=\"%s&amp;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&amp;ap=%ld\" />" "<embed src=\"%s&amp;ap=%ld\"></embed></object>", attachlink, attachPos[num-1], attachlink, attachPos[num-1]);                        break;                    case ATTACH_OTHERS:                         snprintf(outbuf, 511, "<br />附件: <a href=\"%s&amp;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&amp;ap=%ld\" target=\"_blank\"><img src=\"%s&amp;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&amp;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&amp;ap=%ld\" />" "<embed src=\"%s&amp;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&amp;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 + -
显示快捷键?