■スレッドリストへ戻る■ 全部 1- 101- 201- 301- 401- 501- 601- 701- 801- 901- 最新50

プログラマが2chを救う!?

901 :デフォルトの名無しさん :01/08/27 02:24 ID:yw5i/z86
>>886
x-sjisは変わらんが、Shift-Jisは変えられる様だ。
3.01jaを引っ張り出して来て試してみた。

902 :369 ◆3XTuRnAc :01/08/27 02:26 ID:xXHglqmc
>娘。さん
read12.c、バグがあります。

850行目
char *zz_GetString(char *dst,char tgt)

char *zz_GetString(char *dst,char *tgt)

861行目
if(kk[0] == tgt)

if(kk[0] == tgt[0])

じゃないですか?

903 :369 ◆3XTuRnAc :01/08/27 02:28 ID:xXHglqmc
てことで、その修正入れたのを

ftp://210.170.170.131/incoming/2ch-read-current/read12.1.c

としてコピーしておきました。

904 :デフォルトの名無しさん :01/08/27 02:30 ID:2NFCZnYc
新スレに移行された方がよいのでは?
プログラマが2chを救う!?2
http://piza2.2ch.net/test/read.cgi?bbs=tech&key=998845501

905 :772じゃないけど :01/08/27 02:34 ID:0cm50H8s
もうちょっと詳しく書くとこんな感じになるかな?
----------------------------------------------------------------------
#include <stdarg.h>
#include <zlib.h>
  :
/* 本当はグローバル変数を増やさない方がいいんだけど...
  printf()があちこちにあるので許してちょ */
typedef int (*zz_printf_t)(gzFile *, cont char *, ...);
static gzFile *zz_fptr = (gzFile *)stdout;
static zz_printf_t zz_printf = (zz_printf_t)fprintf;
  :
  :
if (gzip_flag) {
   :
 fflush(stdout);
 zz_fptr = gzdopen(1, "w");
 zz_printf = gzprintf;
 gzsetparams(zz_fptr, Z_BEST_COMRESSION, Z_DEFAULT_STRATEGY);
   :
}
  :
if (gzip_flag) {
   :
 gzclose(zz_gzfile);
}
----------------------------------------------------------------------
で ソース中の printf("fmt", ...) を (*zz_printf)(zz_fptr, "fmt", ...) に
書き換えて Makefileで
  LDFLAGS = -s -lz
を追加 あっ"-s"ってのは個人的な趣味なんで気に入らなければ外してもいいです

906 :デフォルトの名無しさん :01/08/27 02:35 ID:yw5i/z86
>>886 >>901
ごめん、Shift_JISだった。
表示コードを変えられなかったが、sjisだと認識するんならOKだし、
不明なコードなら変更できるんだからかまわないんでは。

907 :デフォルトの名無しさん :01/08/27 02:36 ID:pckFEAaY
>>905
そうそう、そんな感じで。

908 :デフォルトの名無しさん :01/08/27 02:38 ID:IuzteUCY
>>906
確か変えられなくて困った記憶があるんだが…記憶違いかも。
確かめてみる。

909 :デフォルトの名無しさん :01/08/27 02:45 ID:vN9r/JlA
>>905
 (*zz_printf)(zz_fptr, "fmt", ...)

 zz_printf(zz_fptr,"fmt", ...)
の方が良いと思われ。(ANSI C には反しない。)
後で元に戻すとき楽だと思う。

910 :デフォルトの名無しさん :01/08/27 02:48 ID:pckFEAaY
てか、cpp では

#define printf(str, ...) zz_printf(zz_fptr, str, ...)

みたいに可変引数できるんだっけ?

911 :デフォルトの名無しさん :01/08/27 02:51 ID:oVJMiQ2Y
#define printf(format, args...) zz_printf(zz_fptr, format, ## args)
ってのでGNU Cの拡張で「だけ」OKだったはず。

912 :デフォルトの名無しさん :01/08/27 02:51 ID:yw5i/z86
>>908
EUCなのに、x-sjisとかShift_JISとか書いてあって困ったんではないの。
間違ってShift-Jisってやったら変えられたからね。

913 :デフォルトの名無しさん :01/08/27 02:52 ID:oVJMiQ2Y
http://www.asahi-net.or.jp/~wg5k-ickw/html/online/gcc-2.8.1/gcc_3.html
詳しくはここいらの「可変個の引数をもつマクロ」を見れ

914 :デフォルトの名無しさん :01/08/27 02:53 ID:pckFEAaY
ま、んなことせんでも引数1〜10個まで#defineすればいっか

915 :908 :01/08/27 02:54 ID:IuzteUCY
すまん完全に勘違いしてた。
文字化けするのはネスケ2だった。

916 :デフォルトの名無しさん :01/08/27 02:55 ID:IuzteUCY
ネスケ2でShift_JISを指定してもEncodingがWesternに固定されて
変えられない。もちろん文書はシフトJIS。
2.02で確認。

917 :デフォルトの名無しさん :01/08/27 02:58 ID:yw5i/z86
>>915
さすがに、ネスケ2はそこらに残してない。

918 :デフォルトの名無しさん :01/08/27 03:00 ID:5VdVXYrU
いまベンチャー板にひろゆき(本物)いた。
http://yasai.2ch.net/test/read.cgi?bbs=venture&key=998402480

919 :デフォルトの名無しさん :01/08/27 03:04 ID:pckFEAaY
ひろゆきが助けてくださいと言って
西さん一晩考えるって・・・

920 :- :01/08/27 03:29 ID:q7WWiv5M
全鯖に read.cgi ver5.02 入ってますな。夜勤さん、おつかれさま・・・

921 :デフォルトの名無しさん :01/08/27 04:01 ID:vN9r/JlA
実況防止機能(素早い reload を無視)
http://cocoa.2ch.net/test/read.cgi?bbs=unix&key=998764722&st=490

922 :らいがー。 :01/08/27 04:30 ID:R/rjVC1g
あなた達かっこいいよ・・・。

923 :デフォルトの名無しさん :01/08/27 23:40 ID:bJ23bC3M
/*<ctype.h>等とかぶってたら、要置換*/
#definefalse(0)
#definetrue(!false)
#define_C_(1<<0)/*datチェック用区切り文字等*/
#define_U_(1<<1)/*URLに使う文字*/
#define_S_(1<<2)/*SJIS1バイト目=<br>タグ直前の空白が削除可かを適当に判定*/

//#defineisCheck(c)(flagtable[(unsigned char)(c)] & _C_)
#defineisCheck(c)(flagtable[/*(unsigned char)*/(c)] & _C_)
#defineisSJIS1(c)(flagtable[(unsigned char)(c)] & _S_)
#definehrefStop(c)(!(flagtable[(unsigned char)(c)] & _U_))

#define_0____(1<<0)
#define__1___(1<<1)
#define___2__(1<<2)
#define____3_(1<<3)
#define_____4(1<<4)

#define______(0)
#define_01___(_0____|__1___|0)
#define__1_3_(__1___|____3_|0)
#define___23_(___2__|____3_|0)
#define_0_23_(_0____|___2__|____3_|0)


char flagtable[256] = {
_0____,______,______,______,______,______,______,______,//00-07
______,______,______,______,______,______,______,______,//08-0F
______,______,______,______,______,______,______,______,//10-17
______,______,______,______,______,______,______,______,//18-1F
_0____,__1___,______,__1___,__1___,__1___,_01___,______,//20-27 !"#$%&'
______,______,__1___,__1___,_01___,__1___,__1___,__1___,//28-2F()*+,-./
__1___,__1___,__1___,__1___,__1___,__1___,__1___,__1___,//30-3701234567
__1___,__1___,__1___,__1___,_0____,__1___,______,__1___,//38-3F89:;<=>?
__1_3_,__1_3_,__1_3_,__1_3_,__1_3_,__1_3_,__1_3_,__1_3_,//40-47@ABCDEFG
__1_3_,__1_3_,__1_3_,__1_3_,__1_3_,__1_3_,__1_3_,__1_3_,//48-4FHIJKLMNO
__1_3_,__1_3_,__1_3_,__1_3_,__1_3_,__1_3_,__1_3_,__1_3_,//50-57PQRSTUVW
__1_3_,__1_3_,__1_3_,__1_3_,__1_3_,__1_3_,__1_3_,__1_3_,//58-5FXYZ[\]^_
__1_3_,__1_3_,__1_3_,__1_3_,__1_3_,__1_3_,__1_3_,__1_3_,//60-67`abcdefg
__1_3_,__1_3_,__1_3_,__1_3_,__1_3_,__1_3_,__1_3_,__1_3_,//68-6Fhijklmno
__1_3_,__1_3_,__1_3_,__1_3_,__1_3_,__1_3_,__1_3_,__1_3_,//70-77pqrstuvw
__1_3_,__1_3_,__1_3_,__1_3_,__1_3_,__1_3_,__1_3_,______,//78-7Fxyz{|}~
____3_,_0_23_,___23_,___23_,___23_,___23_,___23_,___23_,//80-87
___23_,___23_,___23_,___23_,___23_,___23_,___23_,___23_,//88-8F
___23_,___23_,___23_,___23_,___23_,___23_,___23_,___23_,//90-97
___23_,___23_,___23_,___23_,___23_,___23_,___23_,___23_,//98-9F
____3_,____3_,____3_,____3_,____3_,____3_,____3_,____3_,//A0-A7
____3_,____3_,____3_,____3_,____3_,____3_,____3_,____3_,//A8-AF
____3_,____3_,____3_,____3_,____3_,____3_,____3_,____3_,//B0-B7
____3_,____3_,____3_,____3_,____3_,____3_,____3_,____3_,//B8-BF
____3_,____3_,____3_,____3_,____3_,____3_,____3_,____3_,//C0-C7
____3_,____3_,____3_,____3_,____3_,____3_,____3_,____3_,//C8-CF
____3_,____3_,____3_,____3_,____3_,____3_,____3_,____3_,//D0-D7
____3_,____3_,____3_,____3_,____3_,____3_,____3_,____3_,//D8-DF
____3_,___23_,___23_,___23_,___23_,___23_,___23_,___23_,//E0-E7
___23_,___23_,___23_,___23_,___23_,___23_,___23_,___23_,//E8-EF
___23_,___23_,___23_,___23_,___23_,___23_,___23_,___23_,//F0-F7
___23_,___23_,___23_,___23_,___23_,______,______,______,//F8-FF
};

924 :デフォルトの名無しさん :01/08/27 23:41 ID:bJ23bC3M
typedef struct {//class...
char **buffers;//csvの要素
int rest;//残りのバッファサイズ・・厳密には判定してないので、数バイトは余裕が欲しい
int isTeri;//
} ressplitter;

/*
初期化
toparrayポインタ配列のアドレス
buffコピー先のバッファの先頭
bufsize厳密には判定してないので、数バイトは余裕が欲しい
*/
void ressplitter_init(ressplitter *This, char **toparray, char *buff, int bufsize/*, bool isteri*/)
{
This->buffers = toparray;
This->rest = bufsize;
This->isTeri = true;//レス1をstrstr("<>")した結果を設定すべき
*This->buffers = buff;
}

/*
findSplitterの代わり
レスを全走査するが、コピーと変換(と削除)を同時に行う
pコピー前のレス(BigBuffer内の1レス)
istagcut<a href=...>と</a>をcutするか
Return次のpの先頭
non-TYPE_TERIなdatには,"<>"は含まれないはずなので、#ifdef TYPE_TERI は略
*/
const char *ressplitter_split(ressplitter *This, const char *p, int istagcut)
{
char *bufp = *This->buffers;
int bufrest = This->rest;
while (--bufrest > 0) {
int ch = *(unsigned char *)p;
if (isCheck(ch)) {
switch (ch) {
case ' ':
//無意味な空白は1つだけにする
while (*(p+1) == ' ')
p++;
if (*(p+1) != '<')
break;
if (*(p+2) == '>') {
if (bufp == *This->buffers)//名前欄が半角空白の場合
*bufp++ = ' ';
p += 3;
goto Teri_Break;
}

if (memcmp(p, " <br> ", 6) == 0) {
if (bufp != *This->buffers && isSJIS1(*(bufp-1))) {
*bufp++ = ' ';
}
memcpy(bufp, "<br>", 4);
p += 6;
bufp += 4;
continue;
}
break;

925 :デフォルトの名無しさん :01/08/27 23:42 ID:bJ23bC3M
case '<'://醜いが
if (*(p+1) == '>') {
//This->isTeri = true;
p += 2;
goto Teri_Break;
}
if (istagcut) {
//if (*(p+1) != 'b' || *(p+2) != 'r') {
if ((*(p+1) == 'a' && *(p+2) == ' ') || (*(p+1) == '/' && *(p+2) == 'a')) {
while (*p != '>') {//strchr(p, '>')
if (*p == '\0')
goto Break;
++p;
}
++p;
continue;
}
}
break;
case '&':
if (memcmp(p, "&", 4) == 0) {
if (*(p + 4) != ';')
p += 4 - 1;
}
break;
#ifndefTYPE_TERI
case 0x81://*"@"
//if (!This->isTeri) {
if (memcmp(p, "@`", 4) == 0) {
ch = ',';
p += 4 - 1;
}
//}
break;
case ',':
//if (!This->isTeri) {
p++;
goto Break;
//}
//break;
#endif
case '\0':
goto Break;
//break;
default:
break;
}
}
*bufp++ = ch;
p++;
}

926 :デフォルトの名無しさん :01/08/27 23:43 ID:bJ23bC3M
Teri_Break:
//名前欄に','が入っている時にsplitをミスるので、見誤る可能性があるので、
//This->isTeri = true;
Break:
*bufp++ = '\0';
This->rest -= bufp - *This->buffers;
*++This->buffers = bufp;

//区切り末の空白を削除
if (*p == ' ')
++p;
return p;
}

void splitting_copy(char **s, char *bufp, const char *p, int size)
{
ressplitter res;
ressplitter_init(&res, s, bufp, size);

p = ressplitter_split(&res, p, false);//name
p = ressplitter_split(&res, p, false);//mail
p = ressplitter_split(&res, p, false);//date
p = ressplitter_split(&res, p, LINKTAGCUT && IsBusy2ch());//text
p = ressplitter_split(&res, p, false);//title
//IsBusy2ch()を何度も呼ぶのは大きな無駄
}

927 :デフォルトの名無しさん :01/08/27 23:43 ID:bJ23bC3M
その他に直す部分は、
先頭のほうに、
#definefalse(0)
#definetrue(!false)
#defineLINKTAGCUTtrue

out_html1()(369-)
- strncpy(p, BigLine[0], 1024);
- p[1024 - 1] = '\0';
- if (!*p)
- return 1;
- res_split(s, p);
+ splitting_copy(s, p, BigLine[0], sizeof(p) - 20);
+ if (!*p)
+ return 1;

out_html()(404-)
- strncpy(p, BigLine[0], 1024);
- p[1024 - 1] = '\0';
- if (!*p)
- return 1;
- res_split(s, p);
+ splitting_copy(s, p, BigLine[0], sizeof(p) - 20);
+ if (!*p)
+ return 1;

out_html()(421-)
- strncpy(p, BigLine[line], 1024);
- p[1024 - 1] = '\0';
- if (!*p)
- return 1;
- res_split(s, p);
+ splitting_copy(s, p, BigLine[line], sizeof(p) - 20);
+ if (!*p)
+ return 1;

hrefStop()
マクロで定義しなおしているので、
#if0
#endif
ででもはさんでくれ(コンパイルエラーが出る)。
res_split()とfindSplitter()も必要なくなるが、エラーにはならないので。

928 :デフォルトの名無しさん :01/08/28 00:19 ID:gWXKzR9.
わかると思うけど、
>>925
 case '&':
の下は、当然、
  if (memcmp(p, "&amp", 4) == 0) {
ね。

929 :デフォルトの名無しさん :01/08/29 22:04 ID:eQiT7HbI
BadAccessってさ、なんでif文を切ってるの?
コンパイルした時にダイナミックステップが多くなるじゃん。
caseにしろよ。その方が高速化するぞ。

930 :デフォルトの名無しさん :01/08/29 22:38 ID:6wtO5bLA
>>929
文字列比較にcase?

231KB
新着レスの表示

スレッドリストへ戻る 全部 前100 次100 最新50

0ch BBS 2004-10-30