StringPtr Bencoder::parseString(const std::string& str, unsigned int& pos) { m_logger->log(logger::Logger::FINE, "Bencoder::parseString()"); m_logger->begin(logger::Logger::DEBUG); // m_logger->prop("pos", pos); m_logger->prop("str[pos]", str[pos]); m_logger->end("Bencoder::parseString()"); assert( isDigit(str[pos]) ); int colonLength = 1; // : std::string lengthInString = ""; int lengthEnd = pos; while (isDigit(str[lengthEnd])) { lengthInString += str[lengthEnd]; ++lengthEnd; } int stringLength = utils::StringUtils::stringToInt(lengthInString); pos = lengthEnd + colonLength + stringLength; std::string parsedString = str.substr(lengthEnd+colonLength, stringLength); m_logger->begin(logger::Logger::DEBUG); // m_logger->prop("stringLength", stringLength); m_logger->prop("parsedString", parsedString); m_logger->end("Bencoder::parseString()"); StringPtr stringPtr( new String(parsedString) ); return stringPtr; // 123:asd }
void Value::clear() { switch (mType) { case Type_String: stringPtr()->~String(); break; case Type_Map: mapPtr()->~Map<String, Value>(); break; case Type_List: listPtr()->~List<Value>(); break; case Type_Custom: customPtr()->~shared_ptr<Custom>(); break; default: break; } mType = Type_Invalid; }
static BSErr findXMLTag(XMLParser* parser) { BSErr err = BSERR_OK; BSErr parseErr = BSERR_INVAILD; unsigned char c; while (err == BSERR_OK) { //printf("-\n"); if ((err = readMore(parser)) != BSERR_OK) break; if (parser->size == 0) break; { c = (unsigned char)parser->buffer[parser->ptr++]; //printf("%c",c); if (c <= 0x20 && parser->openclose != XMLPARSER_OPEN) { } else if (c == '<') { //タグ内部の解析 int space = 0; parseErr = BSERR_INVAILD; if ((err = startTag(parser)) != BSERR_OK) break; while (err == BSERR_OK) { if ((err = readMore(parser)) != BSERR_OK) break; if (parser->size == 0) break; c = (unsigned char)parser->buffer[parser->ptr++]; if (c == '=') { if (parser->strptr > 0) { err = foundTag(parser,stringPtr(parser)); resetStr(parser); } while (err == BSERR_OK) { if ((err = readMore(parser)) != BSERR_OK) break; if (parser->size == 0) break; c = (unsigned char)parser->buffer[parser->ptr++]; if (c <= 0x20) { } else if (c == '\"') { while (err == BSERR_OK) { if ((err = readMore(parser)) != BSERR_OK) break; if (parser->size == 0) break; c = (unsigned char)parser->buffer[parser->ptr++]; if (c == '\"') { if (parser->strptr > 0) { err = foundAtr(parser,stringPtr(parser)); resetStr(parser); } break; } else { err = appendChar(parser,c); } } break; } else { err = BSERR_INVAILD; } } } else if (c == '?') { if (parser->strptr > 0) { err = foundTag(parser,stringPtr(parser)); resetStr(parser); } err = appendChar(parser,c); err = foundTag(parser,stringPtr(parser)); resetStr(parser); } else if (c == '/') { if (parser->strptr > 0) { err = foundTag(parser,stringPtr(parser)); resetStr(parser); } err = appendChar(parser,c); err = foundTag(parser,stringPtr(parser)); resetStr(parser); } else if (c <= 0x20) { if (space == 0) { if (parser->strptr > 0) { err = foundTag(parser,stringPtr(parser)); resetStr(parser); } } space = 1; } else if (c == '>') { if (parser->strptr > 0) { err = foundTag(parser,stringPtr(parser)); resetStr(parser); } //printf("et-"); err = endTag(parser); //printf("et\n"); parseErr = BSERR_OK; break; } else { err = appendChar(parser,c); space = 0; } } } else { //文字列の解析 int space = 0; parseErr = BSERR_INVAILD; if ((err = startDoc(parser)) != BSERR_OK) break; if (c <= 0x20) { space = 1; } parser->ptr --; while (err == BSERR_OK) { if ((err = readMore(parser)) != BSERR_OK) break; if (parser->size == 0) break; c = (unsigned char)parser->buffer[parser->ptr++]; if (c <= 0x20) { if (parser->strptr > 0 && space == 0) { err = foundDoc(parser,stringPtr(parser)); resetStr(parser); } space = 1; err = appendChar(parser,c); } else if (c == '<') { if (parser->strptr > 0) { err = foundDoc(parser,stringPtr(parser)); resetStr(parser); } //printf("e-"); err = endDoc(parser); //printf("e\n"); parser->ptr --; break; } else { if (parser->strptr > 0 && space == 1) { err = foundDoc(parser,stringPtr(parser)); resetStr(parser); } err = appendChar(parser,c); space = 0; } } } } } if (parseErr != BSERR_OK) { return parseErr; } return err; }