コード例 #1
0
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
}
コード例 #2
0
ファイル: Value.cpp プロジェクト: hjanetzek/rct
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;
}
コード例 #3
0
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;
}