void CParser::ParseCondition(int nTabs)
{	
	m_sProgress = m_sProgress + GetTabs(nTabs) 
		+ "ParseCondition\r\n";

	ETokenType tt = m_oToken.GetCurrentTokenType();
	if(tt == ttNumber)
		ParseNumber(nTabs+1);
	else if(tt == ttString)
		ParseString(nTabs+1);
	else if(tt == ttNames)
		ParseID(nTabs+1);

	CString sToken = m_oToken.GetCurrentToken();
	if(sToken != "Then")
	{
		//parse conditional operators i,e < > == != etc
		ParseConditionalOperator(nTabs+1);


		//parse number/string/id
		ETokenType tt = m_oToken.GetCurrentTokenType();
		if(tt == ttNumber)
			ParseNumber(nTabs+1);
		else if(tt == ttString)
			ParseString(nTabs+1);
		else if(tt == ttNames)
			ParseID(nTabs+1);
	}
}
void CParser::ParseStatementDim(int nTabs)
{
	//Dim Num As Integer
	CString sToken = m_oToken.GetCurrentToken();
	m_sProgress = m_sProgress + GetTabs(nTabs) 
		+ "ParseStatemenDim " + sToken + "\r\n";

	m_oToken.GetNextToken();
	ParseID(nTabs+1);	
	ParseAsKeyword(nTabs+1);
	ParseDataType(nTabs+1);
}
void CParser::ParseStatementAssignment(int nTabs)
{
	CString sToken = m_oToken.GetCurrentToken();
	m_sProgress = m_sProgress + GetTabs(nTabs) 
		+ "ParseStatementAssignment\r\n";
	

	ParseID(nTabs+1);

	ParseEqualSign(nTabs+1);

	ParseExpression(nTabs+1);
}
void CParser::ParseArgument()
{
	int nTabs = 6;
	m_sProgress = m_sProgress + GetTabs(nTabs) + 
		"ParseArgument\r\n";	

	ParseArgumentScope();	

	ParseID(nTabs+1);

	// parse As keyword
	ParseAsKeyword(nTabs+1);	

	ParseDataType(nTabs+1);
}
void CParser::ParseExpressionFactor(int nTabs)
{
	CString sToken = m_oToken.GetCurrentToken();
	ETokenType tt = m_oToken.GetCurrentTokenType();
	m_sProgress = m_sProgress + GetTabs(nTabs) 
		+ "ParseExpressionFactor " + sToken + "\r\n";
	
	if(IsID() == true)
		ParseID(nTabs+1);
	else if(tt == ttNumber)	
		ParseNumber(nTabs+1);	
	else if(tt == ttFunctionStartBracket)
	{
		m_sProgress = m_sProgress + GetTabs(nTabs+1) 
		+ "ParseStartBarcket " + sToken + "\r\n";

		m_oToken.GetNextToken();

		ParseExpression(nTabs+1);

		sToken = m_oToken.GetCurrentToken();

		m_sProgress = m_sProgress + GetTabs(nTabs+1) 
		+ "ParseEndBarcket " + sToken + "\r\n";

		if(sToken != ")")
			m_sProgress = m_sProgress + GetTabs(nTabs+1) 
				+ GetErrorString();

		m_oToken.GetNextToken();
	}	
	//else if(tt == ttFunctionEndBracket)
	//{
		//m_oToken.GetNextToken();
		//return;
	//}
	else
	{
		m_sProgress = m_sProgress + GetTabs(nTabs+1) 
			+ GetErrorString();

		m_oToken.GetNextToken();
	}
}
//CString CParser::ParseProcedureHead()
void CParser::ParseProcedureHead()
{
	m_sProgress = m_sProgress + GetTabs(4) 
		+ "ParseProcedureHead\r\n";
	//CString sRetVal,sRetVal2="true";

	//sRetVal = ParseProcedureScope();
	ParseProcedureScope();

	ParseProcedureStatic();

	ParseProcedureType(5);

	ParseID(5);

	ParseProcedureStartBracket();	

	ParseArgumentList();

	ParseProcedureEndBracket();	
	
	ParseProcedureReturn();

} // ParseProcedureHead()
Esempio n. 7
0
CCompoundID CCompoundIDDumpParser::ParseID()
{
    SkipSpace();
    x_SaveErrPos();

    if (x_EOF() || !isalpha(*m_Ch)) {
        CID_PARSER_EXCEPTION("missing compound ID class name");
    }

    const char* token_begin = m_Ch;

    do
        ++m_Ch;
    while (!x_EOF() && isalpha(*m_Ch));

    CTempString new_id_class_name(token_begin, m_Ch - token_begin);

    ECompoundIDClass new_id_class = eCIC_NumberOfClasses;

    switch (*token_begin) {
    case 'C':
        if (new_id_class_name == CIC_GENERICID_CLASS_NAME)
            new_id_class = eCIC_GenericID;
        break;
    case 'N':
        if (new_id_class_name == CIC_NETCACHEBLOBKEY_CLASS_NAME)
            new_id_class = eCIC_NetCacheBlobKey;
        else if (new_id_class_name == CIC_NETSCHEDULEJOBKEY_CLASS_NAME)
            new_id_class = eCIC_NetScheduleJobKey;
        else if (new_id_class_name == CIC_NETSTORAGEOBJECTLOC_CLASS_NAME)
            new_id_class = eCIC_NetStorageObjectLoc;
        else if (new_id_class_name == CIC_NETSTORAGEOBJECTLOC_CLASS_NAME_V1)
            new_id_class = eCIC_NetStorageObjectLocV1;
    }

    if (new_id_class == eCIC_NumberOfClasses) {
        CID_PARSER_EXCEPTION("unknown compound ID class '" <<
                new_id_class_name << '\'');
    }

    SkipSpace();

    if (x_EOF() || *m_Ch != '{') {
        x_SaveErrPos();
        CID_PARSER_EXCEPTION("missing '{'");
    }

    ++m_Ch;

    SkipSpaceToNextToken();

    CCompoundID result(m_Pool.NewID(new_id_class));

    if (*m_Ch != '}')
        for (;;) {
            token_begin = m_Ch;
            x_SaveErrPos();

            do
                ++m_Ch;
            while (isalnum(*m_Ch) || *m_Ch == '_');

            CTempString field_type_name(token_begin, m_Ch - token_begin);

            ECompoundIDFieldType field_type = eCIT_NumberOfTypes;

            switch (*token_begin) {
            case '}':
                CID_PARSER_EXCEPTION("a field type name is required");
            case 'b':
                if (field_type_name == CIT_BOOLEAN_TYPE_NAME)
                    field_type = eCIT_Boolean;
                break;
            case 'd':
                if (field_type_name == CIT_DATABASE_NAME_TYPE_NAME)
                    field_type = eCIT_DatabaseName;
                break;
            case 'f':
                if (field_type_name == CIT_FLAGS_TYPE_NAME)
                    field_type = eCIT_Flags;
                break;
            case 'h':
                if (field_type_name == CIT_HOST_TYPE_NAME)
                    field_type = eCIT_Host;
                break;
            case 'i':
                if (field_type_name == CIT_ID_TYPE_NAME)
                    field_type = eCIT_ID;
                else if (field_type_name == CIT_INTEGER_TYPE_NAME)
                    field_type = eCIT_Integer;
                else if (field_type_name == CIT_IPV4_ADDRESS_TYPE_NAME)
                    field_type = eCIT_IPv4Address;
                else if (field_type_name == CIT_IPV4_SOCK_ADDR_TYPE_NAME)
                    field_type = eCIT_IPv4SockAddr;
                break;
            case 'n':
                if (field_type_name == CIT_NESTED_CID_TYPE_NAME)
                    field_type = eCIT_NestedCID;
                else if (field_type_name == CIT_CUE_TYPE_NAME)
                    field_type = eCIT_Cue;
                break;
            case 'p':
                if (field_type_name == CIT_OBJECTREF_TYPE_NAME)
                    field_type = eCIT_ObjectRef;
                else if (field_type_name == CIT_PORT_TYPE_NAME)
                    field_type = eCIT_Port;
                break;
            case 'r':
                if (field_type_name == CIT_RANDOM_TYPE_NAME)
                    field_type = eCIT_Random;
                break;
            case 's':
                if (field_type_name == CIT_SEQ_ID_TYPE_NAME)
                    field_type = eCIT_SeqID;
                else if (field_type_name == CIT_SERVICE_NAME_TYPE_NAME)
                    field_type = eCIT_ServiceName;
                else if (field_type_name == CIT_STRING_TYPE_NAME)
                    field_type = eCIT_String;
                break;
            case 't':
                if (field_type_name == CIT_LABEL_TYPE_NAME)
                    field_type = eCIT_Label;
                else if (field_type_name == CIT_TAX_ID_TYPE_NAME)
                    field_type = eCIT_TaxID;
                else if (field_type_name == CIT_TIMESTAMP_TYPE_NAME)
                    field_type = eCIT_Timestamp;
            }

            if (field_type == eCIT_NumberOfTypes) {
                CID_PARSER_EXCEPTION("unknown field type '" <<
                        field_type_name << '\'');
            }

            SkipSpaceToNextToken();

            switch (field_type) {
            case eCIT_ID:
                result.AppendID(x_ReadUint8());
                break;
            case eCIT_Integer:
                result.AppendInteger(x_ReadInt8());
                break;
            case eCIT_ServiceName:
                result.AppendServiceName(x_ReadString());
                break;
            case eCIT_DatabaseName:
                result.AppendDatabaseName(x_ReadString());
                break;
            case eCIT_Timestamp:
                result.AppendTimestamp(x_ReadInt8());
                break;
            case eCIT_Random:
                {
                    x_SaveErrPos();
                    Uint8 random_number = x_ReadUint8();
                    if (random_number >= ((Uint8) 1) << 8 * sizeof(Uint4)) {
                        CID_PARSER_EXCEPTION(
                                "random number exceeds maximum allowed value");
                    }
                    result.AppendRandom((Uint4) random_number);
                }
                break;
            case eCIT_IPv4Address:
                result.AppendIPv4Address(x_ReadIPv4Address());
                break;
            case eCIT_Host:
                result.AppendHost(x_ReadString());
                break;
            case eCIT_Port:
                result.AppendPort(x_ReadPortNumber());
                break;
            case eCIT_IPv4SockAddr:
                {
                    Uint4 ipv4_address = x_ReadIPv4Address();
                    if (x_EOF() || *m_Ch != ':') {
                        x_SaveErrPos();
                        CID_PARSER_EXCEPTION("missing ':'");
                    }
                    ++m_Ch;
                    result.AppendIPv4SockAddr(ipv4_address, x_ReadPortNumber());
                }
                break;
            case eCIT_ObjectRef:
                result.AppendObjectRef(x_ReadString());
                break;
            case eCIT_String:
                result.AppendString(x_ReadString());
                break;
            case eCIT_Boolean:
                {
                    token_begin = m_Ch;
                    x_SaveErrPos();

                    while (!x_EOF() && isalpha(*m_Ch))
                        ++m_Ch;

                    CTempString bool_val(token_begin, m_Ch - token_begin);

                    if (bool_val == "false")
                        result.AppendBoolean(false);
                    else if (bool_val == "true")
                        result.AppendBoolean(true);
                    else {
                        CID_PARSER_EXCEPTION("invalid boolean value \"" <<
                                bool_val << '\"');
                    }
                }
                break;
            case eCIT_Flags:
                result.AppendFlags(x_ReadUint8());
                break;
            case eCIT_Label:
                result.AppendLabel(x_ReadString());
                break;
            case eCIT_Cue:
                result.AppendCue(x_ReadUint8());
                break;
            case eCIT_SeqID:
                result.AppendSeqID(x_ReadString());
                break;
            case eCIT_TaxID:
                result.AppendTaxID(x_ReadUint8());
                break;
            case eCIT_NestedCID:
                result.AppendNestedCID(ParseID());
                break;
            case eCIT_NumberOfTypes:
                break;
            }

            SkipSpaceToNextToken();

            if (*m_Ch == ',')
                ++m_Ch;
            else if (*m_Ch == '}')
                break;
            else {
                x_SaveErrPos();
                CID_PARSER_EXCEPTION("either ',' or '}' expected");
            }

            SkipSpaceToNextToken();
        }
    ++m_Ch;
    return result;
}
Esempio n. 8
0
static BOOL
HandleToolTypes( UBYTE**             tool_types, 
                 struct ISAPNP_Card* card,
                 struct ISAPNPBase*  res )
{
  while( *tool_types )
  {
    if( Strnicmp( *tool_types, "DISABLE_CARD=", 13 ) == 0 )
    {
      LONG manufacturer;
      WORD product;
      BYTE revision;
      LONG serial;

      if( ParseID( *tool_types + 13, 
                   &manufacturer, &product, &revision, &serial ) )
      {
        struct ISAPNP_Card* card = NULL;

        while( ( card = ISAPNP_FindCard( card,
                                         manufacturer,
                                         product,
                                         revision,
                                         serial,
                                         res ) ) != NULL )
        {
          card->isapnpc_Disabled = TRUE;
        }
      }
      else
      {
        Req( "Illegal tool type: %s\n", (ULONG) *tool_types );
        return FALSE;
      }
    }
    else if( Strnicmp( *tool_types, "DISABLE_DEVICE=", 15 ) == 0 )
    {
      LONG manufacturer;
      WORD product;
      BYTE revision;

      if( ParseID( *tool_types + 15, 
                   &manufacturer, &product, &revision, NULL ) )
      {
        struct ISAPNP_Device* dev = NULL;

        while( ( dev = ISAPNP_FindDevice( dev,
                                          manufacturer,
                                          product,
                                          revision,
                                          res ) ) != NULL )
        {
          dev->isapnpd_Disabled = TRUE;
        }
      }
      else
      {
        Req( "Illegal tool type value: %s\n", (ULONG) *tool_types );
        return FALSE;
      }
    }
    else if( Strnicmp( *tool_types, "LEGACY_DEVICE=", 14 ) == 0 )
    {
      UBYTE* str;
      int    conv;
      LONG   manufacturer;
      WORD   product;
      BYTE   revision;
      UWORD  dev_num = 0;

      str  = *tool_types + 14;
      conv = ParseID( str,  &manufacturer, &product, &revision, NULL );

      str += conv;

      if( conv != 0 )
      {
        struct ISAPNP_Device*     dev;
        struct ISAPNP_Identifier* id;

        dev = ISAPNP_AllocDevice( res );

        if( dev == NULL )
        {
          Req( "Out of memory!" );
          return FALSE;
        }

        dev->isapnpd_Card = card;
        
        id  = AllocVec( sizeof( *id ), MEMF_PUBLIC | MEMF_CLEAR );
        
        if( id == NULL )
        {
          Req( "Out of memory!" );
          ISAPNP_FreeDevice( dev, res );
          return FALSE;
        }

        id->isapnpid_Vendor[ 0 ]  = ( manufacturer >> 24 ) & 0xff;
        id->isapnpid_Vendor[ 1 ]  = ( manufacturer >> 16 ) & 0xff;
        id->isapnpid_Vendor[ 2 ]  = ( manufacturer >>  8 ) & 0xff;
        id->isapnpid_Vendor[ 3 ]  = 0;

        id->isapnpid_ProductID    = product;
        id->isapnpid_Revision     = revision;
        
        AddTail( (struct List*) &dev->isapnpd_IDs, (struct Node*) id );
        
        if( card->isapnpc_Devices.lh_Head->ln_Succ != NULL )
        {
          dev_num = ( (struct ISAPNP_Device*) 
                      card->isapnpc_Devices.lh_TailPred )->isapnpd_DeviceNumber;
          ++dev_num;
        }
        
        dev->isapnpd_DeviceNumber = dev_num;

        AddTail( &card->isapnpc_Devices, (struct Node*) dev );
        
        while( *str != 0 )
        {
          if( *str != ' ' )
          {
            if( Strnicmp( str, "IRQ=", 4 ) == 0 )
            {
              int irq;
            
              irq = strtol( str + 4, (char**) &str, 0 );
            
              if( irq <= 0 || irq >= 16 )
              {
                Req( "Invalid IRQ value '%ld' in tooltype line\n"
                     "'%s'",
                     irq,
                     (ULONG) *tool_types );
                return FALSE;
              }
              else
              {
                struct ISAPNP_IRQResource* r;
        
                r = (struct ISAPNP_IRQResource*) 
                    ISAPNP_AllocResource( ISAPNP_NT_IRQ_RESOURCE, res );
            
                if( r == NULL )
                {
                  Req( "Out of memory!" );
                  return FALSE;
                }

                r->isapnpirqr_IRQMask = 1 << irq;
                r->isapnpirqr_IRQType = ISAPNP_IRQRESOURCE_ITF_HIGH_EDGE;
          
                AddTail( (struct List*) &dev->isapnpd_Options->isapnprg_Resources,
                         (struct Node*) r );
              }
            }
            else if( Strnicmp( str, "DMA=", 4 ) == 0 )
            {
              int dma;
            
              dma = strtol( str + 4, (char**) &str, 0 );
            
              if( dma <= 0 || dma >= 8 )
              {
                Req( "Invalid DMA value '%ld' in tooltype line\n"
                     "'%s'",
                     dma,
                     (ULONG) *tool_types );
                return FALSE;
              }
              else
              {
                struct ISAPNP_DMAResource* r;
        
                r = (struct ISAPNP_DMAResource*) 
                    ISAPNP_AllocResource( ISAPNP_NT_DMA_RESOURCE, res );
            
                if( r == NULL )
                {
                  Req( "Out of memory!" );
                  return FALSE;
                }

                r->isapnpdmar_ChannelMask = 1 << dma;
                r->isapnpdmar_Flags       = 0;
          
                AddTail( (struct List*) &dev->isapnpd_Options->isapnprg_Resources,
                         (struct Node*) r );
              }
            }
            else if( Strnicmp( str, "IO=", 3 ) == 0 )
            {
              int base;
              int length;

              struct ISAPNP_IOResource* r;
            
              base = strtol( str + 3, (char**) &str, 0 );

              if( *str != '/' )
              {
                Req( "Length missing from IO value in tooltype line\n"
                     "'%s'",
                     (ULONG) *tool_types );
                return FALSE;
              }

              ++str;

              length = strtol( str, (char**) &str, 0 );

              if( base <= 0 || base >= 0xffff )
              {
                Req( "Invalid IO base value '%ld' in tooltype line\n"
                     "'%s'",
                     base,
                     (ULONG) *tool_types );
                return FALSE;
              }

              if( length <= 0 || length >= 0xffff )
              {
                Req( "Invalid IO length value '%ld' in tooltype line\n"
                     "'%s'",
                     length,
                     (ULONG) *tool_types );
                return FALSE;
              }

              r = (struct ISAPNP_IOResource*) 
                  ISAPNP_AllocResource( ISAPNP_NT_IO_RESOURCE, res );
            
              if( r == NULL )
              {
                Req( "Out of memory!" );
                return FALSE;
              }

              r->isapnpior_MinBase   = base;
              r->isapnpior_MaxBase   = base;
              r->isapnpior_Length    = length;
              r->isapnpior_Alignment = 1;
          
              AddTail( (struct List*) &dev->isapnpd_Options->isapnprg_Resources,
                       (struct Node*) r );
            }
            else
            {
              Req( "Parse error near '%s'\n"
                   "in tooltype line\n"
                   "'%s'",
                   (ULONG) str,
                   (ULONG) *tool_types );
              return FALSE;
            }
          }
          
          if( *str )
          {
            ++str;
          }
        }
      }
      else
      {
        Req( "Illegal tool type: '%s'\n", (ULONG) *tool_types );
        return FALSE;
      }
    }