Beispiel #1
0
int main(int argc, char * const argv[])
{
    int c;

    while ((c = getopt(argc, argv, "m:p:r:n:e:")) != -1) {
        switch (c) {
        case 'm':
            if      (MATCH_STR("riffle")) mode = RIFFLE;
            else if (MATCH_STR("pile"))   mode = PILE;
            else if (MATCH_STR("random")) mode = RANDOM;
            else                          exit(usage());
            break;
        case 'p':
            GET_NUM(&piles);
            break;
        case 'r':
            GET_NUM(&reps);
            break;
        case 'n':
            GET_NUM(&cards);
            break;
        case 'e':
            GET_NUM(&error);
            break;
        case '?':
        default:
            exit(usage());
        }
    }
    if ((file = argv[optind]) == NULL) {
        printf("No output file specified.\n");
        exit(usage());
    }
    if (error < 0 || error > 100) {
        printf("Error must be between 0 and 100 (percent)\n");
        exit(usage());
    } else if (cards > 65536) {
        printf("Too many cards (%ld)\n", cards);
        exit(usage());
    }
    sgenrand(time(NULL));
    // printf("piles: %ld, reps: %ld, cards: %ld, mode: %d, file: %s\n", piles, reps, cards, mode, argv[optind]);
    return go();
}
Beispiel #2
0
/**
 * @brief 強調表示文字列の検索
 * @param pBeforeBetween 前の行の持ち越し色分け
 * @param plsWords 強調表示文字列リスト
 * @return 変更に変化があった場合trueが返る
 */
bool CFootyLine::SearchEmphasis(TakeOver *pBeforeBetween, LsWords *plsWords)
{
	if (!plsWords)return false;
	// 宣言
	WordPt pNowWord;								//!< 現在走査中の強調表示文字列
	TakeOver::iterator pNowBefore;					//!< 前データセット用
	const wchar_t *pNowChar = GetLineData();		//!< 現在走査中の文字列
	size_t nStringLen = GetLineLength();			//!< 文字列の長さ
	CStaticStack<WordPt,sizeof(int)*8> cEmpStack;	//!< 現在色つけしているスタック
	EmpPos stInsert;								//!< 挿入する構造体
	
	// 初期化
	TakeOver vecBetweenBackup;
	vecBetweenBackup = m_vecLineBetweenAfter;
	m_vecColorInfo.clear();
	m_vecLineBetweenAfter.clear();

	// 前からのデータをセットする
	if (pBeforeBetween){									// データが存在するときのみ
		stInsert.m_nPosition = 0;
		stInsert.m_bIsStart = true;
		for (pNowBefore=pBeforeBetween->begin();pNowBefore!=pBeforeBetween->end();pNowBefore++){
			(*pNowBefore)->m_bDuplix = true;				// 重複チェック
			stInsert.m_Color = (*pNowBefore)->GetColor();	// コマンドをリストへ
			m_vecColorInfo.push_back(stInsert);
			cEmpStack.push(*pNowBefore);
		}
	}
	
	// 小文字化
	std::wstring strLower = GetLineData();
	const wchar_t *pNowLower = strLower.c_str();
	CEmphasisWord::SetLower(&strLower[0], nStringLen);

	// 検索していく
	for (size_t i=0;i<nStringLen;i++,pNowChar++,pNowLower++)
	{
		bool bWordSkipped = false;
		// 文字列を走査していく
		for (pNowWord=plsWords->begin();pNowWord!=plsWords->end();pNowWord++)
		{
			// この文字が無効であるかチェックする
			if (pNowWord->m_bDuplix)continue;						// 重複チェック
			if (i != 0)
			{
				if (pNowWord->IsOnlyHead())continue;				// 先頭に限る
				if (!pNowWord->CheckIndependence(pNowChar-1,false))	// 独立性チェック(前)
					continue;
			}
			if (cEmpStack.size() == 0)
			{
				if (!pNowWord->IsPermitted(0))continue;
			}
			else
			{
				if (!pNowWord->IsPermitted(cEmpStack.top()->GetLevel()))continue;
			}
			if (nStringLen - i < pNowWord->GetLen1())				// 文字の長さは十分か?
			{
				continue;
			}

			if (nStringLen - i != pNowWord->GetLen1())
			{
				if (!pNowWord->CheckIndependence
					(pNowChar+pNowWord->GetLen1(),true))			// 独立性チェック(後)
					continue;
			}
			
			// 文字が一致するかチェック
			if (!MATCH_STR(pNowWord->GetString1(),pNowWord->GetLen1()))
				continue;

			// 開始コマンドを挿入する
			stInsert.m_nPosition = i;
			stInsert.m_Color = pNowWord->GetColor();
			stInsert.m_bIsStart = true;
			m_vecColorInfo.push_back(stInsert);

			// インデックス番号を先へ移動させる
			i += pNowWord->GetLen1() - 1;
			pNowChar += pNowWord->GetLen1() - 1;
			pNowLower+= pNowWord->GetLen1() - 1;
			bWordSkipped = true;

			// 強調表示情報によって場合分け
			if (pNowWord->GetType() == EMP_WORD){
				// 単語の時は、それの終了コマンドを挿入する
				stInsert.m_nPosition = i + 1;
				stInsert.m_bIsStart = false;
				m_vecColorInfo.push_back(stInsert);
			}
			else{
				// スタックを積む
				pNowWord->m_bDuplix = true;
				cEmpStack.push(pNowWord);
			}
			// 次の文字のループへ移動する
			goto To_NextLoop;
		}
		
		//終了をチェック
		if (cEmpStack.size()){
			pNowWord = cEmpStack.top();
			// 二個目の単語当たりをチェック
			if ((pNowWord->GetType() == EMP_MULTI_BETWEEN || pNowWord->GetType() == EMP_LINE_BETWEEN) && 
				nStringLen - i >= pNowWord->GetLen2()){
				if (MATCH_STR(pNowWord->GetString2(),pNowWord->GetLen2())){
					// インデックス番号を先へ移動させる
					i += pNowWord->GetLen2() - 1;
					pNowChar  += pNowWord->GetLen2() - 1;
					pNowLower += pNowWord->GetLen2() - 1;
					bWordSkipped = true;
					// 終了コマンドを挿入する
					stInsert.m_nPosition = i + 1;
					stInsert.m_bIsStart = false;
					m_vecColorInfo.push_back(stInsert);
					// スタックを排除
					pNowWord->m_bDuplix = false;
					cEmpStack.pop();
				}
			}
		}
		// 次のループへ
To_NextLoop:;
		// サロゲートペアの1文字目で、強調表示が見つからなかったときはさらに一つ進めておく
		if (!bWordSkipped && IsSurrogateLead(*pNowChar)){
			pNowChar++;i++;
		}
	}
	
	// 次のベクトルへ
	for (;cEmpStack.size();){
		if (cEmpStack.top()->GetType() == EMP_MULTI_BETWEEN)
			m_vecLineBetweenAfter.push_back(cEmpStack.top());
		cEmpStack.top()->m_bDuplix = false;
		cEmpStack.pop();
	}

	m_bEmphasisChached = true;
	return !(vecBetweenBackup == m_vecLineBetweenAfter);
}