Example #1
0
bool FScanner::CheckValue(bool allowfloat) 
{ 
	auto savedstate = SavePos();
	bool res = ScanValue(allowfloat);
	if (!res) RestorePos(savedstate);
	return res;
}
Example #2
0
void ParseConfig(FILE* Handle) {
    condType CondType;
    char CondVar[MAX_NAME], CondValue[MAX_NAME];
    char Token[MAX_NAME];
    while(!feof(Handle)) {
        fscanf(Handle, "%s", Token);
        if(feof(Handle)) return;
        CondType=condNULL;
        CondVar[0]='\0';
        CondValue[0]='\0';
        if(!strcmp(Token, "Remember")) {
            fscanf(Handle, "%s", Token);
            strcpy(RememberedVars.Elements[RememberedVars.Count++].Name, Token);
        } else {
            if(!strcmp(Token, "If")) {
                fscanf(Handle, "%s", Token);
                if(!strcmp(Token, "Eq")) {
                    fscanf(Handle, "%s", CondVar);
                    ScanValue(Handle, CondValue);
                    fscanf(Handle, "%s", Token);
                    CondType=condEQUAL;
                } else if(!strcmp(Token, "NotEq")) {
                    fscanf(Handle, "%s", CondVar);
                    ScanValue(Handle, CondValue);
                    fscanf(Handle, "%s", Token);
                    CondType=condDIFFERENT;
                } else if(Token[0]=='!') {
                    strcpy(CondVar, &Token[1]);
                    fscanf(Handle, "%s", Token);
                    CondType=condFALSE;
                } else {
                    strcpy(CondVar, Token);
                    fscanf(Handle, "%s", Token);
                    CondType=condTRUE;
                }
            }
            if(!strcmp(Token, "Ignore")) {
                fscanf(Handle, "%s", Token);
                AddCondition(CondType, CondVar, CondValue, Token);
            } else {
                fprintf(stderr, "Wrong command '%s'\n", Token);
                exit(1);
            }
        }
    }
}
Example #3
0
//-----------------------------------------------------------------
static HRESULT ScanAttribute( const CH * pchStart, const CH * pchEnd, HATT * pAtt)
{
    if(pchStart == NULL)
        return E_INVALIDARG;

    const CH * pch;
    int        cch;
    const CH * pchScan  = pchStart;
    HRESULT hr;

    if (pAtt) memset(pAtt, 0, sizeof(HATT));

    SKIPWHITE_FAIL

    switch (*pchScan)
    {
    case _CH('>'): return S_FALSE; // end of tag -- no attribute

    case _CH('/'):
        // End of empty element (e.g. "<foo ... />").  No more attributes.
        return S_FALSE;

    case _CH('-'): // comment
        if (pAtt)
            return ScanComment(pchScan, pchEnd, &pAtt->pchValue, &pAtt->cchValue);
        else
            return ScanComment(pchScan, pchEnd, 0, 0);
        break;
    }

    // scan Name
    hr = ScanName(pchScan, pchEnd, &pch, &cch);
    if (FAILED(hr)) return hr;
    if (pAtt)
    {
        pAtt->pchName = pch;
        pAtt->cchName = cch;
    }
    pchScan = pch + cch;    
    SKIPWHITE_FAIL

    if (*pchScan != _CH('=')) 
        return hr; 
    pchScan++;
    
    SKIPWHITE_FAIL

    hr = ScanValue(pchScan, pchEnd, &pch, &cch);
    if (SUCCEEDED(hr) && pAtt)
    {
        pAtt->pchValue = pch;
        pAtt->cchValue = cch;
    }
    return hr;
}
Example #4
0
void ParseFrame(FILE* Handle, frame* Frame) {
    char Token[MAX_NAME];
    char VarName[MAX_NAME];
    char VarValue[MAX_NAME];
    do fscanf(Handle, "%s", Token);
    while(!feof(Handle) && strcmp(Token, "Frame"));
    if(feof(Handle)) exit(1);
    fscanf(Handle, "%ld", &(Frame->Number));
    fscanf(Handle, "%s", Token);
    if(strcmp(Token, "Begin")) fprintf(stderr, "No 'Begin' at frame %ld\n", Frame->Number);
    fscanf(Handle, "%s", Token);
    Frame->Vars.Count=0;
    while(strcmp(Token, "End") && !feof(Handle)) {
        int i;
        strcpy(VarName, Token);
        ScanValue(Handle, VarValue);
        AddVariable(Frame, VarName, VarValue);
        fscanf(Handle, "%s", Token);
    }
}
Example #5
0
void Scanner::ScanNextToken() {
  if (m_endedStream) {
    return;
  }

  if (!m_startedStream) {
    return StartStream();
  }

  // get rid of whitespace, etc. (in between tokens it should be irrelevent)
  ScanToNextToken();

  // maybe need to end some blocks
  PopIndentToHere();

  // *****
  // And now branch based on the next few characters!
  // *****

  // end of stream
  if (!INPUT) {
    return EndStream();
  }

  if (INPUT.column() == 0 && INPUT.peek() == Keys::Directive) {
    return ScanDirective();
  }

  // document token
  if (INPUT.column() == 0 && Exp::DocStart().Matches(INPUT)) {
    return ScanDocStart();
  }

  if (INPUT.column() == 0 && Exp::DocEnd().Matches(INPUT)) {
    return ScanDocEnd();
  }

  // flow start/end/entry
  if (INPUT.peek() == Keys::FlowSeqStart ||
      INPUT.peek() == Keys::FlowMapStart) {
    return ScanFlowStart();
  }

  if (INPUT.peek() == Keys::FlowSeqEnd || INPUT.peek() == Keys::FlowMapEnd) {
    return ScanFlowEnd();
  }

  if (INPUT.peek() == Keys::FlowEntry) {
    return ScanFlowEntry();
  }

  // block/map stuff
  if (Exp::BlockEntry().Matches(INPUT)) {
    return ScanBlockEntry();
  }

  if ((InBlockContext() ? Exp::Key() : Exp::KeyInFlow()).Matches(INPUT)) {
    return ScanKey();
  }

  if (GetValueRegex().Matches(INPUT)) {
    return ScanValue();
  }

  // alias/anchor
  if (INPUT.peek() == Keys::Alias || INPUT.peek() == Keys::Anchor) {
    return ScanAnchorOrAlias();
  }

  // tag
  if (INPUT.peek() == Keys::Tag) {
    return ScanTag();
  }

  // special scalars
  if (InBlockContext() && (INPUT.peek() == Keys::LiteralScalar ||
                           INPUT.peek() == Keys::FoldedScalar)) {
    return ScanBlockScalar();
  }

  if (INPUT.peek() == '\'' || INPUT.peek() == '\"') {
    return ScanQuotedScalar();
  }

  // plain scalars
  if ((InBlockContext() ? Exp::PlainScalar() : Exp::PlainScalarInFlow())
          .Matches(INPUT)) {
    return ScanPlainScalar();
  }

  // don't know what it is!
  throw ParserException(INPUT.mark(), ErrorMsg::UNKNOWN_TOKEN);
}
Example #6
0
File: bobheap.c Project: dbetz/bob
/* BobCollectGarbage - garbage collect a heap */
void BobCollectGarbage(BobInterpreter *c)
{
    BobProtectedPtrs *ppb;
    unsigned char *scan;
    BobMemorySpace *ms;
    BobDispatch *d;
    BobValue obj;

	BobStreamPutS("[GC",c->standardError);

    /* reverse the memory spaces */
    ms = c->oldSpace;
    c->oldSpace = c->newSpace;
    c->newSpace = ms;
    ms->free = ms->base;
    
    /* copy the root objects */
    c->nilValue = BobCopyValue(c,c->nilValue);
    c->trueValue = BobCopyValue(c,c->trueValue);
    c->falseValue = BobCopyValue(c,c->falseValue);
    c->symbols = BobCopyValue(c,c->symbols);
    c->objectValue = BobCopyValue(c,c->objectValue);

    /* copy basic types */
    c->methodObject = BobCopyValue(c,c->methodObject);
    c->vectorObject = BobCopyValue(c,c->vectorObject);
    c->symbolObject = BobCopyValue(c,c->symbolObject);
    c->stringObject = BobCopyValue(c,c->stringObject);
    c->integerObject = BobCopyValue(c,c->integerObject);
#ifdef BOB_INCLUDE_FLOAT_SUPPORT
    c->floatObject = BobCopyValue(c,c->floatObject);
#endif

    /* copy the type list */
    for (d = c->types; d != NULL; d = d->next) {
        if (d->object)
            d->object = BobCopyValue(c,d->object);
    }

    /* copy protected pointers */
    for (ppb = c->protectedPtrs; ppb != NULL; ppb = ppb->next) {
        BobValue **pp = ppb->pointers;
        int count = ppb->count;
        for (; --count >= 0; ++pp)
            **pp = BobCopyValue(c,**pp);
    }
    
    /* copy the stack */
    BobCopyStack(c);
        
    /* copy the current code object */
    if (c->code)
        c->code = BobCopyValue(c,c->code);
    
    /* copy the registers */
    c->val = BobCopyValue(c,c->val);
    c->env = BobCopyValue(c,c->env);
        
    /* copy any user objects */
    if (c->protectHandler)
        (*c->protectHandler)(c,c->protectData);

    /* scan and copy until all accessible objects have been copied */
    scan = c->newSpace->base;
	while (scan < c->newSpace->free) {
        obj = (BobValue)scan;
#if 0
        BobStreamPutS("Scanning ",c->standardOutput);
        BobPrint(c,obj,c->standardOutput);
        BobStreamPutC('\n',c->standardOutput);
#endif
        scan += ValueSize(obj);
        ScanValue(c,obj);
    }
    
    /* fixup cbase and pc */
    if (c->code) {
        long pcoff = c->pc - c->cbase;
        c->cbase = BobStringAddress(BobCompiledCodeBytecodes(c->code));
        c->pc = c->cbase + pcoff;
    }
    
    /* count the garbage collections */
    ++c->gcCount;

    {
		char buf[128];
		sprintf(buf,
				" - %lu bytes free out of %lu, collections %lu]\n",
				(unsigned long)(c->newSpace->top - c->newSpace->free),
				(unsigned long)(c->newSpace->top - c->newSpace->base),
				(unsigned long)c->gcCount);
		BobStreamPutS(buf,c->standardError);
	}
      
    /* destroy any unreachable cobjects */
    BobDestroyUnreachableCObjects(c);
}
Example #7
0
//-----------------------------------------------------------------
static void ScanItem (const CH * pchStart, const CH * pchEnd, HTOK * pk)
{
    if(pchStart == NULL || pk == NULL)
    {
        VSASSERT(false,"");
        return;
    }
    
    HRESULT hr;

    pk->id     = hi_Unknown;
    pk->pch    = (CH*)pchStart;
    pk->cch    = 0;
    pk->bEnd   = false;

    if (pchStart >= pchEnd)
    {
        pk->id = hi_Eof;
        return;
    }
    const CH * pchScan = pchStart;
    
    switch (*pchScan)
    {
//  case _CH(0):
//      pk->id = hi_Eof;
//      break;
//
//  case _CH('\n'):
//  case _CH('\r'):
//      pchScan = AdvanceLineBreak((CH*)pchScan);
//      pk->id = hi_Eol;
//      break;
    
    case _CH('<'):
        {
            const CH * pchName;
            int cch;
            
            pchScan++;          
            pk->id = hi_Error;
            switch (*pchScan)
            {
            case _CH('!'):
                pk->id = hi_Error;
                pchScan++;
                while (_CH('>') != *pchScan)
                {
                    const CH * pch;
                    int        cch;

                    SKIPWHITE_RET

                    if (IsAAlpha(*pchScan))
                        hr = ScanName(pchScan, pchEnd, &pch, &cch);
                    else
                    {
                        switch(*pchScan)
                        {
                        case CH('\''):
                        case CH('"'):
                            hr = ScanValue(pchScan, pchEnd, &pch, &cch);
                            break;

                        case CH('-'):
                            hr = ScanComment(pchScan, pchEnd, &pch, &cch);
                            break;
                        
                        default:
                            hr = S_OK;
                            pch = pchScan;
                            cch = 1;
                            break;
                        }
                    }

                    pchScan = pch + cch;
                    if (FAILED(hr) || (pchScan >= pchEnd))
                        return;
                }
                pk->id = hi_TagSpecial;
                break;

            case _CH('%'):  // ASP 'tag'
                pk->id = hi_TagSpecial;
                do {
                    do {
                        pchScan++;
                    } while ((pchScan < pchEnd) && (_CH('>') != *pchScan));
                } while ((pchScan < pchEnd) &&  (*(pchScan-1) != _CH('%')));
                break;

            case _CH('/'):
                pk->bEnd = true;
                pchScan++;
                break;

            case _CH('?'):  //
                pk->id = hi_TagSpecial;
                pchScan++;
                while ((pchScan < pchEnd) && (_CH('>') != *pchScan))
                    pchScan++;
                break;

            }
            if (pk->id != hi_TagSpecial)
            {
                pk->id = hi_Error;
                SKIPWHITE_RET
                if (!IsAAlpha(*pchScan))
                    return;
                pchName = pchScan;
                while ((pchScan < pchEnd) && IsAAlNum(*pchScan))
                    pchScan++;
                if (pchScan >= pchEnd)
                    return;
                cch = (int)(pchScan - pchName);
                if (cch <= cchMaxTag && cch > 0)
                {
                    CH * pszName = (CH*)_alloca((cch+1)*CBCH );
                    strcchcopy(pszName, cch+1, pchName);
                    pk->id = LookupElement(pszName);
                }
                else
                    return;
                if (!pk->bEnd)
                {
                    // scan attributes and comments
                    for(;;)
                    {
                        HATT    hatt;
                        HRESULT hr = ScanAttribute(pchScan, pchEnd, &hatt);
                        if (FAILED(hr))
                        {
                            pk->id = hi_Error;
                            return;
                        }
                        if (S_FALSE == hr)
                            break;
                        pchScan = hatt.pchValue ? hatt.pchValue + hatt.cchValue : hatt.pchName + hatt.cchName;
                    }
                }
            }
            // Skip over whitespace and, if this is an empty element, the closing '/' (e.g. "<foo ... />")
            while ((pchScan < pchEnd) && ((*pchScan <= 32) || (*pchScan == _CH('/'))))
                pchScan++;
            if ((pchScan >= pchEnd) || (_CH('>') != *pchScan))
                pk->id = hi_Error;
            pchScan++;
        }
        break;

//  case _CH('&'):
//      pk->id = hi_Entity;
//      if (!ScanEntity(pchScan, &pk->ch, &pchScan))
//          goto L_Text;
//      break;
    
    default:
//L_Text:
        pk->id = hi_Text;
        for (bool f = true; f && (pchScan < pchEnd); )
        {
            switch (*pchScan)
            {
//          case _CH(0):
//          case _CH('\n'):
//          case _CH('\r'):
//          case _CH('&'):
            case _CH('<'):
                f = false;
                break;
            default:
                pchScan++;
                break;
            }
        }
        break;
    }
Example #8
0
void FScanner::MustGetValue(bool allowfloat)
{
	if (!ScanValue(allowfloat)) ScriptError(allowfloat ? "Numeric constant expected" : "Integer constant expected");
}
Example #9
0
	// ScanNextToken
	// . The main scanning function; here we branch out and
	//   scan whatever the next token should be.
	void Scanner::ScanNextToken()
	{
		if(m_endedStream)
			return;

		if(!m_startedStream)
			return StartStream();

		// get rid of whitespace, etc. (in between tokens it should be irrelevent)
		ScanToNextToken();

		// check the latest simple key
		VerifySimpleKey();

		// maybe need to end some blocks
		PopIndentTo(INPUT.column);

		// *****
		// And now branch based on the next few characters!
		// *****

		// end of stream
		if(INPUT.peek() == EOF)
			return EndStream();

		if(INPUT.column == 0 && INPUT.peek() == Keys::Directive)
			return ScanDirective();

		// document token
		if(INPUT.column == 0 && Exp::DocStart.Matches(INPUT))
			return ScanDocStart();

		if(INPUT.column == 0 && Exp::DocEnd.Matches(INPUT))
			return ScanDocEnd();

		// flow start/end/entry
		if(INPUT.peek() == Keys::FlowSeqStart || INPUT.peek() == Keys::FlowMapStart)
			return ScanFlowStart();

		if(INPUT.peek() == Keys::FlowSeqEnd || INPUT.peek() == Keys::FlowMapEnd)
			return ScanFlowEnd();
	
		if(INPUT.peek() == Keys::FlowEntry)
			return ScanFlowEntry();

		// block/map stuff
		if(Exp::BlockEntry.Matches(INPUT))
			return ScanBlockEntry();

		if((m_flowLevel == 0 ? Exp::Key : Exp::KeyInFlow).Matches(INPUT))
			return ScanKey();

		if((m_flowLevel == 0 ? Exp::Value : Exp::ValueInFlow).Matches(INPUT))
			return ScanValue();

		// alias/anchor
		if(INPUT.peek() == Keys::Alias || INPUT.peek() == Keys::Anchor)
			return ScanAnchorOrAlias();

		// tag
		if(INPUT.peek() == Keys::Tag)
			return ScanTag();

		// special scalars
		if(m_flowLevel == 0 && (INPUT.peek() == Keys::LiteralScalar || INPUT.peek() == Keys::FoldedScalar))
			return ScanBlockScalar();

		if(INPUT.peek() == '\'' || INPUT.peek() == '\"')
			return ScanQuotedScalar();

		// plain scalars
		if((m_flowLevel == 0 ? Exp::PlainScalar : Exp::PlainScalarInFlow).Matches(INPUT))
			return ScanPlainScalar();

		// don't know what it is!
		throw ParserException(INPUT.line, INPUT.column, ErrorMsg::UNKNOWN_TOKEN);
	}