#include #include #include #include #include #include #include #include #include "read2ch.h" #define CGINAME "read.cgi" #define CGIVER "read.cgi ver11 (2001/8/26)" #define RES_YELLOW 900 #define RES_REDZONE 950 #define RES_RED 1000 #define RES_IMODE 10 #define RES_NORMAL 100 #define MAX_FILESIZE (8192 * 64) #define SIZE_BUF 0xa000 #define LIMIT_PM 23 #define LIMIT_AM 3 char *zz_remote_addr; char *zz_remote_host; char *zz_http_referer; char *zz_http_cookie; char *zz_query_string; char *zz_temp; char *zz_http_user_agent; char *zz_http_language; #ifdef GZIP char *zz_http_encoding; int gzip_flag; #endif #ifdef LASTMOD char *zz_http_if_modified_since; time_t zz_fileLastmod; char lastmod_str[1024]; #endif char zz_bs[1024]; char zz_ky[1024]; char zz_ls[1024]; char zz_st[1024]; char zz_to[1024]; char zz_nf[1024]; char zz_im[1024]; int nn_st, nn_to, nn_ls; char *BigBuffer = NULL; char *BigLine[RES_RED + 16]; char *KARA = ""; int zz_fileSize = 0; int lineMax = -1; int out_resN = 0; time_t t_now; struct tm *tm_now; long currentTime; char *LastChar(char *src, char *c); char *findSplitter(char *stt, int sp); char *zz_GetString(char *dst, char *tgt); char *doReplace(char *des, char *str0, char *str1); /****************************************************************/ /* BadAccess */ /****************************************************************/ int BadAccess() { if (strstr(zz_http_user_agent, "DreamPassport")) return 0; if (strstr(zz_http_user_agent, "DoCoMo")) return 0; if (strstr(zz_http_user_agent, "J-PHONE")) return 0; if (strstr(zz_http_user_agent, "ASTEL")) return 0; if (strstr(zz_http_user_agent, "[ja]")) return 0; if (strstr(zz_http_user_agent, "iCab")) return 0; /* MAC */ if (strstr(zz_http_user_agent, "iBOX")) return 0; /* MAC */ if (strstr(zz_http_user_agent, "WannaBe")) return 0; /* MAC */ if (strstr(zz_http_user_agent, "Macintosh; I;")) return 0; /* MAC */ if (strstr(zz_http_user_agent, "Mozilla/3.0N")) return 0; /* small? */ if (strstr(zz_http_user_agent, "CBBoard")) return 0; /* small? */ if (strstr(zz_http_user_agent, "PersonaWare")) return 0; /* small? */ if (strstr(zz_http_user_agent, "Sharp")) return 0; /* small? */ if (strstr(zz_http_user_agent, "95")) return 0; /* win95 */ if (strstr(zz_http_user_agent, "NT 4.0")) return 0; /* winNT */ if (strstr(zz_http_user_agent, "WinNT")) return 0; /* winNT */ if (!*zz_http_user_agent && !*zz_http_language) return 1; /* if(!*zz_http_user_agent) return 1;*/ #ifdef Katjusha_Beta_kisei if (strstr(zz_http_user_agent, "Katjusha")) return 1; #endif if (strstr(zz_http_user_agent, "WebFetch")) return 1; if (strstr(zz_http_user_agent, "origin")) return 1; if (strstr(zz_http_user_agent, "Nozilla")) return 1; if (strstr(zz_http_user_agent, "WWWD")) return 1; /* if(!*zz_http_language) return 1;*/ return 0; } /****************************************************************/ /* Log Out */ /****************************************************************/ int logOut(char *txt) { FILE *fp; #ifdef DEBUG return 1; #endif if (!BadAccess()) return 1; #ifdef LOGLOGOUT /* if(strcmp(zz_bs,"ascii")) return 1; */ fp = fopen("./logout.txt", "a+"); if (fp == NULL) return; fprintf(fp, "%02d:%02d:%02d %8s:", tm_now->tm_hour, tm_now->tm_min, tm_now->tm_sec, zz_bs); fprintf(fp, "(%15s)", zz_remote_addr); fprintf(fp, "%s***%s\n", zz_http_language, zz_http_user_agent); /* fprintf(fp,"%s\n",zz_query_string) ; if(strstr(zz_http_user_agent,"compatible")) fprintf(fp,"%s\n",zz_http_language) ; else fprintf(fp,"%s***%s\n",zz_http_language,zz_http_user_agent) ; if(*zz_http_referer) fprintf(fp,"%s\n",zz_http_referer) ; else fprintf(fp,"%s***%s\n",zz_http_language,zz_http_user_agent) ; else fprintf(fp,"%s\n",zz_http_user_agent) ; */ fclose(fp); #endif html_error("なんか不調です。"); return 1; } /****************************************************************/ /* HTML BANNER */ /****************************************************************/ int html_bannerNew() { printf ("
\n"); /**/ printf ("\n"); printf ("\n"); printf ("\n"); printf ("\n"); printf ("\n"); printf ("\n"); printf("
 \n"); printf ("| おすすめ \n"); printf ("| 2chサーバ監視所 \n"); printf ("| BinboServer \n"); printf ("| Hikky.Zansu.com \n"); printf ("| 無料サービス \n"); printf("|
\n"); /**/ printf("
\n"); printf("
\n"); printf("さぶドメインシリーズ登場
\n"); printf ("   *****.syo-ten.com
\n"); printf ("   *****.gasuki.com
\n"); printf ("   *****.zansu.com
\n"); printf("おすきな名前を無料で使えます。早い者勝ち。
\n"); printf ("工夫しだいで、楽しさ100倍。\n"); printf("

"); printf("深夜でも快適なレンタルサーバサービス(n)"); printf("\n"); printf("
あの巨大なサイトも使っています。\n"); printf("

\n"); printf("

\n"); } #ifdef CM_BBSPINK /****************************************************************/ /* HTML BANNER */ /****************************************************************/ int html_banner() { printf("

\n"); printf ("おいでませアダルトサイト
\n"); printf ("
深夜でも快適なレンタルサーバサービス
\n"); printf("
\n"); printf("

\n"); } #else /****************************************************************/ /* HTML BANNER */ /****************************************************************/ int html_banner() { printf("

\n"); printf(""); printf("深夜でも快適なレンタルサーバサービス"); printf("\n"); printf("
あの巨大なサイトも使っています。\n"); printf("

\n"); } #endif /****************************************************************/ /* Get file size */ /****************************************************************/ int out_html1() { char *s[20]; char r0[SIZE_BUF], r1[SIZE_BUF], r2[SIZE_BUF], r3[SIZE_BUF], r4[SIZE_BUF]; char p[SIZE_BUF]; if (out_resN) return 0; strncpy(p, BigLine[0], 1024); p[1024 - 1] = '\0'; if (!*p) return 1; res_split(s, p); #ifdef TYPE_TERI /*someReplace(s[4],r4,"@`",",") ; */ html_head(s[4], lineMax); #else someReplace(s[4], r4, "@`", ","); html_head(r4, lineMax); #endif if (strcmp(zz_im, "true")) { /* no imode */ printf("

"); } out_resN++; return 0; } int out_html(int line, int lineNo) { char *s[20]; #ifdef TYPE_TERI char *r0, *r1, *r2, *r3, *r4; #else char r0[SIZE_BUF], r1[SIZE_BUF], r2[SIZE_BUF], r3[SIZE_BUF], r4[SIZE_BUF]; #endif char p[SIZE_BUF]; /*printf("line=%d[%s]

\n",line,BigLine[line]);return 0;*/ if (!out_resN) { /* Can I write header ? */ strncpy(p, BigLine[0], 1024); p[1024 - 1] = '\0'; if (!*p) return 1; res_split(s, p); #ifdef TYPE_TERI r4 = s[4]; #else someReplace(s[4], r4, "@`", ","); #endif html_head(r4, lineMax); if (strcmp(zz_im, "true")) { /* no imode */ printf("

"); } } out_resN++; strncpy(p, BigLine[line], 1024); p[1024 - 1] = '\0'; if (!*p) return 1; res_split(s, p); #ifdef TYPE_TERI r0 = s[0]; r1 = s[1]; r3 = s[3]; #else someReplace(s[0], r0, "@`", ","); someReplace(s[1], r1, "@`", ","); someReplace(s[3], r3, "@`", ","); someReplace(r3, r3, "&", "&"); #endif hlinkReplace(r3); if (strcmp(zz_im, "true")) { /* no imode */ if (*r3 && strlen(r3) < 8192) { printf("
"); printf("%d", lineNo); printf(" 名前:"); if (*r1) { printf("", r1); } else { printf(""); } printf("%s ", r0); if (*r1) { printf(""); } else { printf(""); } printf(" 投稿日:%s", s[2]); printf("
"); printf("%s", r3); printf("

"); } else { printf("
"); printf("%d", lineNo); printf(" 名前:"); printf("%s", ""); printf(""); printf(" 投稿日:[ここ壊れています]"); printf("
"); printf("[ここ壊れています]"); printf("

"); } if (IsBusy2ch() && out_resN > RES_NORMAL) { printf (" 次の %d レスを見る\n", CGINAME, zz_bs, zz_ky, lineNo, lineNo + RES_NORMAL, RES_NORMAL); printf (" 最新レス %d\n", CGINAME, zz_bs, zz_ky, RES_NORMAL, RES_NORMAL); printf (" (%02d:00PM - %02d:00AM の間一気に全部は読めません)
\n", LIMIT_PM - 12, LIMIT_AM); return 1; } } else { /* imode */ if (*r3) { printf("

[%d:", lineNo); if (*s[1]) { printf("", r1); } printf("%s ", r0); if (*s[1]) { printf(""); } printf("(%s)]", s[2]); printf("
%s

", r3); printf("
\n"); } else { printf("

[%d:", lineNo); printf("ここ壊れています]

"); printf("
\n"); } if (out_resN > RES_IMODE) { printf (" 次の %d レスを見る\n", CGINAME, zz_bs, zz_ky, lineNo, lineNo + RES_IMODE, RES_IMODE); printf (" 最新レス %d
\n", CGINAME, zz_bs, zz_ky, RES_IMODE, RES_IMODE); return 1; } } return 0; } /****************************************************************/ /* Get file size */ /****************************************************************/ int dat_out() { int line, lineNo; for (line = 0; line < lineMax; line++) { lineNo = line + 1; if (lineNo == 1) { if (!strcmp(zz_nf, "true")) continue; } else { if (nn_st && lineNo < nn_st) continue; if (nn_to && lineNo > nn_to) continue; if (nn_ls && line < lineMax - nn_ls) continue; } if (out_html(line, lineNo)) break; } out_html1(); html_foot(lineMax); return 0; } /****************************************************************/ /* Get file size */ /****************************************************************/ int dat_read() { int i; FILE *fp; char fname[1024]; sprintf(fname, "../%.256s/dat/%.256s.dat", zz_bs, zz_ky); //sprintf(fname,"../%s/dat/%s.dat",zz_bs,zz_ky) ; #ifdef DEBUG sprintf(fname, "998695422.dat"); #endif zz_fileSize = getFileSize(fname); if (zz_fileSize > MAX_FILESIZE) html_error("このスレッド大きすぎます。"); if (*zz_ky == '.') html_error("そんな板orスレッドないです。"); nn_st = atoi(zz_st); nn_to = atoi(zz_to); nn_ls = atoi(zz_ls); if (nn_st < 0) nn_st = 0; if (nn_to < 0) nn_to = 0; if (nn_st == 1 && nn_to == 1) strcpy(zz_nf, KARA); if (!strcmp(zz_im, "true")) { /* imode */ if (!nn_st && !nn_to && !nn_ls) nn_ls = RES_IMODE; } if (strcmp(zz_nf, "true")) nn_ls--; if (nn_ls < 0) nn_ls = 0; BigBuffer = malloc(zz_fileSize + 32); if (!BigBuffer) html_error("メモリの確保に失敗しました。"); fp = fopen(fname, "r"); if (!fp) { html_error("そんな板orスレッドないです。"); return 0; } fread(BigBuffer, zz_fileSize, 1, fp); fclose(fp); BigBuffer[zz_fileSize] = '\0'; for (i = 0; i < zz_fileSize; i++) { if (BigBuffer[i] == '\0') BigBuffer[i] = '*'; } lineMax = getLineMax(); /* html_error("調整中。。。") ; */ return 0; } /****************************************************************/ /* Get line number */ /****************************************************************/ int getLineMax() { int line = 0; char *p = BigBuffer; char *p1; char b[SIZE_BUF]; if (!p) return -8; while (p1 = strchr(p, '\n')) { BigLine[line] = p; *p1 = '\0'; p = p1; if (line > RES_RED) break; line++; p++; } return line; } /****************************************************************/ /* Get file size */ /****************************************************************/ int getFileSize(char *file) { struct stat CountStat; int ccc = 0; if (!stat(file, &CountStat)) ccc = (int) CountStat.st_size; return ccc; } /****************************************************************/ /* Get file last-modified */ /****************************************************************/ #ifdef LASTMOD time_t getFileLastmod(char *file) { struct stat CountStat; #ifdef FreeBSD struct timespec ccc; if (!stat(file, &CountStat)) ccc = CountStat.st_mtimespec; return ccc.tv_sec; #else time_t ccc; if (!stat(file, &CountStat)) ccc = CountStat.st_mtime; return ccc; #endif } int get_lastmod_str(time_t lastmod) { strftime(lastmod_str, 1024, "%a, %d %b %Y %H:%M:%S GMT", gmtime(&lastmod)); return (1); } #endif /****************************************************************/ /* GET Env */ /****************************************************************/ int zz_GetEnv(void) { currentTime = (long) time(&t_now); time(&t_now); t_now += 9 * 60 * 60; tm_now = gmtime(&t_now); zz_remote_addr = getenv("REMOTE_ADDR"); zz_remote_host = getenv("REMOTE_HOST"); zz_http_referer = getenv("HTTP_REFERER"); zz_http_cookie = getenv("HTTP_COOKIE"); zz_query_string = getenv("QUERY_STRING"); zz_temp = getenv("REMOTE_USER"); zz_http_user_agent = getenv("HTTP_USER_AGENT"); zz_http_language = getenv("HTTP_ACCEPT_LANGUAGE"); #ifdef GZIP zz_http_encoding = getenv("HTTP_ACCEPT_ENCODING"); #endif #ifdef LASTMOD zz_http_if_modified_since = getenv("HTTP_IF_MODIFIED_SINCE"); #endif if (!zz_remote_addr) zz_remote_addr = KARA; if (!zz_remote_host) zz_remote_host = KARA; if (!zz_http_referer) zz_http_referer = KARA; if (!zz_query_string) zz_query_string = KARA; if (!zz_temp) zz_temp = KARA; if (!zz_http_user_agent) zz_http_user_agent = KARA; if (!zz_http_language) zz_http_language = KARA; zz_GetString(zz_bs, "bbs"); zz_GetString(zz_ky, "key"); zz_GetString(zz_ls, "ls"); zz_GetString(zz_st, "st"); zz_GetString(zz_to, "to"); zz_GetString(zz_nf, "nofirst"); zz_GetString(zz_im, "imode"); } /****************************************************************/ /* MAIN */ /****************************************************************/ main() { #ifdef GZIP int pid; int pipefds[2]; int whitespace = 2048; #endif char fname[1024]; zz_GetEnv(); printf("Content-type: text/html\n"); #ifdef LASTMOD sprintf(fname, "../%.256s/dat/%.256s.dat", zz_bs, zz_ky); #ifdef DEBUG sprintf(fname, "998695422.dat"); #endif zz_fileLastmod = getFileLastmod(fname); get_lastmod_str(zz_fileLastmod); if (zz_http_if_modified_since && strstr(zz_http_if_modified_since, lastmod_str)) { printf("Status: 304\n"); printf("\n"); return (0); } #endif #ifdef GZIP if (zz_http_encoding && strstr(zz_http_encoding, "gzip")) { gzip_flag = 1; } else { gzip_flag = 0; } if (gzip_flag) { printf("Content-Encoding: gzip\n"); } #endif #ifdef DEBUG sprintf(fname, "998695422.dat"); #endif zz_fileSize = getFileSize(fname); // Get Last-Modified Date #ifdef LASTMOD printf("Last-Modified: %.256s\n", lastmod_str); #endif printf("\n"); #ifdef DEBUG sleep(1); #endif fflush(stdout); #ifdef GZIP if (gzip_flag) { pipe(pipefds); if ((pid = fork()) == 0) { //child dup2(pipefds[0], 0); close(pipefds[0]); close(pipefds[1]); execl("/bin/gzip", "gzip", "-cf", NULL); printf("Error can't exec\n"); exit(1); } //parent dup2(pipefds[1], 1); close(pipefds[0]); close(pipefds[1]); //put 2048byte fflush(stdout); while (whitespace--) putchar(' '); fflush(stdout); } #endif logOut(""); dat_read(); dat_out(); if (BigBuffer) free(BigBuffer); BigBuffer = NULL; #ifdef GZIP if (gzip_flag) { fflush(stdout); close(1); waitpid(pid, NULL, 0); } #endif } /****************************************************************/ /* ERROR END */ /****************************************************************/ int html_error(char *mes) { char zz_soko[256]; char tmp[256]; char doko[256]; struct stat CountStat; char comcom[256]; *tmp = '\0'; strcpy(tmp, LastChar(zz_ky, "/")); strncpy(zz_soko, tmp, 3); *comcom = '\0'; if (strstr(mes, "不調")) { sprintf(comcom, "お問い合わせ先"); } printf(""); printf (""); printf("%s", mes); printf("\n"); printf("\n"); /*printf("\n") ;*/ printf ("\n"); printf("

%s
\n", mes); printf("

"); printf ("
1 名前:%s投稿日:2001/04/12(木) 15:11
%s

%s
\n", CGIVER, mes, comcom); if (strstr(zz_http_user_agent, "Katjusha")) { printf ("
2 名前:%s投稿日:2001/04/12(木) 15:11
", CGIVER); /*printf("%s",zz_http_user_agent) ;*/ printf("
"); printf ("

"); printf("http://www.maido3.com/server/"); printf("
"); printf("さぶドメインシリーズ登場
"); printf ("   *****.syo-ten.com
"); printf ("   *****.gasuki.com
"); printf ("   *****.zansu.com
"); printf("おすきな名前を無料で使えます。早い者勝ち。
"); printf ("工夫しだいで、楽しさ100倍。"); printf ("

"); printf("深夜でも快適なレンタルサーバサービス"); printf(""); printf("
あの巨大なサイトも使っています。

"); printf(""); printf (""); printf (""); printf (""); printf (""); printf (""); printf("
 "); printf ("| おすすめ "); printf ("| 2chサーバ監視所 "); printf ("| BinboServer "); printf ("| Hikky.Zansu.com "); printf ("| 無料サービス "); printf("|
"); printf("

\n"); } printf("

\n"); printf("
\n"); printf("
\n"); html_bannerNew(); printf("
\n"); printf("

\n"); printf("%s

\n", CGIVER); if (strstr(mes, "そんな")) { sprintf(doko, "../%.50/kako/%.50/%.50.html", zz_bs, zz_soko, tmp); if (!stat(doko, &CountStat)) { printf ("隊長! 過去ログ倉庫で、スレッド %s.html を発見しました。\n", zz_bs, zz_soko, tmp, tmp); } else { sprintf(doko, "../%.50s/kako/%.50s/%.50s.dat", zz_bs, zz_soko, tmp); if (!stat(doko, &CountStat)) { printf ("隊長! 過去ログ倉庫で、スレッド %s.dat を発見しました。
、しかしまだ html化されていません。残念、待つしかない。\n", zz_bs, zz_soko, tmp, tmp); } else { printf ("過去ログ倉庫にもありませんでした。
問い合わせても見つかる可能\性はほとんどありません。\n", zz_bs); } } } printf("\n"); printf("\n"); if (BigBuffer) free(BigBuffer); BigBuffer = NULL; exit(0); } int html_error999(char *mes) { char zz_soko[256]; char tmp[256]; *tmp = '\0'; strcpy(tmp, LastChar(zz_ky, "/")); strncpy(zz_soko, tmp, 3); printf(""); printf (""); printf("ERROR"); printf("\n"); printf ("\n"); printf("\n"); printf ("
\n"); printf("えらー、%s

\n", mes); printf("bbs = [%s] \n", zz_bs); printf("key = [%s] \n", zz_ky); printf("ls = [%s] \n", zz_ls); printf("st = [%s] \n", zz_st); printf("to = [%s] \n", zz_to); printf("nofirst = [%s]
\n", zz_nf); printf("fileSize = [%d bytes] %dlines
\n", zz_fileSize, lineMax); printf("time=[%02d:%02d:%02d]
\n", tm_now->tm_hour, tm_now->tm_min, tm_now->tm_sec); printf ("
「えらー、そんな板orスレッドないです」の場合はここ倉庫へ Go
"); printf("過去ログ倉庫 %s.html\n", zz_bs, zz_soko, tmp, tmp); printf ("
まだ、dat -> html 変換が行われていない場合が良くあります。\n"); printf ("
ここで訴えると、過去ログ整理をしてくれる場合があるかもです。\n"); printf("

\n"); printf("


\n"); html_banner(); printf("


\n"); printf("%s\n", CGIVER); printf("\n"); printf("\n"); if (BigBuffer) free(BigBuffer); BigBuffer = NULL; exit(0); } /****************************************************************/ /* */ /****************************************************************/ char *zz_GetString(char *dst, char *tgt) { int i; int ch = (int) '&'; char *kk0; char *kk1; char *kk = zz_query_string; for (i = 0; i < 200; i++) { if (!strncmp(kk, tgt, strlen(tgt))) { kk0 = kk; kk1 = strchr(kk, ch); if (kk1) *kk1 = '\0'; strncpy(dst, kk0 + strlen(tgt) + 1, 1024); dst[1024 - 1] = '\0'; if (kk1) *kk1 = ch; return dst; } kk = strchr(kk, ch); if (!kk) break; kk++; } *dst = '\0'; return dst; } int whatKanji(unsigned char *str) { int val = 0; unsigned char b1, b2, b3; b1 = *str++; b2 = *str++; b3 = *str; if (b1 == 0x1b) { if (b2 == '$' && b3 == 'B') return 16; if (b2 == '$' && b3 == '@') return 32; if (b2 == '(' && b3 == 'J') return 64; if (b2 == '(' && b3 == 'B') return 128; return 0; } if (b1 >= 0xa0 && b1 <= 0xdf) val |= 1; if ((b1 >= 0x81 && b1 <= 0x9f || b1 >= 0xe0 && b1 <= 0xfc) && (b2 >= 0x40 && b2 <= 0xfc && b2 != 0x7f)) val |= 2; if (b1 == 0x8e && (b2 >= 0xa0 && b2 <= 0xdf)) val |= 4; if ((b1 >= 0xa1 && b1 <= 0xfe) && (b2 >= 0xa1 && b1 <= 0xfe)) val |= 8; return val; } #ifdef TYPE_TERI char *findSplitter(char *stt, int sp) { unsigned char *p = (unsigned char *) stt; char ss = (unsigned char) (sp & 0x00ff); while (*p) { /* if( *p >= 0xa0 && *p <= 0xdf) {p++ ;continue;} if((*p >= 0x81 && *p <= 0x9f || *p >= 0xe0 && *p <= 0xfc)) {p += 2 ;continue;} */ if (*p == ss && *(p + 1) == '>') return p; p++; } return NULL; } #else char *findSplitter(char *stt, int sp) { unsigned char *p = (unsigned char *) stt; char ss = (unsigned char) (sp & 0x00ff); while (*p) { if (*p >= 0xa0 && *p <= 0xdf) { p++; continue; } if ((*p >= 0x81 && *p <= 0x9f || *p >= 0xe0 && *p <= 0xfc)) { p += 2; continue; } /* if((*p >= 0x40 && *p <= 0xfc && *p != 0x7f)) p += 2 ;*/ if (*p == ss) return p; p++; } return NULL; } #endif int res_split(char **s, char *p) { int i; char *p0; for (i = 0; i < 5; i++) s[i] = KARA; s[0] = p; for (i = 1; i < 5; i++) { #ifdef TYPE_TERI p0 = findSplitter(s[i - 1], '<'); if (!p0) { return 0; } *p0 = '\0'; p0++; *p0 = '\0'; p0++; s[i] = p0; #else p0 = findSplitter(s[i - 1], ','); if (!p0) { return 0; } *p0 = '\0'; p0++; s[i] = p0; #endif } return 1; } int dump_out16(char *d) { unsigned char *p = (unsigned char *) d; printf("\n\n\n\n"); } int IsBusy2ch() { if (tm_now->tm_hour < LIMIT_AM || LIMIT_PM <= tm_now->tm_hour) return 1; return 0; } /****************************************************************/ /* えらー */ /****************************************************************/ char *LastChar(char *src, char *c) { char *p; if (!*src) return (src); p = strstr(src, c); if (!p) return (src); return LastChar(p + 1, c); /* return p+1 ; */ } /****************************************************************/ /* HTML HEADER */ /****************************************************************/ int html_head(char *title, int line) { printf(""); printf(""); printf (""); printf("%s ", title); if (strcmp(zz_im, "true")) { /* no imode */ printf(""); } printf(""); printf (""); if (strcmp(zz_im, "true")) { /* no imode */ printf("■掲示板に戻る■", zz_bs); printf(" レスを全部読む", CGINAME, zz_bs, zz_ky); printf(" 最新レス100", CGINAME, zz_bs, zz_ky); } else { printf("■掲示板に戻る■", zz_bs); printf (" レスを最初から読む", CGINAME, zz_bs, zz_ky, RES_IMODE); printf (" 最新レス%d", CGINAME, zz_bs, zz_ky, RES_IMODE, RES_IMODE); } if (line > RES_RED) { printf("

\n"); printf ("

レス数が %d を超えています。残念ながら全部は表\示しません。

\n", RES_RED, RES_RED); printf("
\n"); } else if (line > RES_REDZONE) { printf("

\n"); printf ("レス数が %d を超えています。%dを超えると表\示できなくなるよ。\n", RES_REDZONE, RES_RED); printf("
\n"); } else if (line > RES_YELLOW) { printf("

\n"); printf ("レス数が %d を超えています。%dを超えると表\示できなくなるよ。\n", RES_YELLOW, RES_RED); printf("
\n"); } printf("

%s ", title); } /****************************************************************/ /* HTML FOOTER */ /****************************************************************/ int html_foot(int line) { if (!strcmp(zz_im, "true")) return html_foot_im(); if (line <= RES_RED) { printf("

"); /**/ printf (" 名前: "); printf(""); printf("\n"); printf ("
"); printf("", zz_bs); printf("", zz_ky); printf("", currentTime); /**/ printf("
"); } /*html_banner() ;*/ printf("

%s\n", CGIVER); } /****************************************************************/ /* HTML FOOTER */ /****************************************************************/ int html_foot_im(void) { printf("

\n"); printf(" "); printf("NAME:"); printf("MAIL:"); printf("
"); printf("\n", currentTime); printf("\n", zz_bs); printf("\n", zz_ky); printf("\n"); printf("

\n"); /*html_banner() ;*/ printf("

%s\n", CGIVER); } /****************************************************************/ /* Replace */ /****************************************************************/ char *doReplace(char *des, char *str0, char *str1) { char *p, *ret = NULL; char t[SIZE_BUF]; strcpy(t, des); p = strstr(t, str0); if (!p) return ret; *p = '\0'; strcpy(des, t); strcat(des, str1); ret = des + strlen(des); strcat(des, p + strlen(str0)); return ret; } int someReplace(char *src, char *des, char *str0, char *str1) { char *last; strcpy(des, src); last = des; while (last) { last = doReplace(last, str0, str1); } return 1; } int hrefStop(char x) { if ('A' <= x && x <= 'Z') return 0; if ('a' <= x && x <= 'z') return 0; if ('0' <= x && x <= '9') return 0; if (x == '#') return 0; if (x == '/') return 0; if (x == '~') return 0; if (x == '_') return 0; if (x == '.') return 0; if (x == ',') return 0; if (x == '$') return 0; if (x == '%') return 0; if (x == '&') return 0; if (x == '@') return 0; if (x == '?') return 0; if (x == '=') return 0; if (x == '-') return 0; if (x == '+') return 0; if (x == '*') return 0; if (x == ';') return 0; if (x == ':') return 0; if (x == '!') return 0; if (x == '^') return 0; if (x == '`') return 0; if (x == '|') return 0; if (x == '[') return 0; if (x == ']') return 0; if (x == '{') return 0; if (x == '}') return 0; if (x == '\\') return 0; return 1; } int cutWordOff(char *src, char *word) { char *p = strstr(src, word); if (!p) return 0; *p = '\0'; return 1; } int ExistHlinkX(char *tgt, char *src, char *url, char *hrefStr) { char *p; char *u; p = strstr(src, tgt); if (!p) return 0; /*NASHI*/ for (u = url; *p; p++) { if (hrefStop(*p)) break; *u = *p; u++; } *u = '\0'; /*-- " 等の削除 --*/ cutWordOff(url, """); /* cutWordOff(url,";") ;*/ /*---------------------*/ sprintf(hrefStr, "%.1024s", url, url); //sprintf(hrefStr,"%s",url,url) ; return 1; /*ARI*/} int ExistHlink(char *src, char *h0, char *h1) { if (ExistHlinkX("http://", src, h0, h1)) return 1; if (ExistHlinkX("ftp://", src, h0, h1)) return 1; return 0; } int hlinkReplace(char *src) { char *last = src; char hlink0[SIZE_BUF]; char hlink1[SIZE_BUF]; while (last) { if (!ExistHlink(last, hlink0, hlink1)) break; last = doReplace(last, hlink0, hlink1); } return 1; } /****************************************************************/ /* END OF THIS FILE */ /****************************************************************/