Exemplo n.º 1
0
void processLineOfTokens(TokenNode **tokens){
    int i = 0;
    TokenNode *pointer = tokens[i];
    
    if (!pointer->pipe){
        processToken(pointer);
    }
    else
    {
        while (pointer != NULL){
            if (!pointer->pipe){
                processToken(pointer);
                //process will terminate in processToken function
            }
            int desp[2];
            pipe(desp);
            int pid = fork();
            if (pid == 0){
                close(desp[0]);
                dup2(desp[1],1);
                processToken(pointer);
            }else{
                close(desp[1]);
                int status;
                waitpid(pid,&status,0);
                dup2(desp[0],STDIN_FILENO);
            }
            i++;
            pointer = tokens[i];
        }
    }
}
Exemplo n.º 2
0
// The state machine loop
PassRefPtrWillBeRawPtr<MediaQuerySet> MediaQueryParser::parseImpl(CSSParserTokenRange range)
{
    while (!range.atEnd())
        processToken(range.consume());

    // FIXME: Can we get rid of this special case?
    if (m_parserType == MediaQuerySetParser)
        processToken(CSSParserToken(EOFToken));

    if (m_state != ReadAnd && m_state != ReadRestrictor && m_state != Done && m_state != ReadMediaNot)
        m_querySet->addMediaQuery(MediaQuery::createNotAll());
    else if (m_mediaQueryData.currentMediaQueryChanged())
        m_querySet->addMediaQuery(m_mediaQueryData.takeMediaQuery());

    return m_querySet;
}
void PostfixExprEvaluator::processToken(Token &token,
	                                    std::stack<Token> &operands,
	                                    Variables &vars)
{
	switch (token.type)
	{
		case TokenType::TOK_VARIABLE:
			token = vars.at(token.value.valueString);
			processToken(token, operands, vars);
			break;
		case TokenType::TOK_LPAREN:
		case TokenType::TOK_RPAREN:
			break;
		case TokenType::TOK_FLOAT:
		case TokenType::TOK_INT:
			operands.push(token);
			break;
		case TokenType::TOK_UNARYOP:
			processUnaryOp(token, operands);
			break;
		case TokenType::TOK_BINARYOP:
			processBinaryOp(token, operands);
			break;
	}  
}
Exemplo n.º 4
0
//--------------------------------------------------------------
// parse the file
void BVHFile::parseFile(
  const char* fileName)
{
  FILE* bvhFile = fopen(fileName, "rt");
  if (bvhFile == NULL)
    throw new mgException("cannot open %s", (const char*) fileName);

  m_state = STATE_START;
  m_linenum = 1;

  char buffer[4096];
  while (true)
  {
    size_t readLen = fread(buffer, 1, sizeof(buffer), bvhFile);
    if (readLen == 0)
      break;
    parseBuffer(buffer, (int) readLen);
  }
  if (!m_token.isEmpty())
    processToken(m_token);

  fclose(bvhFile);

  if (m_root != NULL)
    mgDebug("read %d nodes", m_root->nodeCount());
  mgDebug("frameCount: %d, frameTime: %g, totalChannels: %d", m_frameCount, m_frameTime, m_totalChannels);

  if (m_state != STATE_DONE)
    mgDebug("did not read all samples.  count = %d, expected %d", m_count, m_totalChannels*m_frameCount);
}
Exemplo n.º 5
0
// The state machine loop
RefPtr<MediaQuerySet> MediaQueryParser::parseInternal(CSSParserTokenRange range)
{
    while (!range.atEnd())
        processToken(range.consume());

    // FIXME: Can we get rid of this special case?
    if (m_parserType == MediaQuerySetParser)
        processToken(CSSParserToken(EOFToken));

    if (m_state != ReadAnd && m_state != ReadRestrictor && m_state != Done && m_state != ReadMediaNot) {
        MediaQuery query = MediaQuery(MediaQuery::Not, "all", Vector<MediaQueryExpression>());
        m_querySet->addMediaQuery(WTFMove(query));
    } else if (m_mediaQueryData.currentMediaQueryChanged())
        commitMediaQuery();

    return m_querySet;
}
Exemplo n.º 6
0
// The state machine loop
PassRefPtrWillBeRawPtr<MediaQuerySet> MediaQueryParser::parseImpl(TokenIterator token, TokenIterator endToken)
{
    for (; token != endToken; ++token)
        processToken(*token);

    if (m_state != ReadAnd && m_state != ReadRestrictor && m_state != Done)
        m_querySet->addMediaQuery(MediaQuery::createNotAll());
    else if (m_mediaQueryData.currentMediaQueryChanged())
        m_querySet->addMediaQuery(m_mediaQueryData.takeMediaQuery());

    return m_querySet;
}
std::stack<Token> PostfixExprEvaluator::eval(const Tokens &tokens,
	                                         Variables vars)
{
    std::stack<Token> operands;

    for (auto token : tokens)
    {
        processToken(token, operands, vars);
    }

    return operands;
}
Exemplo n.º 8
0
void CSyncSource::syncServerChanges()
{
    LOG(INFO) + "Sync server changes source ID :" + getID();

    while( getSync().isContinueSync() )
    {
        setCurPageCount(0);
        String strUrl = getProtocol().getServerQueryUrl("");
        String strQuery = getProtocol().getServerQueryBody(getName(), getSync().getClientID(), getSync().getSyncPageSize());

        if ( !m_bTokenFromDB && getToken() > 1 )
            strQuery += "&token=" + convertToStringA(getToken());

		LOG(INFO) + "Pull changes from server. Url: " + (strUrl+strQuery);
        PROF_START("Net");	    
        NetResponse(resp,getNet().pullData(strUrl+strQuery, &getSync()));
		PROF_STOP("Net");

        if ( !resp.isOK() )
        {
            getSync().stopSync();
			m_nErrCode = RhoAppAdapter.getErrorFromResponse(resp);
            m_strError = resp.getCharData();
            continue;
        }

        const char* szData = resp.getCharData();
        //const char* szData = "[{\"version\":3},{\"token\":\"\"},{\"count\":0},{\"progress_count\":28},{\"total_count\":28},{\"source-error\":{\"login-error\":{\"message\":\"s currently connected from another machine\"}}}]";
        //const char* szData = "[{\"version\":3},{\"token\":\"\"},{\"count\":0},{\"progress_count\":0},{\"total_count\":0},{\"create-error\":{\"0_broken_object_id\":{\"name\":\"wrongname\",\"an_attribute\":\"error create\"},\"0_broken_object_id-error\":{\"message\":\"error create\"}}}]";
        //const char* szData = "[{\"version\":3},{\"token\":\"35639160294387\"},{\"count\":3},{\"progress_count\":0},{\"total_count\":3},{\"metadata\":\"{\\\"foo\\\":\\\"bar\\\"}\",\"insert\":{\"1\":{\"price\":\"199.99\",\"brand\":\"Apple\",\"name\":\"iPhone\"}}}]";

        //LOG(INFO) + szData;
        PROF_START("Parse");
        CJSONArrayIterator oJsonArr(szData);
        PROF_STOP("Parse");

        processServerResponse_ver3(oJsonArr);

        if (getSync().getSourceOptions().getBoolProperty(getID(), "pass_through"))
            processToken(0);

        if ( getToken() == 0 )
            break;
    }

    if ( getSync().isSchemaChanged() )
        getSync().stopSync();
}
Exemplo n.º 9
0
/* 
	Creates and parses through an input file using a tokenizer object.
		Caller is responsible for opening and closing the input file.
		Tokenizer object is intialized and destroyed by this function.

	@param file 	 : File object pointer to parse
	@param inputname : The filename pointed to by the file pointer  
*/
int parseFile(FILE* file, char* inputname)
{

	TokenizerT* tk 	= TKCreate(file);
	char* token;
	token = TKGetNextToken(tk);
	do{

		//printf("\tCurrent token is: %s in %s \n",token, inputname);
		if(token == NULL){
			break;
		}
		processToken(token, inputname);
	}while((token = TKGetNextToken(tk)) != 0);

	TKDestroy(tk);
	return 0;
}
Exemplo n.º 10
0
//--------------------------------------------------------------
// parse a buffer
void BVHFile::parseBuffer(
  const char* buffer,
  int bufferLen)
{
  for (int i = 0; i < bufferLen; i++)
  {
    char c = buffer[i];
    if (isspace(c))
    {
      if (!m_token.isEmpty())
      {
        processToken(m_token);
        m_token.empty();
      }
      if (c == '\n')
        m_linenum++;
    }
    else if (c == '{')
    {
      if (!m_token.isEmpty())
      {
        processToken(m_token);
        m_token.empty();
      }
      processToken("{");
    }
    else if (c == '{')
    {
      if (!m_token.isEmpty())
      {
        processToken(m_token);
        m_token.empty();
      }
      processToken("}");
    }
    else if (c == ':')
    {
      m_token += c;
      processToken(m_token);
      m_token.empty();
    }
    else m_token += c;
  }
}
Exemplo n.º 11
0
bool Command::processParameter(const QStringList& block)
{
    QString parameterLine = mergeBlockToLine(block);
    // remove " :"
    parameterLine = parameterLine.remove(0, 2).trimmed();

    /* State: one parameter one line
     * one parameter n lines
     * n parameters one line
    */

    // break into parameter tokens
    bool lastTokenEnclosed = true;
    QStringList tokens = breakIntoTokens(parameterLine, lastTokenEnclosed);



    if (!lastTokenEnclosed)
    {
        // we need more lines of command parameters
        //dbgPlugins << "ParameterLine not enclosed";
        return false;
    }

    static int unhandledParameters = 0;

    Parameter * parameter = 0;
    Q_FOREACH (QString token, tokens)
    {

        QString paramName;
        QString typeDefinition;

        // determine parameter name and parameter definition
        processToken(token, paramName, typeDefinition);

        bool showPreviewOnChange = true;
        if (typeDefinition.startsWith("_"))
        {
            showPreviewOnChange = false;
            typeDefinition.remove(0,1);
        }

        if (typeDefinition.startsWith(Parameter::PARAMETER_NAMES[Parameter::FLOAT_P]))
        {
            parameter = new FloatParameter(paramName, showPreviewOnChange);
        }
        else if (typeDefinition.startsWith(Parameter::PARAMETER_NAMES[Parameter::INT_P]))
        {
            parameter = new IntParameter(paramName, showPreviewOnChange);
        }
        else if (typeDefinition.startsWith(Parameter::PARAMETER_NAMES[Parameter::SEPARATOR_P]))
        {
            parameter = new SeparatorParameter(paramName, showPreviewOnChange);
        }
        else if (typeDefinition.startsWith(Parameter::PARAMETER_NAMES[Parameter::CHOICE_P]))
        {
            parameter = new ChoiceParameter(paramName, showPreviewOnChange);
        }
        else if (typeDefinition.startsWith(Parameter::PARAMETER_NAMES[Parameter::TEXT_P]))
        {
            parameter = new TextParameter(paramName, showPreviewOnChange);
        }
        else if (typeDefinition.startsWith(Parameter::PARAMETER_NAMES[Parameter::NOTE_P]))
        {
            parameter = new NoteParameter(paramName, showPreviewOnChange);
        }
        else if (typeDefinition.startsWith(Parameter::PARAMETER_NAMES[Parameter::LINK_P]))
        {
            parameter = new LinkParameter(paramName, showPreviewOnChange);
        }
        else if (typeDefinition.startsWith(Parameter::PARAMETER_NAMES[Parameter::BOOL_P]))
        {
            parameter = new BoolParameter(paramName, showPreviewOnChange);
        }
        else if (typeDefinition.startsWith(Parameter::PARAMETER_NAMES[Parameter::COLOR_P]))
        {
            parameter = new ColorParameter(paramName, showPreviewOnChange);
        }
        else if (typeDefinition.startsWith(Parameter::PARAMETER_NAMES[Parameter::FOLDER_P]))
        {
            parameter = new FolderParameter(paramName, showPreviewOnChange);
        }
        else if (typeDefinition.startsWith(Parameter::PARAMETER_NAMES[Parameter::FILE_P]))
        {
            parameter = new FileParameter(paramName, showPreviewOnChange);
        }
        else if (typeDefinition.startsWith(Parameter::PARAMETER_NAMES[Parameter::CONST_P]))
        {
            parameter = new ConstParameter(paramName, showPreviewOnChange);
        }
        else if (typeDefinition.startsWith(Parameter::PARAMETER_NAMES[Parameter::BUTTON_P]))
        {
            parameter = new ButtonParameter(paramName, showPreviewOnChange);
        }
        else
        {
            unhandledParameters++;
            dbgPlugins << "Unhandled parameter " << unhandledParameters << parent()->name() << "\\" << name() << paramName << typeDefinition;
        }

        if (parameter)
        {
            parameter->parseValues(typeDefinition);
            m_parameters.append(parameter);
            parameter = 0;
        }


    }
Exemplo n.º 12
0
/* virtual */ SysStatus
XHandleTrans::demolish(XHandle xhandle, uval &clientData)
{
    XBaseObj *xBaseObj;
    ObjRef objRef;
    BaseProcessRef procRef;
    SysStatus rc;
    SysStatusProcessID processPID;
    // no lock is held, so these pointers can dissapear
    // out from under us.  That's why we copy and test.
    // also, the xhandle may already be free, so all errors
    // just lead to returning

    tassertMsg(XHANDLE_IDX(xhandle) >= CObjGlobals::numReservedEntries,
	       "Freeing global xhandle\n");
    xBaseObj = &xhandleTable[XHANDLE_IDX(xhandle)];
    objRef = xBaseObj->__iobj;
    processPID = xBaseObj->getOwnerProcessID();

#ifdef __NO_REGISTER_WITH_KERNEL_WRAPPER
#define REGISTER_ALWAYS 0
#else
#define REGISTER_ALWAYS 0
#endif

    if (REGISTER_ALWAYS || (processPID != _KERNEL_PID)) {
	// we know kernel will not go away, don't insert in process list,
	// since this ProcessWrapper becomes a hot spot in file systems
	rc = DREFGOBJ(TheProcessSetRef)->
	    getRefFromPID(xBaseObj->getOwnerProcessID(), procRef);
	if (_FAILURE(rc)) {
	    procRef = NULL;
	}
    }
    uval procLocked = 0;

    tassertMsg(objRef, "No object in XHandleTrans::demolish\n");

    rc=DREF(objRef)->publicLockExportedXObjectList();
    tassertMsg(rc==0, "Can't lock in XHandleTrans::demolish\n");

    if (procRef && (REGISTER_ALWAYS || (processPID != _KERNEL_PID))) {
	procLocked = DREF(procRef)->lockMatchedXObjectList();
    }

    tassertMsg(xBaseObj->isValid(), "Object is invalid\n");

    /* kill xobject so subsequent calls fail don't need a sync -
     * token circulates before xobj becomes unsafe for stale
     * references remove from process and object lists. Remove
     * holder from lists and reset __nummeth to prevent another
     * releaseAccess call (inflight) from trying to free this
     * again.
     */
    xBaseObj->__nummeth = 0;
    if (procRef && (REGISTER_ALWAYS || (processPID != _KERNEL_PID))) {
	DREF(procRef)->removeMatchedXObj(xhandle);
    }
    DREF(objRef)->removeExportedXObj(xhandle);

    // release locks before callback
    if (procLocked && (REGISTER_ALWAYS || (processPID != _KERNEL_PID))) {
	DREF(procRef)->unlockMatchedXObjectList();
    }

    clientData = xBaseObj->getClientData();

    DREF(objRef)->publicUnlockExportedXObjectList();

    xBaseObj->setBeingFreed(0);
//	DREF(objRef)->handleXObjFree(xhandle);

    XBaseObj *removed;

    // must to this after removes - same space is used for both
    do {
	removed = removedEntries;
	xBaseObj->setNextFree(removed);
    } while (!CompareAndStoreSynced((uval*)(&removedEntries),
				    (uval)removed, (uval)xBaseObj));

    numberRemoved++;		// doesn't have to be exact,
				// so don't sync

    if ((numberRemoved % XHANDLE_TABLE_GC_INTERVAL) == 0) processToken();
    return 0;
}
Exemplo n.º 13
0
/* virtual */ SysStatus
XHandleTrans::free(XHandle xhandle)
{
    XBaseObj *xBaseObj;
    ObjRef objRef;
    BaseProcessRef procRef;
    SysStatus rc;
    SysStatusProcessID processPID;
    // no lock is held, so these pointers can dissapear
    // out from under us.  That's why we copy and test.
    // also, the xhandle may already be free, so all errors
    // just lead to returning

    tassertMsg(XHANDLE_IDX(xhandle) >= CObjGlobals::numReservedEntries,
	       "Freeing global xhandle\n");
    xBaseObj = &xhandleTable[XHANDLE_IDX(xhandle)];
    objRef = xBaseObj->__iobj;
    processPID = xBaseObj->getOwnerProcessID();


#ifdef __NO_REGISTER_WITH_KERNEL_WRAPPER
    if (processPID != _KERNEL_PID) {
	// we know kernel will not go away, don't insert in process list,
	// since this ProcessWrapper becomes a hot spot in file systems
	rc = DREFGOBJ(TheProcessSetRef)->
	    getRefFromPID(xBaseObj->getOwnerProcessID(), procRef);
	if (_FAILURE(rc)) {
	    tassert(!(xBaseObj->isValid()),
		    err_printf("PID %ld invalid in valid Xobj\n",
			       xBaseObj->getOwnerProcessID()));
	    return 0;
	}
	if (!procRef) return 0;
    }
#else
    rc = DREFGOBJ(TheProcessSetRef)->
	getRefFromPID(xBaseObj->getOwnerProcessID(), procRef);
    if (_FAILURE(rc)) {
	tassert(!(xBaseObj->isValid()),
		err_printf("PID %ld invalid in valid Xobj\n",
			   xBaseObj->getOwnerProcessID()));
	return 0;
    }
    if (!procRef) return 0;
#endif

    if ((!objRef)) return 0;
    if ((rc=DREF(objRef)->publicLockExportedXObjectList())) return 0;
#ifdef __NO_REGISTER_WITH_KERNEL_WRAPPER
    if (processPID != _KERNEL_PID) {
	if ((rc=DREF(procRef)->lockMatchedXObjectList())) {
	    DREF(objRef)->publicUnlockExportedXObjectList();
	    return 0;
	}
    }
#else
    if ((rc=DREF(procRef)->lockMatchedXObjectList())) {
	DREF(objRef)->publicUnlockExportedXObjectList();
	return 0;
    }
#endif
    //once we have the locks, the XObject state can't change out from
    //under us.
    if (xBaseObj->isValid()) {
	/* kill xobject so subsequent calls fail don't need a sync -
	 * token circulates before xobj becomes unsafe for stale
	 * references remove from process and object lists. Remove
	 * holder from lists and reset __nummeth to prevent another
	 * releaseAccess call (inflight) from trying to free this
	 * again.
	 */
	xBaseObj->__nummeth = 0;
#ifdef __NO_REGISTER_WITH_KERNEL_WRAPPER
	if (processPID != _KERNEL_PID) {
	    DREF(procRef)->removeMatchedXObj(xhandle);
	}
#else
	DREF(procRef)->removeMatchedXObj(xhandle);
#endif
	DREF(objRef)->removeExportedXObj(xhandle);

	// release locks before callback
#ifdef __NO_REGISTER_WITH_KERNEL_WRAPPER
	if (processPID != _KERNEL_PID) {
	    DREF(procRef)->unlockMatchedXObjectList();
	}
#else
	DREF(procRef)->unlockMatchedXObjectList();
#endif
	DREF(objRef)->publicUnlockExportedXObjectList();

	xBaseObj->setBeingFreed(0);
	DREF(objRef)->handleXObjFree(xhandle);

	XBaseObj *removed;

	// must to this after removes - same space is used for both
	do {
	    removed = removedEntries;
	    xBaseObj->setNextFree(removed);
	} while (!CompareAndStoreSynced((uval*)(&removedEntries),
				       (uval)removed, (uval)xBaseObj));

	numberRemoved++;		// doesn't have to be exact,
					// so don't sync
    } else {
	// race - someone else freed the XObject
	// release locks using original values.
#ifdef __NO_REGISTER_WITH_KERNEL_WRAPPER
	if (processPID != _KERNEL_PID) {
	    DREF(procRef)->unlockMatchedXObjectList();
	}
#else
	DREF(procRef)->unlockMatchedXObjectList();
#endif
	DREF(objRef)->publicUnlockExportedXObjectList();
    }

    if ((numberRemoved % XHANDLE_TABLE_GC_INTERVAL) == 0) processToken();
    return 0;
}
Exemplo n.º 14
0
/* virtual */ SysStatusXHandle
XHandleTrans::alloc(ObjRef oref, BaseProcessRef pref,
		    AccessRights matched, AccessRights unmatched,
		    COVTableEntry* vtbl, uval8 numMethods,
		    uval clientData)
{
    SysStatus rc = 0;
    XBaseObj *te;
    SysStatusProcessID matchPID;

    // lock the obj and process lists
    // we munch the static function to be a member function so to speak

    uval idx = CObjGlobals::GlobalXHandleIdx(oref);
    if (idx && (matched & MetaObj::globalHandle)) {
	te = &xhandleTable[idx];
    } else do {

	/*
	 * because these objects are managed with ReadCopyUpdate
	 * its safe to do a non-blocking pop.  If the top object
	 * disappears, it cant re-appear will this thread completes
	 */

	while ((te = freeEntries)) {
	    XBaseObj* next;
	    next=te->getNextFree();
	    if (CompareAndStoreSynced(
		(uval*)(&freeEntries), (uval)te, (uval)next)) break;
	}

	if (te == 0) {
	    // Free list is empty.  See if any previous of frees can
	    // be completed.
	    processToken();
	    if (freeEntries == 0) {
		// Free list is still empty.  Allocate a new chunk of
		// the table, guarded by oldEntries lock
		oldEntries.acquire();
		// check after getting the lock to avoid duplicate extends
		if (FetchAndNop((uval*)&freeEntries) == 0) {
		    XBaseObj *top, *bottom, *oldFree;
		    uval const newLimit = xhandleTableLimit +
			XHANDLE_TABLE_INCREMENT;

		    passertMsg(newLimit <= XHANDLE_TABLE_MAX,
			       "Quasi-infinite xhandle table exhausted.\n");
		    InitXHandleRange(xhandleTable,
					  xhandleTableLimit, newLimit,
					  top, bottom);
		    xhandleTableLimit = newLimit;
		    rc = DREFGOBJ(TheDispatcherMgrRef)->
			publishXHandleTable(xhandleTable, xhandleTableLimit);
		    tassertMsg(_SUCCESS(rc),"publishXHandleTable failed.\n");
		    // must not make new entries available until limit is moved
		    do {
			oldFree = freeEntries;
			bottom->setNextFree(oldFree);
		    } while (!(CompareAndStoreSynced(
			(uval*)(&freeEntries), (uval)oldFree, (uval)top)));

		}
		oldEntries.release();
	    }
	}
    } while (te == 0);

    matchPID = DREF(pref)->getPID();
    tassertMsg(_SUCCESS(matchPID), "bad process ref passed in alloc %lx\n",rc);

    if (_FAILURE(rc = DREF(oref)->publicLockExportedXObjectList())) goto exit1;
#ifdef __NO_REGISTER_WITH_KERNEL_WRAPPER
    if (matchPID != _KERNEL_PID) {
	// we know kernel will not go away, don't insert in process list,
	// since this ProcessWrapper becomes a hot spot in file systems
	if (_FAILURE(rc = DREF(pref)->lockMatchedXObjectList())) goto exit2;
    }
#else
    if (_FAILURE(rc = DREF(pref)->lockMatchedXObjectList())) goto exit2;
#endif

    // populate the translation entry, make sure vtable is last
    // do not modify the seqNo which is incremented on free
    te->__iobj      = oref;
    te->__matchPID  = _SGETPID(matchPID);
    te->__mrights   = matched | MetaObj::processOnly;
    te->__urights   = unmatched;
    te->clientData  = clientData;

    XHandle xhandle;
    xhandle = te->getXHandle();

    // add to process and object lists - can't fail, lock is held
#ifdef __NO_REGISTER_WITH_KERNEL_WRAPPER
    if (matchPID != _KERNEL_PID) {
	DREF(pref)->addMatchedXObj(xhandle);
    }
#else
    DREF(pref)->addMatchedXObj(xhandle);
#endif
    DREF(oref)->addExportedXObj(xhandle);

    // now stick in the vtable pointer
    XBaseObj::SetFTable(te, vtbl);

    // now sync and then make the xobject valid
    // N.B. nummeth is valid flag
    SyncBeforeRelease();
    te->__nummeth = numMethods;
    tassertMsg(numMethods != 0, "numMethods is 0 for xhandle 0x%lx\n", xhandle);

#ifdef __NO_REGISTER_WITH_KERNEL_WRAPPER
    if (matchPID != _KERNEL_PID) {
	DREF(pref)->unlockMatchedXObjectList();
    }
#else
    DREF(pref)->unlockMatchedXObjectList();
#endif
    DREF(oref)->publicUnlockExportedXObjectList();

    return xhandle;

exit2:
    DREF(oref)->publicUnlockExportedXObjectList();
exit1:
    // Return the entry we acquired to the removed list
    // We don't put it on the free list because we want ReadCopyUpdate
    // guarantees for nonblocking access to freelist.
    XBaseObj *removed;

    te->setBeingFreed(0);		// make sure since its going
					// through removed cycle
    do {
	removed = removedEntries;
	te->setNextFree(removed);
    } while (!CompareAndStoreSynced((uval*)(&removedEntries),
				    (uval)removed, (uval)te));

    numberRemoved++;			// doesn't have to be exact,
					// so don't sync
    return rc;
}
Exemplo n.º 15
0
Result<SelfTestStatistic> SelfTest::GetStatistic(const Settings& settings) const
{
	Trace trace(settings.GetLogLevel());
	trace < L"SelfTest::GetStatistic";

	Handle processToken(L"Process token");
	if (!::OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &processToken))
	{
		return Error(L"OpenProcessToken");
	}

	trace < L"Token groups:";
	auto tokenGroupsResult = _securityManager.GetTokenGroups(trace, processToken);
	if (!tokenGroupsResult.HasError())
	{
		auto tokenGroups = tokenGroupsResult.GetResultValue();
		for (auto groupsIterator = tokenGroups.begin(); groupsIterator != tokenGroups.end(); ++groupsIterator)
		{
			trace < groupsIterator->ToString();
		}
	}	
	
	auto isServiceResult = IsService(trace, processToken);
	if (isServiceResult.HasError())
	{
		return isServiceResult.GetError();
	}

	trace < L"SelfTest::IsService: ";
	trace << isServiceResult.GetResultValue();

	auto hasAdministrativePrivilegesResult = HasAdministrativePrivileges(trace);
	if (hasAdministrativePrivilegesResult.HasError())
	{
		return hasAdministrativePrivilegesResult.GetError();
	}

	trace < L"SelfTest::HasAdministrativePrivileges: ";
	trace << hasAdministrativePrivilegesResult.GetResultValue();

	auto hasSeAssignPrimaryTokenPrivilegeResult = HasPrivilege(trace, processToken, SE_ASSIGNPRIMARYTOKEN_NAME);
	if (hasSeAssignPrimaryTokenPrivilegeResult.HasError())
	{
		return hasSeAssignPrimaryTokenPrivilegeResult.GetError();
	}

	trace < L"SelfTest::HasPrivilege(SE_ASSIGNPRIMARYTOKEN_NAME): ";
	trace << hasSeAssignPrimaryTokenPrivilegeResult.GetResultValue();

	auto hasSeTcbPrivilegeResult = HasPrivilege(trace, processToken, SE_TCB_NAME);
	if (hasSeTcbPrivilegeResult.HasError())
	{
		return hasSeTcbPrivilegeResult.GetError();
	}

	trace < L"SelfTest::HasPrivilege(SE_TCB_NAME): ";
	trace << hasSeTcbPrivilegeResult.GetResultValue();

	auto integrityLevelResult = GetIntegrityLevel(trace, processToken);
	if (integrityLevelResult.HasError())
	{
		return integrityLevelResult.GetError();
	}
	
	
	trace < L"SelfTest::GetIntegrityLevel: ";
	trace << integrityLevelResult.GetResultValue();

	return SelfTestStatistic(
		isServiceResult.GetResultValue(),
		hasAdministrativePrivilegesResult.GetResultValue(),
		hasSeAssignPrimaryTokenPrivilegeResult.GetResultValue(),
		hasSeTcbPrivilegeResult.GetResultValue(),
		integrityLevelResult.GetResultValue());
}
Exemplo n.º 16
0
static void
parseScript(const char *     const scriptText,
            struct script ** const scriptPP) {

    struct script * scriptP;
    unsigned int cursor;  /* cursor in scriptText[] */
    bool intoken;      /* Cursor is inside token */
    unsigned int tokenStart;
        /* Position in 'scriptText' where current token starts.
           Meaningless if 'intoken' is false.
        */
    bool quotedToken;
        /* Current token is a quoted string.  Meaningless if 'intoken'
           is false 
        */
    struct tokenSet tokenSet;

    MALLOCVAR_NOFAIL(scriptP);

    scriptP->commandListHeadP = NULL;
    scriptP->commandListTailP = NULL;

    /* A token begins with a non-whitespace character.  A token ends before
       a whitespace character or semicolon or end of script, except that if
       the token starts with a double quote, whitespace and semicolon don't
       end it and another double quote does.

       Semicolon (unquoted) is a token by itself.
    */

    tokenSet.count = 0;
    intoken = FALSE;
    tokenStart = 0;
    cursor = 0;

    while (scriptText[cursor] != '\0') {
        char const scriptChar = scriptText[cursor];
        
        if (intoken) {
            if ((quotedToken && scriptChar == '"') ||
                (!quotedToken && (isspace(scriptChar) || scriptChar == ';'))) {
                /* We've passed a token. */

                processToken(scriptText, cursor, tokenStart, scriptP,
                             &tokenSet);

                intoken = FALSE;
                if (scriptChar != ';')
                    ++cursor;
            } else
                ++cursor;
        } else {
            if (!isspace(scriptChar)) {
                /* A token starts here */

                if (scriptChar == ';')
                    /* It ends here too -- semicolon is token by itself */
                    processToken(scriptText, cursor+1, cursor, scriptP,
                                 &tokenSet);
                else {
                    intoken = TRUE;
                    quotedToken = (scriptChar == '"');
                    if (quotedToken)
                        tokenStart = cursor + 1;
                    else
                        tokenStart = cursor;
                }
            }
            ++cursor;
        }            
    }

    if (intoken) {
        /* Parse the last token, which was terminated by end of string */
        if (quotedToken)
            pm_error("Script ends in the middle of a quoted string");
        processToken(scriptText, cursor, tokenStart, scriptP, &tokenSet);
    }

    if (tokenSet.count > 0) {
        /* Parse the last command, which was not terminated with a semicolon.
         */
        disposeOfCommandTokens(&tokenSet, scriptP);
    }

    *scriptPP = scriptP;
}
Exemplo n.º 17
0
void CSyncSource::processServerResponse_ver3(CJSONArrayIterator& oJsonArr)
{
    PROF_START("Data1");

    int nVersion = 0;
    if ( !oJsonArr.isEnd() && oJsonArr.getCurItem().hasName("version") )
    {
        nVersion = oJsonArr.getCurItem().getInt("version");
        oJsonArr.next();
    }

    if ( nVersion != getProtocol().getVersion() )
    {
        LOG(ERROR) + "Sync server send data with incompatible version. Client version: " + convertToStringA(getProtocol().getVersion()) +
            "; Server response version: " + convertToStringA(nVersion) + ". Source name: " + getName();
        getSync().stopSync();
        m_nErrCode = RhoAppAdapter.ERR_SYNCVERSION;
        return;
    }

    if ( !oJsonArr.isEnd() && oJsonArr.getCurItem().hasName("token"))
    {
        processToken(oJsonArr.getCurItem().getUInt64("token"));
        oJsonArr.next();
    }

    if ( !oJsonArr.isEnd() && oJsonArr.getCurItem().hasName("source") )
    {
        //skip it. it uses in search only
        oJsonArr.next();
    }

    if ( !oJsonArr.isEnd() && oJsonArr.getCurItem().hasName("count") )
    {
        setCurPageCount(oJsonArr.getCurItem().getInt("count"));
        oJsonArr.next();
    }

    if ( !oJsonArr.isEnd() && oJsonArr.getCurItem().hasName("refresh_time") )
    {
        setRefreshTime(oJsonArr.getCurItem().getInt("refresh_time"));
        oJsonArr.next();
    }

    if ( !oJsonArr.isEnd() && oJsonArr.getCurItem().hasName("progress_count") )
    {
        //TODO: progress_count
        //setTotalCount(oJsonArr.getCurItem().getInt("progress_count"));
        oJsonArr.next();
    }

    if ( !oJsonArr.isEnd() && oJsonArr.getCurItem().hasName("total_count") )
    {
        setTotalCount(oJsonArr.getCurItem().getInt("total_count"));
        oJsonArr.next();
    }

    //if ( getServerObjectsCount() == 0 )
    //    getNotify().fireSyncNotification(this, false, RhoAppAdapter.ERR_NONE, "");

    if ( getToken() == 0 )
    {
        //oo conflicts
        getDB().executeSQL("DELETE FROM changed_values where source_id=? and sent>=3", getID() );
        //

    }

	LOG(INFO) + "Got " + getCurPageCount() + "(Processed: " +  getServerObjectsCount() + ") records of " + getTotalCount() + " from server. Source: " + getName()
         + ". Version: " + nVersion;

    PROF_STOP("Data1");
    if ( !oJsonArr.isEnd() && getSync().isContinueSync() )
    {
        CJSONEntry oCmds = oJsonArr.getCurItem();
        PROF_START("Data");
        //TODO: use isUIWaitDB inside processSyncCommand
        //    if ( getDB().isUIWaitDB() )
        //    {
		//        LOG(INFO) + "Commit transaction because of UI request.";
        //        getDB().endTransaction();
        //        getDB().startTransaction();
        //    }

        if ( oCmds.hasName("schema-changed") )
        {
            getSync().setSchemaChanged(true);
        }else if ( oCmds.hasName("source-error") )
        {
            CJSONEntry errSrc = oCmds.getEntry("source-error");
            CJSONStructIterator errIter(errSrc);
            for( ; !errIter.isEnd(); errIter.next() )
            {
                m_nErrCode = RhoAppAdapter.ERR_CUSTOMSYNCSERVER;
                m_strError = errIter.getCurValue().getString("message");
                m_strErrorType = errIter.getCurKey();
            }
        }else if ( oCmds.hasName("search-error") )
        {
            CJSONEntry errSrc = oCmds.getEntry("search-error");
            CJSONStructIterator errIter(errSrc);
            for( ; !errIter.isEnd(); errIter.next() )
            {
                m_nErrCode = RhoAppAdapter.ERR_CUSTOMSYNCSERVER;
                m_strError = errIter.getCurValue().getString("message");
                m_strErrorType = errIter.getCurKey();
            }
        }else if ( oCmds.hasName("create-error") )
        {
            m_nErrCode = RhoAppAdapter.ERR_CUSTOMSYNCSERVER;
            m_strErrorType = "create-error";
        }else if ( oCmds.hasName("update-error") )
        {
            m_nErrCode = RhoAppAdapter.ERR_CUSTOMSYNCSERVER;
            m_strErrorType = "update-error";
        }else if ( oCmds.hasName("delete-error") )
        {
            m_nErrCode = RhoAppAdapter.ERR_CUSTOMSYNCSERVER;
            m_strErrorType = "delete-error";
        }else
        {
            getDB().startTransaction();

            if (getSync().getSourceOptions().getBoolProperty(getID(), "pass_through"))
            {
                if ( m_bSchemaSource )
                    getDB().executeSQL( (String("DELETE FROM ") + getName()).c_str() );
                else
                    getDB().executeSQL("DELETE FROM object_values WHERE source_id=?", getID() );
            }

            if ( oCmds.hasName("metadata") && getSync().isContinueSync() )
            {
                String strMetadata = oCmds.getString("metadata");
                getDB().executeSQL("UPDATE sources SET metadata=? WHERE source_id=?", strMetadata, getID() );
            }
            if ( oCmds.hasName("links") && getSync().isContinueSync() )
                processSyncCommand("links", oCmds.getEntry("links") );
            if ( oCmds.hasName("delete") && getSync().isContinueSync() )
                processSyncCommand("delete", oCmds.getEntry("delete") );
            if ( oCmds.hasName("insert") && getSync().isContinueSync() )
                processSyncCommand("insert", oCmds.getEntry("insert") );

            PROF_STOP("Data");

	        PROF_START("DB");
            getDB().endTransaction();
            PROF_STOP("DB");

            getNotify().fireObjectsNotification();
        }
    }

	PROF_START("Data1");
    if ( getCurPageCount() > 0 )
        getNotify().fireSyncNotification(this, false, RhoAppAdapter.ERR_NONE, "");
	PROF_STOP("Data1");
}
Exemplo n.º 18
0
/*main fonction du programme*/
int main()
{
    char input = '\0';
    char flag = ' ';
    char erreur = '\0';
    /*erreur est une variable qui enregistre un code d'erreur sur la lecture ou l'execution d'une ligne
    '\0' -> pas d'erreur
    'i' -> lecture d'un caractere inconnu
    'c' -> lecture d'un charactere inattandu
    'm' -> erreur d'allocation mémoire
    'o' -> operateur non-attendu
    'd' -> digit inattendu
    'p' -> erreur de pile
    'u' -> variable non-définie
    'f' -> Erreur fatale
    */
    num* buffer = makeNumber();
    
    stack* stk = createStack();
    num* variables[26];
    if(buffer == NULL || stk == NULL || variables == NULL)
	erreur = 'f';
    int i;
    for(i = 0; i < 26; i++){
	variables[i] = NULL;
    }

    //boucle tant que l'utilisateur de quitte pas avec la commande ';' (ou ctrl-c)
    while (input != ';'){
        putchar('>');
        //boucle sur l'entrée
        while ((erreur == '\0') && ((input = getchar()) != '\n') && (input != ';') ){
            switch (identify(input)){
            case ' ':
		erreur = processToken(buffer,flag,stk);
		if((buffer = makeNumber()) == NULL)
		    erreur = 'm';
		break;
            case '=':
                //detection d'erreur syntaxique
                if (flag != ' '){
                    erreur = 'o';
                    break;
                }
                //code execution ...
                //printf("symbole =");
                //gestion du =
                break;
            case '+':

                //detection d'erreur syntaxique
                if (flag != ' '){
                    erreur = 'o';
                    break;
                }
                //code execution ...
                //printf("symbole +");
                //gestion du +
                break;
            case '-':
                //detection d'erreur syntaxique
                if (flag != ' '){
                    erreur = 'o';
                    break;
                }
                //code execution ...
                //printf("symbole -");
                //gestion du -
                break;
            case '*':
                //detection d'erreur syntaxique
                if (flag != ' '){
                    erreur = 'o';
                }
                //code execution ...
                //printf("symbole *");
                //gestion du *
                break;
	    case '.':
		if(flag != ' '){
		    erreur = 'o';
		}
		break;
	    case ':':
		if(flag != ' '){
		    erreur = 'o';
		}
		break;
            case 'c':
                //detection d'erreur syntaxique
                if ((flag != ' ') && (flag != '=')){
                    erreur = 'c';
                    break;
                }
                //code execution ...
                //printf("variable :\n");
                //putchar(input);
                //gestion d'un char
		if(flag == '='){
		    char next = getchar();
		    if(next != ' ' && next != '\n' ){
			//code d'erreur approprié
			switch(identify(next)){
			case 'c':
			    erreur = 'c';
			    break;
			case 'i':
			    erreur = 'd';
			    break;
			default:
			    erreur = 'o';
			    break;
			}
			break;
		    }
		    else {
			//assignation
			num* old_value = variables[(int) input - 'a'];
			if(old_value != NULL){
			    old_value->refs--;
			    killOrLetLive(old_value);
			}
			variables[(int) input - 'a'] = stk->top->number;
			stk->top->number->refs++;
		    }
		    input = next;
		}
		else if(flag == ' '){
		    if (variables[input - 'a'] != NULL){
			push(variables[input - 'a'], stk);
			variables[input - 'a']->refs++;
		    }
		    else {
			erreur = 'u';
		    }
		}
                break;
            case 'i':
                //detection d'erreur syntaxique
                if ((flag != ' ') && (flag != 'i')){
                    erreur = 'd';
                    break;
                }
                //code execution ...
                //printf("digit :\n");
                //putchar(input);
                //gestion d'un digit
		erreur = addDigitRight(buffer, (int) input - '0');
                break;
            case 'e':
                erreur = 'c';
            default:
                break;
            }

	    if(input == '\n')
		break;
            flag = identify(input);

        }//fin du while de lecture de ligne
	
        if (erreur != '\0')
            while (getchar() != '\n');//vide le input
	else
	    erreur = processToken(buffer,flag,stk);

	if((buffer = makeNumber()) == NULL)
	    erreur = 'm';

        switch(erreur){
        case 'i':
            printf("Erreur : caractere non reconnu");
            break;
        case 'c':
            printf("Erreur : catactere non-attendu");
            break;
        case 'm':
            printf("Erreur : Memoire");
            break;
        case 'o':
            printf("Erreur : operateur non-attendu");
            break;
        case 'd':
            printf("Erreur : digit non-attendu");
            break;
        case 'p':
            printf("Erreur de pile");
            break;
	case 'u':
	    printf("Erreur: variable non-définie.");
	    break;
	case 'n':
	    printf("Erreur: problème de construction d'un nombre.");
	case 'f':
	    printf("Erreur fatale: impossible de continuer. Veuillez Quitter.");
	    break;
        case '\0':
        default:
            break;
        }
	putchar('\n');
        if(erreur != 'f')
	    erreur = '\0';
	flag = ' ';
	printStack(stk);		
        putchar('\n');
        //Output result & error code
    }

    printf("done\n");

    return 0;

}
Exemplo n.º 19
0
void CSyncSource::processServerData(const char* szData)
{
    PROF_START("Parse");
    CJSONArrayIterator oJsonArr(szData);
    PROF_STOP("Parse");
    PROF_START("Data1");
    if ( !oJsonArr.isEnd() && oJsonArr.getCurItem().hasName("error") )
    {
        m_strError = oJsonArr.getCurItem().getString("error");
        m_nErrCode = RhoRuby.ERR_CUSTOMSYNCSERVER;
        getSync().stopSync();
        return;
    }

    if ( !oJsonArr.isEnd() )
    {
        setCurPageCount(oJsonArr.getCurItem().getInt("count"));
        oJsonArr.next();
    }
    int nVersion = 0;
    if ( !oJsonArr.isEnd() && oJsonArr.getCurItem().hasName("version") )
    {
        nVersion = oJsonArr.getCurItem().getInt("version");
        oJsonArr.next();
    }

    if ( nVersion != getSync().SYNC_VERSION() )
    {
        LOG(ERROR) + "Sync server send data with incompatible version. Client version: " + convertToStringA(getSync().SYNC_VERSION()) +
            "; Server response version: " + convertToStringA(nVersion) + ". Source name: " + getName();
        getSync().stopSync();
        m_nErrCode = RhoRuby.ERR_SYNCVERSION;
        return;
    }

    if ( !oJsonArr.isEnd() && oJsonArr.getCurItem().hasName("rt") )
    {
        setRefreshTime(oJsonArr.getCurItem().getInt("rt"));
        oJsonArr.next();
    }

    if ( !oJsonArr.isEnd() && oJsonArr.getCurItem().hasName("total_count") )
    {
        setTotalCount(oJsonArr.getCurItem().getInt("total_count"));
        oJsonArr.next();
    }
    //if ( getServerObjectsCount() == 0 )
    //    getNotify().fireSyncNotification(this, false, RhoRuby.ERR_NONE, "");

    if ( !oJsonArr.isEnd() )
    {
        processToken(oJsonArr.getCurItem().getUInt64("token"));
        oJsonArr.next();
    }else if ( getCurPageCount() == 0 )
    {
        //oo conflicts
        getDB().executeSQL("DELETE FROM changed_values where source_id=? and sent>=3", getID() );
        //
        processToken(0);
    }

	LOG(INFO) + "Got " + getCurPageCount() + "(Processed: " +  getServerObjectsCount() + ") records of " + getTotalCount() + " from server. Source: " + getName()
         + ". Version: " + nVersion;

    PROF_STOP("Data1");
    if ( !oJsonArr.isEnd() && getSync().isContinueSync() )
    {
        PROF_START("Data");
        //TODO: support DBExceptions
        getDB().startTransaction();

        int nSavedPos = oJsonArr.getCurPos();
        setSyncServerDataPass(edpNone);
        processServerData_Ver1(oJsonArr);

        setSyncServerDataPass(edpDeleteObjects);
        oJsonArr.reset(nSavedPos);
        processServerData_Ver1(oJsonArr);

	    PROF_STOP("Data");		    
    	PROF_START("DB");
        getDB().endTransaction();
	    PROF_STOP("DB");

        getNotify().fireObjectsNotification();
    }

	PROF_START("Data1");
    if ( getCurPageCount() > 0 )
        getNotify().fireSyncNotification(this, false, RhoRuby.ERR_NONE, "");
	PROF_STOP("Data1");
}
void CPBSAnalysis::processToken(TRSessionManager *sess, CTRAnalise*an, CTRToken *tk, CPBSSink* pbssink, std::map<short, int> &onts_doc, char * _textChunck, int offset) {
  if (!tk)
    return;
  if (tk->obtemTipo() & TK_CONTR_P1) {
    if (tk->obtemTokenLocucao())
      processSepToken(sess, tk, tk->obtemTokenLocucao(), pbssink, _textChunck, offset);

    // obtem o pr�ximo token da locu��o e trata
    processToken(sess, an, (CTRToken*)tk->obtemTokenLocucao(), pbssink, onts_doc, _textChunck, offset);
    return;
  }
  unsigned char doms[255], n_doms = 255, n_onts = 255;
  unsigned short onts[255];

  // Primeiro colocar a locu��o ou token
  char* token = (char *)alloca(tk->obtemLen() + 1);
  strncpy(token, _textChunck + tk->obtemPosInicial(), tk->obtemLen());
  token[tk->obtemLen()] = '\0';
  std::string word = token;
  pbssink->PutToken(word, tk->obtemLen(), tk->obtemPosInicial() + offset, getTokenKind(tk));
  OpenSemTag *tagloc = sess->obtemOSCData()->checkToken(tk);
  if (tagloc) {
    std::string name = tagloc->getName();
    std::string value = tagloc->getValue(an, tk);
    pbssink->PutFeature(name, value);
  }

  OpenSemTag *tag;
  if ((tag = sess->obtemOSCData()->getTagLemma()) != NULL && tag->checkToken(tk)) {
    std::string name = tag->getName();
    std::string value = tag->getValue(an, tk);
    pbssink->PutFeature(name, value);
  }

  if ((tag = sess->obtemOSCData()->getTagHead()) != NULL && tag->checkToken(tk)) {
    std::string name = tag->getName();
    std::string value = tag->getValue(an, tk);
    pbssink->PutFeature(name, value);
  }
  if ((tag = sess->obtemOSCData()->getTagMrcat()) != NULL && tag->checkToken(tk)) {
    std::string name = tag->getName();
    std::string value = tag->getValue(an, tk);
    pbssink->PutFeature(name, value);
  }
  if ((tag = sess->obtemOSCData()->getTagFullcat()) != NULL && tag->checkToken(tk)) {
    std::string name = tag->getName();
    std::string value = tag->getValue(an, tk);
    pbssink->PutFeature(name, value);
  }
  if (sess->obtemOSCData()->getTagOnt1() || sess->obtemOSCData()->getTagOnt1Raw()) {
    tk->obtemInfoOnt(an->obtemTRExec(), doms, n_doms, onts, NULL, n_onts);
    std::map<short, int>::iterator itr;
    for (int i = 0; i < n_onts; i++) {
      if ((itr = onts_doc.find(onts[i])) != onts_doc.end())
        itr->second++;
      else
        onts_doc.insert(std::pair<short, int>(onts[i], 1));
      char stont[200];
      if (sess->obtemOSCData()->getTagOnt1()) {
        unsigned char id_nivel1, id_nivel2, id_nivel3, id_nivel4;
        char* descs[4];
        CTROntDataNos* nos_ont = an->obtemTRData()->obtemTROntData()->obtemTROntDataNos();
        nos_ont->obtemNiveis(onts[i], id_nivel1, id_nivel2, id_nivel3, id_nivel4);
        nos_ont->obtemDescricoesNiveis(descs, id_nivel1, id_nivel2, id_nivel3, id_nivel4);

        sprintf(stont, "%d.%d.%d.%d - %s / %s / %s / %s", id_nivel1 + 1, id_nivel2 + 1, id_nivel3 + 1, id_nivel4 + 1, descs[0], descs[1], descs[2], descs[3]);

        std::string name = sess->obtemOSCData()->getTagOnt1()->getName();
        std::string value = stont;
        pbssink->PutFeature(name, value);
      }
      if (sess->obtemOSCData()->getTagOnt1Raw()) {
        unsigned char id_nivel1, id_nivel2, id_nivel3, id_nivel4;
        CTROntDataNos* nos_ont = an->obtemTRData()->obtemTROntData()->obtemTROntDataNos();
        nos_ont->obtemNiveis(onts[i], id_nivel1, id_nivel2, id_nivel3, id_nivel4);

        sprintf(stont, "%02d.%02d.%02d.%02d", id_nivel1 + 1, id_nivel2 + 1, id_nivel3 + 1, id_nivel4 + 1);

        std::string name = sess->obtemOSCData()->getTagOnt1Raw()->getName();
        std::string value = stont;
        pbssink->PutFeature(name, value);
      }
    }
  }
  std::string name = "pbt.endfeatures";
  std::string value = "";
  pbssink->PutFeature(name, value);
  if (tk->obtemTokenLocucao())
    processSepToken(sess, tk, tk->obtemTokenLocucao(), pbssink, _textChunck, offset);

  // obtem o pr�ximo token da locu��o e trata
  processToken(sess, an, (CTRToken*)tk->obtemTokenLocucao(), pbssink, onts_doc, _textChunck, offset);
}