⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sgfparser.cpp

📁 qgo-1.5.4-r3.tar.gz linux下一个很好玩的游戏
💻 CPP
📖 第 1 页 / 共 3 页
字号:
				// Added old L property. This is not SGF4, but many files contain this tag.				else if (toParse->at(pos) == 'L' && toParse->at(tmppos = toParse->next_nonspace (pos + 1)) == '[')				{					prop = editMark;					markType = markText;					pos = tmppos;					old_label = true;				}				else if (toParse->at(pos) == 'C' && toParse->at(tmppos = toParse->next_nonspace (pos + 1)) == '[')				{					prop = comment;					pos = tmppos;				}				else if (toParse->find("TB", pos) == pos && toParse->at(tmppos = toParse->next_nonspace (pos + 2)) == '[')				{					prop = editMark;					markType = markTerrBlack;					pos = tmppos;					black = true;				}				else if (toParse->find("TW", pos) == pos && toParse->at(tmppos = toParse->next_nonspace (pos + 2)) == '[')				{					prop = editMark;					markType = markTerrWhite;					pos = tmppos;					black = false;				}				else if (toParse->find("BL", pos) == pos && toParse->at(tmppos = toParse->next_nonspace (pos + 2)) == '[')				{					prop = timeLeft;					pos = tmppos;					black = true;				}				else if (toParse->find("WL", pos) == pos && toParse->at(tmppos = toParse->next_nonspace (pos + 2)) == '[')				{					prop = timeLeft;					pos = tmppos;					black = false;				}				else if (toParse->find("OB", pos) == pos && toParse->at(tmppos = toParse->next_nonspace (pos + 2)) == '[')				{					prop = openMoves;					pos = tmppos;					black = true;				}				else if (toParse->find("OW", pos) == pos && toParse->at(tmppos = toParse->next_nonspace (pos + 2)) == '[')				{					prop = openMoves;					pos = tmppos;					black = false;				}				else if (toParse->find("PL", pos) == pos && toParse->at(tmppos = toParse->next_nonspace (pos + 2)) == '[')				{					prop = nextMove;					pos = tmppos;				}        else if (toParse->find("RG", pos) == pos && toParse->at(tmppos = toParse->next_nonspace (pos + 2)) == '[')				{					prop = unknownProp;					pos = tmppos;          setup = true;				}				// Empty node				else if (toParse->at(pos) == ';' || toParse->at(pos) == '(' || toParse->at(pos) == ')')				{					qDebug("Found empty node at %d", pos);					while (toParse->at(pos).isSpace())						pos++;					continue;				}				else				{					// handle like comment					prop = unknownProp;					pos = toParse->next_nonspace (pos);//qDebug("SGF: next nonspace (1st):" + QString(toParse->at(pos)) + QString(toParse->at(pos+1)) + QString(toParse->at(pos+2)));				}								// qDebug("FOUND PROP %d, pos at %d now", prop, pos);								// Next is one or more '[xx]'.				// Only one in a move property, several in a setup propery				do {					if (toParse->at(pos) != '[' && prop != unknownProp)					{						delete toParse;						return corruptSgf(pos);					}										// Empty type					if (toParse->at(pos+1) == ']')					{						// CGoban stores pass as 'B[]' or 'W[]'						if (prop == moveBlack || prop == moveWhite)						{							boardHandler->doPass(true);														// Remember this move for later, to remove from the matrix.							position = new Position;							position->x = x;							position->y = y;							toRemove.push(position);							moves ++;						}												pos += 2;						continue;					}										switch (prop)					{					case moveBlack:					case moveWhite:						// rare case: root contains move or placed stone:						if (remember_root)						{							qDebug("root contains stone -> node created");							boardHandler->createMoveSGF();							unknownProperty = QString();							isRoot = false;if (tree->getCurrent()->getTimeinfo())	qWarning("*** Timeinfo set !!!!");							//tree->getCurrent()->setTimeinfo(false);						}					case editBlack:					case editWhite:					case editErase:					{						x = toParse->at(pos+1) - 'a' + 1;						y = toParse->at(pos+2) - 'a' + 1;						int x1, y1;						bool compressed_list;						// check for compressed lists						if (toParse->at(pos+3) == ':')						{							x1 = toParse->at(pos+4) - 'a' + 1;							y1 = toParse->at(pos+5) - 'a' + 1;							compressed_list = true;						}						else						{							x1 = x;							y1 = y;							compressed_list = false;						}												boardHandler->setModeSGF(setup || compressed_list ? modeEdit : modeNormal);												int i, j;						for (i = x; i <= x1; i++)							for (j = y; j <= y1; j++)							{								if (i == 20 && j == 20)									boardHandler->doPass(true);								else if (prop == editErase)								{									if (!fastLoad)										boardHandler->removeStone(i, j, true, false);									else									{										tree->getCurrent()->setX(0);										tree->getCurrent()->setY(0);										tree->getCurrent()->setColor(stoneNone);									}								}								else								{									if (!fastLoad)										boardHandler->addStoneSGF(black ? stoneBlack : stoneWhite, i, j, new_node);									else									{										tree->getCurrent()->setX(i);										tree->getCurrent()->setY(j);										tree->getCurrent()->setColor(black? stoneBlack : stoneWhite);									}								}								// tree->getCurrent()->getMatrix()->debug();								// qDebug("ADDING MOVE %s %d/%d", black?"B":"W", x, y);																// Remember this move for later, to remove from the matrix.								position = new Position;								position->x = i;								position->y = j;								toRemove.push(position);								moves ++;							}												new_node = false;												if (compressed_list)							// Advance pos by 7							pos += 7;						else							// Advance pos by 4							pos += 4;						break;					}											case nodeName:					{						commentStr = QString();						bool skip = false;												while (toParse->at(++pos) != ']')						{							if (static_cast<unsigned int>(pos) > strLength-1)							{								qDebug("SGF: Nodename string ended immediately");								delete toParse;								return corruptSgf(pos, "SGF: Nodename string ended immediately");							}							// white spaces							if (toParse->at(pos) == '\\')							{								while (toParse->at(pos+1).isSpace() &&									static_cast<unsigned int>(pos) < strLength-2)									pos++;								if (toParse->at(pos).isSpace())									pos++;								// case: "../<cr><lf>]"								if (toParse->at(pos) == ']')								{									pos--;									skip = true;								}							}							// escaped chars: '\', ']', ':'							if (!(toParse->at(pos) == '\\' &&								(toParse->at(pos+1) == ']' ||								 toParse->at(pos+1) == '\\' ||								 toParse->at(pos+1) == ':')) &&								 !skip &&								 // no formatting								!(toParse->at(pos) == '\n') &&								!(toParse->at(pos) == '\r'))								commentStr.append(toParse->at(pos));						}						// qDebug("Comment read: %s", commentStr.latin1());						if (commentStr)							// add comment; skip 'C[]'							tree->getCurrent()->setNodeName(commentStr);						pos++;						break;					}					case comment:					{						commentStr = QString();						bool skip = false;												while (toParse->at(++pos) != ']' ||							(toParse->at(pos-1) == '\\' && toParse->at(pos) == ']'))						{							if (static_cast<unsigned int>(pos) > strLength-1)							{								qDebug("SGF: Comment string ended immediately");								delete toParse;								return corruptSgf(pos, "SGF: Comment string ended immediately");							}							// white spaces							if (toParse->at(pos) == '\\')							{								while (toParse->at(pos+1).isSpace() &&									static_cast<unsigned int>(pos) < strLength-2)									pos++;								if (toParse->at(pos).isSpace())									pos++;								// case: "../<cr><lf>]"								if (toParse->at(pos) == ']')								{									pos--;									skip = true;								}							}							// escaped chars: '\', ']', ':'							if (!(toParse->at(pos) == '\\' &&								(toParse->at(pos+1) == ']' ||								 toParse->at(pos+1) == '\\' ||								 toParse->at(pos+1) == ':')) &&								 !skip)								commentStr.append(toParse->at(pos));						}						// qDebug("Comment read: %s", commentStr.latin1());						if (commentStr)						{							// add comment; skip 'C[]'							tree->getCurrent()->setComment(commentStr);						}						pos ++;						break;					}					case unknownProp:					{						// skip if property is known anyway						bool skip = false;						// save correct property name (or p.n. + '[')						commentStr = toParse->at(pos);						commentStr += toParse->at(tmppos = toParse->next_nonspace (pos + 1));						pos = tmppos;						// check if it's really necessary to hold properties						// maybe they are handled at another position						if (commentStr == "WR" ||							commentStr == "BR" ||							commentStr == "PW" ||							commentStr == "PB" ||							commentStr == "SZ" ||							commentStr == "KM" ||							commentStr == "HA" ||							commentStr == "RE" ||							commentStr == "DT" ||							commentStr == "PC" ||							commentStr == "CP" ||							commentStr == "GN" ||							commentStr == "OT" ||							commentStr == "TM" ||							// now: general options							commentStr == "GM" ||							commentStr == "ST" ||							commentStr == "AP" ||							commentStr == "FF")						{							skip = true;						}						sss= toParse->at(pos);						while (toParse->at(++pos) != ']' ||							(toParse->at(pos-1) == '\\' && toParse->at(pos) == ']'))						{							if (static_cast<unsigned int>(pos) > strLength-1)							{								qDebug("SGF: Unknown property ended immediately");								delete toParse;								return corruptSgf(pos, "SGF: Unknown property ended immediately");							}              sss= toParse->at(pos);							if (!skip)								commentStr.append(toParse->at(pos));						}						if (!skip)							commentStr.append("]");						// qDebug("Comment read: %s", commentStr.latin1());						if (commentStr && !skip)						{							// cumulate unknown properties; skip empty property 'XZ[]'							unknownProperty += commentStr;							tree->getCurrent()->setUnknownProperty(unknownProperty);						}						pos ++;            sss= toParse->at(pos);						break;					}					case editMark:						// set moveStr for increment labels of old 'L[]' property						moveStr = "A";						while (toParse->at(pos) == '[' &&							static_cast<unsigned int>(pos) < strLength)						{							x = toParse->at(pos+1) - 'a' + 1;							y = toParse->at(pos+2) - 'a' + 1;							// qDebug("MARK: %d at %d/%d", markType, x, y);							pos += 3;														// 'LB' property? Then we need to get the text							if (markType == markText && !old_label)							{								if (toParse->at(pos) != ':')								{									delete toParse;									return corruptSgf(pos);								}								moveStr = "";								while (toParse->at(++pos) != ']' &&									static_cast<unsigned int>(pos) < strLength)									moveStr.append(toParse->at(pos));								// qDebug("LB TEXT = %s", moveStr.latin1());								// It might me a number mark?								bool check = false;								moveStr.toInt(&check);  // Try to convert to Integer// treat integers as characters...check = false;																if (!fastLoad)								{									if (check)										tree->getCurrent()->getMatrix()->										insertMark(x, y, markNumber);  // Worked, its a number									else										tree->getCurrent()->getMatrix()->										insertMark(x, y, markType);    // Nope, its a letter									tree->getCurrent()->getMatrix()->										setMarkText(x, y, moveStr);								}								else								{									if (check)  // Number										tree->getCurrent()->insertFastLoadMark(x, y, markNumber);									else        // Text										tree->getCurrent()->insertFastLoadMark(x, y, markType, moveStr);								}							}							else							{								int x1, y1;								bool compressed_list;								// check for compressed lists								if (toParse->at(pos) == ':')								{									x1 = toParse->at(pos+1) - 'a' + 1;									y1 = toParse->at(pos+2) - 'a' + 1;									compressed_list = true;								}								else								{									x1 = x;									y1 = y;									compressed_list = false;								}								//								boardHandler->setModeSGF(setup || compressed_list ? modeEdit : modeNormal);																int i, j;								for (i = x; i <= x1; i++)									for (j = y; j <= y1; j++)									{										if (!fastLoad)											tree->getCurrent()->getMatrix()->insertMark(i, j, markType);										else											tree->getCurrent()->insertFastLoadMark(i, j, markType);										// auto increment for old property 'L'										if (old_label)										{											tree->getCurrent()->getMatrix()->												setMarkText(x, y, moveStr);											QChar c1 = moveStr[0];											if (c1 == 'Z')												moveStr = QString("a");											else												moveStr = c1.unicode() + 1;										}									}//								new_node = false;								if (compressed_list)									// Advance pos by 3									pos += 3;							}							//old_label = false;							pos ++;							while (toParse->at(pos).isSpace()) pos++;						}						break;					case openMoves:					{						QString tmp_mv;						while (toParse->at(++pos) != ']')							tmp_mv += toParse->at(pos);						tree->getCurrent()->setOpenMoves(tmp_mv.toInt());						pos++;						if (!tree->getCurrent()->getTimeinfo())						{							tree->getCurrent()->setTimeinfo(true);							tree->getCurrent()->setTimeLeft(0);						}						break;					}					case timeLeft:					{						QString tmp_mv;						while (toParse->at(++pos) != ']')							tmp_mv += toParse->at(pos);						tree->getCurrent()->setTimeLeft(tmp_mv.toFloat());						pos++;						if (!tree->getCurrent()->getTimeinfo())						{							tree->getCurrent()->setTimeinfo(true);							tree->getCurrent()->setOpenMoves(0);						}						break;					}					case nextMove:						if (toParse->at(++pos) == 'W')							tree->getCurrent()->setPLinfo(stoneWhite);						else if (toParse->at(pos) == 'B')							tree->getCurrent()->setPLinfo(stoneBlack);						pos += 2;						break;					default:						break;		    }		    while (toParse->at(pos).isSpace())			    pos++;        sss= toParse->at(pos);		} while (setup && toParse->at(pos) == '[');				//tree->getCurrent()->getMatrix()->debug();		while (toParse->at(pos).isSpace())			pos++;	    } while (toParse->at(pos) != ';' && toParse->at(pos) != '(' && toParse->at(pos) != ')' &&		    static_cast<unsigned int>(pos) < strLength);	    	    // Advance pointer	    pointer = pos;	    	    break;	    	default:		delete toParse;		return corruptSgf(pointer);	}	    } while (pointer < strLength && pos >= 0);        progress.setProgress(strLength);        delete toParse;    return !cancel;}bool SGFParser::corruptSgf(int where, QString reason){	QMessageBox::warning(0, PACKAGE, Board::tr("Corrupt SGF file at position") + " " +			     QString::number(where) + "\n\n" +			     (reason.isNull() || reason.isEmpty() ? QString("") : reason));	return false;}int SGFParser::minPos(int n1, int n2, int n3){	int min;		if (n1 != -1)		min = n1;	else if (n2 != -1)		min = n2;	else		min = n3;		if (n1 < min && n1 != -1)		min = n1;		if (n2 < min && n2 != -1)		min = n2;		if (n3 < min && n3 != -1)		min = n3;		return min;}// Return false: corrupt sgf, true: sgf okay. result = 0 when property not foundbool SGFParser::parseProperty(const QString &toParse, const QString &prop, QString &result){	int pos, strLength=toParse.length();	result = "";		pos = toParse.find(prop+"[");	if (pos == -1)		return true;		pos += 2;	if (toParse[pos] != '[')		return corruptSgf(pos);	while (toParse[++pos] != "]" && pos < strLength)		result.append(toParse[pos]);	if (pos > strLength)		return corruptSgf(pos);		return true;}bool SGFParser::initGame(const QString &toParse, const QString &fileName){	QString tmp="";	GameData *gameData = new GameData;	// White player name	if (!parseProperty(toParse, "PW", tmp))		return false;	if (!tmp.isEmpty())		gameData->playerWhite = tmp;	else		gameData->playerWhite = "White";	// White player rank	if (!parseProperty(toParse, "WR", tmp))		return false;	if (!tmp.isEmpty())		gameData->rankWhite = tmp;	else		gameData->rankWhite = "";

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -