diff options
author | in2 <in2@63ad8ddf-47c3-0310-b6dd-a9e9d9715204> | 2002-10-06 00:08:53 +0800 |
---|---|---|
committer | in2 <in2@63ad8ddf-47c3-0310-b6dd-a9e9d9715204> | 2002-10-06 00:08:53 +0800 |
commit | 01d6e6494cec862c90d42e7c74c8e00dc31939ab (patch) | |
tree | 71e90150be1c0f0ae66ba71a0e91ff194d9b7260 /web/parse_html.c | |
parent | 5dee79db0de04ee9601edbed8369145c049662fa (diff) | |
download | pttbbs-01d6e6494cec862c90d42e7c74c8e00dc31939ab.tar pttbbs-01d6e6494cec862c90d42e7c74c8e00dc31939ab.tar.gz pttbbs-01d6e6494cec862c90d42e7c74c8e00dc31939ab.tar.bz2 pttbbs-01d6e6494cec862c90d42e7c74c8e00dc31939ab.tar.lz pttbbs-01d6e6494cec862c90d42e7c74c8e00dc31939ab.tar.xz pttbbs-01d6e6494cec862c90d42e7c74c8e00dc31939ab.tar.zst pttbbs-01d6e6494cec862c90d42e7c74c8e00dc31939ab.zip |
first commit
git-svn-id: http://opensvn.csie.org/pttbbs/pttbbs/trunk/pttbbs@536 63ad8ddf-47c3-0310-b6dd-a9e9d9715204
Diffstat (limited to 'web/parse_html.c')
-rwxr-xr-x | web/parse_html.c | 294 |
1 files changed, 294 insertions, 0 deletions
diff --git a/web/parse_html.c b/web/parse_html.c new file mode 100755 index 00000000..402412de --- /dev/null +++ b/web/parse_html.c @@ -0,0 +1,294 @@ +#include "mod_ptt.h" +#include <time.h> +#include <math.h> +#define KUSERINFO "$userinfo$" +#define KUSERID "$userid$" +#define KUSERNAME "$username$" +#define KUSERMONEY "$usermoney$" +#define KTIMEYEAR "$timeyear$" +#define KTIMEMONTH "$timemonth$" +#define KTIMEMDAY "$timemday$" +#define KTIMEWEEK "$timeweek$" +#define KSERVERTIME "$servertime$" +#define KTIMEHOUR "$hour$" +#define KTIMEMINUTE "$minute$" +#define KTIMESECOND "$second$" +#define KMSGONLOAD "$MSGonLoad$" +#define KFCSONLOAD "$FCSonLoad$" +#define KHTMLTITLE "$HTMLtitle$" +#define KSCROLLTITLE "$SCROLLtitle$" +#define KBGCOLOR "$BGCOLOR$" +#define KBGSOUND "$BGSOUND$" +#define KINCHTML "$file:" + + + +char * +ap_parseline(request_rec *r, const char *str, char *str_substiute[]) { + int i, off=0; + char *strbuf, *po; + pool *p = r->pool; + strbuf = pstrdup(p, str); + + if(str_substiute == NULL) return strbuf; + for(i=0; str_substiute[i]!=NULL; i+=2) + { + off = 0; + while(po = strstr(strbuf + off, str_substiute[i])) + { + *po = 0; + strbuf = pstrcat(p, strbuf, str_substiute[i+1] !=NULL + ? str_substiute[i+1] : "", po+strlen(str_substiute[i]), NULL); + off += str_substiute[i+1] ? strlen(str_substiute[i+1]) : 0; + } + } + return strbuf; +} + +char * +ap_standard_parseline(request_rec *r, char *str) +{ + time_t now = time(NULL); + pool *p = r->pool; + char *str_substiute[]= // 關鍵字的代換表 + { + KUSERID, "ptt", + KUSERNAME, "name", +/* + KTIMEYEAR, whatyear(p,&now), + KTIMEMONTH,whatmonth(p,&now), + KTIMEMDAY, whatday(p,&now), + KTIMEWEEK, whatweek(p,&now), + KSERVERTIME, whattime(p,&now), + KTIMEHOUR, whathour(p,&now), + KTIMEMINUTE, whatminute(p,&now), + KTIMESECOND, whatsecond(p,&now), +*/ + KUSERINFO, NULL, + KUSERMONEY, "100", + NULL,NULL + }; + return ap_parseline(r, str, str_substiute); +} + +int +ap_showfile(request_rec *r, char *filename, char *table[], char *t2[], FILE *fo) +{ + pool *p = r->pool; + FILE *fp = pfopen(p, filename, "r"); + char *str, *incfile, buf[512]; + + if (!fp) { +#if DEBUG + rputs(filename, r); +#endif + return -1; + } + + while (fgets(buf, 512, fp)) + { + + str = ap_standard_parseline(r, + ap_parseline(r, + ap_parseline(r, buf, table), + t2)); + + if ((incfile = strstr(str, KINCHTML)) != NULL) { + incfile += strlen(KINCHTML); + incfile = strtok(incfile, "$"); +#if 0 + if (*incfile != '/') + incfile = ap_pstrcat(p, TEMPLATEDIR "/", incfile, NULL); +#endif + ap_showfile(r, incfile, table, t2, fo); + } else if(fo) fputs(str, fo); + else rputs(str, r); + } + + pfclose(p, fp); + return 0; +} + +char * +add_href(pool *p, char *l) +{ + char *href[] = {"http://", "ftp://", "gopher://", "file://", + "telnet://", "mailto:", NULL}, + *end, url[PATHLEN], *tl, *po; + int i, urllen, off; + + tl = pstrdup(p, l); + + for(i=0; href[i]!=NULL; i++) + { + off = 0; + //Ptt: while 應該用 while 但 while 有bug + if((po = strstr(tl + off, href[i]))) + { + for(end = po; (*end>='&' && *end<='z')||*end=='~' ; end++); + urllen = end - po; + + if(urllen > PATHLEN) + { + off += PATHLEN; continue; + } + + strncpy(url, po, urllen); + *po= 0; + url[urllen] = 0; + tl = psprintf(p, "%s<a href=\"%s\" target=\"%s\">%s</a>%s", tl, + url, "new", url, end); + off += 2 * urllen + 15; + } + } + + return tl; +} + +/* + format: + char *name, void *ptr, size_t length + char *name, int *ptr, -1 + char *name, char **ptr, 0 +*/ +int +GetQueryDatas(request_rec *r, int **table) +{ + int rc, i, match=0, dlen, maxlen; + char *name, *value, *str; + pool *p = r->pool; + + for(i=1; table[i]!=NULL; i+=3) + { + if((int) table[i+1]) *table[i]=0; + else (char *) (*table[i]) = pstrdup(p, ""); + } + do + { + if((rc = unescape(r, &name, &value))<0) break; + for(i=0; table[i]; i+=3) + { + if(!strcmp((char *)table[i], name)) break; + +#if 0 +/* SiE990313 test: 抓 未定義的變數 */ + if(!strcmp((char *)table[i], "$SPARE$")) + { + (char *) (*table[i + 1]) = pstrdup(p, name); + continue; + } +#endif + } + if(table[i] && table[i+1]) + { + if((maxlen = (int) table[i+2]) > 0) + { + if(!*value) continue; + dlen = strlen((char *)table[i+1]); + str = ap_escape_html(p, value); + if(maxlen > dlen) + strexam( + strncat((char *)table[i+1],str,maxlen-dlen) + ); + } + else if((int) table[i+2] == 0) // for file upload + { +// str = ap_escape_html(p, value); + //if(value) + (*table[i+1]) = (int) value; +// else (*table[i+1]) = (int) pstrdup(p,""); + } + else + { + if(!*value) continue; + *(table[i+1]) += atoi(value); + } + match++; + } + } while(rc>0); + return match; +} + + +int +ap_url_redirect(request_rec *r, char *url) +{ + r->status = REDIRECT; + + ap_table_setn(r->headers_out, "Location", pstrdup(r->pool, url)); + return MOVED; + //return REDIRECT, MOVED 或 HTTP_SEE_OTHER 都可 +} + +char * +pint2str(pool* p, int c) +{ + return ap_psprintf(p,"%d",c); +} + +char* +preplace(request_rec *r, char* src, char* sig, char* rep) +{ + char *ptr; + int siglen=strlen(sig), off=0; + + while((ptr = strstr(src+off,sig))) + { + *ptr = 0; + src = pstrcat(r->pool, src, rep, NULL); + off = strlen(src); + src = pstrcat(r->pool, src, ptr+siglen, NULL); + } + return src; +} + +int +hex2dig(char *str) +{ + int base,ret=0,i,len=strlen(str); + + for(i=0; i<len; i++) + { + if(str[i]>='a' && str[i]<='f') base = str[i]-'a'+10; + else if(str[i]>='A' && str[i]<='F') base = str[i]-'A'+10; + else if(str[i]>='0' && str[i]<='9') base = str[i]-'0'; + else return -1; + + ret += base*pow(16,len-i-1); + } + return ret; +} + +char * +pstrncpy(pool* p, char tmp[], int n) +{ + char *ptr; + ptr=pstrdup(p,tmp); + *(ptr+n)=0; + return psprintf(p,"%s",ptr); +} + +char * +GetPathToken(request_rec *r, int count) +{ + char *str, *token, *sepr = "/\\?&"; + int i; + str = pstrdup(r->pool, r->path_info + 1); + token = strtok(str, sepr); + for( i = 1 ; i < count; i++) + { + token = strtok(NULL, sepr); + if(!token) return "-1"; /* Heat:count超過也要考慮 */ + } + return token; +} + + +/* + 個人信件夾檔保管方式: + + mail/@/rec/FF/F/UUDDTT + mail/@/dat/FF/F/UUDDTT + +*/ + |