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

このエントリーをはてなブックマークに追加
924デフォルトの名無しさん
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;