括弧に囲まれたテキストを抽出

括弧に囲まれたテキストを抽出するプログラムを書いてみた。
sscanfで手抜きができないSJIS対策に作ったけど、多少苦労したので残しておきたい。
たとえば

	char test[1024];
	strcpy(test,"てきすとを\"読み出す\"テスト。");
	char* p=NULL;
	char* p2 = GetTextInBrackets(test,p,'"','"');

とあったときに
pに「読み出す」が、p2に「テスト」が入るような仕様にしてみた。

//ヘッダ
/**
 * @brief 括弧に囲まれたテキストを取り出す
 * @note ShiftJIS対策。括弧はマルチバイト非対応
 * @param[out] pText 抽出したテキスト
 * @param[in] pBra 括弧開く
 * @param[in] pKet 括弧閉じ
 * @return 括弧閉じの次のポインタ
 */
extern char* GetTextInBrackets(char*pInput,char*& pText,char nBra='\"',char nKet='\"');
//cpp
char* GetTextInBrackets(char* pInput,char*& pText,char nBra,char nKet){
	pText = pInput;
	if(nBra==nKet){//括弧開=閉の場合は括弧の内外が交互にくる
		while(*pText!=nBra){
			pText++;
			if(pText==0)return NULL;
		}
		//開くを発見
		char* p = ++pText;
		while(*p!=nKet){
			p++;
			if(*p=='\0')return NULL;
		}
		//閉じるを発見
		*p='\0';
		return ++p;
	}
	else{//括弧開!=閉の場合は括弧閉の対応が異なる
		//開を見つける
		while(*pText!=nBra){
			pText++;
			if(pText==0)return NULL;
		}
		//開を発見
		char* p = pText++;
		int n=1;
		while(n>0){
			p++;
			if(*p==nBra) n++;
			if(*p==nKet) n--;
			if(*p==0)return NULL;
		}
		*p='\0';
		return ++p;
		}
        }
}

せっかくだったので

	char test[1024];
	strcpy(test,"てきすとを(読(み出)す)テスト。");
	char* p=NULL;
	char* p2 = GetTextInBrackets(test,p,'(',')');

にも対応してみた。
これを実行するとpには「読(み出)す」が挿入される。ちゃんと括弧開く、閉じるの個数に対応させたわけである。
ちなみに(見れば分かると思うが)途中で文章が終わっている場合はNULLが返される。