All pastes #260032 Raw Edit

Stuff

public text v1 · immutable
#260032 ·published 2006-11-27 23:09 UTC
rendered paste body
Private Function ParseParameters(meth as RBMemberMethod) As ParameterDefinition()
  const kStateDefault = 0
  const kStateLookingForType = 1
  const kStateLookingForArrayDimensions = 4
  const kStateDefaultValue = 3
  const kStateReset = 9
  
  
  dim chars() as string = meth.parameters.split( "" )
  dim buffer as string
  dim results() as ParameterDefinition
  dim item as new ParameterDefinition()
  dim state as integer
  dim inQuotes as boolean
  
  for i as integer = 0 to ubound( chars ) + 1
    dim char as string
    
    if i <= ubound( chars ) then _
    char = chars( i )
    
    select case state
    case kStateReset
      // reset for the next param
      results.append( item )
      item = new ParameterDefinition()
      state = kStateDefault
      
      buffer = ""
      inQuotes = False
      
      i = i - 1
      continue for i
      
      
      
    case kStateDefault
      if char = " " or char = "(" then
        if buffer = "as" then
          state = kStateLookingForType
          
        elseif buffer = "optional" then
          item.isOptional = True
          
        elseif buffer = "byref" then
          item.isByref = True
          
        elseif buffer = "paramarray" then
          item.isParamarray = True
          
        elseif buffer = "assigns" then
          item.isAssigns = True
          
        elseif buffer = "extends" then
          item.isExtends = True
          
        elseif buffer = "byval" then
          item.isByref = False
          
        elseif buffer <> "" then
          item.name = buffer
          
        end if
        
        buffer = ""
        
        if char = "(" then
          state = kStateLookingForArrayDimensions
          item.dimensions = 1
        end if
        
        continue for i
      end if
      
      buffer = buffer + char
      
      
      
    case kStateLookingForArrayDimensions
      // valid chars for state: " ", ")", ","
      if char = ")" then _
      state = kStateDefault
      
      if char = "," then _
      item.dimensions = item.dimensions + 1
      
      
      
    case kStateLookingForType
      if ( char = " " or char = "," or char = "=" or char = "" ) and buffer <> "" then
        item.type = buffer
        buffer = ""
      end if
      
      if char = "," then
        state = kStateReset
        continue for i
      end if
      
      if char = "=" then
        state = kStateDefaultValue
        continue for i
      end if
      
      if char = " " or char = "" then _
      continue for i
      
      buffer = buffer + char
      
      
      
    case kStateDefaultValue
      if char = " " and not inQuotes then _
      continue for i
      
      if ( char = "," and not inQuotes ) or char = "" then
        item.defaultValue = buffer
        item.isOptional = True
        
        state = kStateReset
        
        continue for i
      end if
      
      if char = """" then
        inQuotes = not inQuotes
        
        continue for i
      end if
      
      buffer = buffer + char
      
    end select
  next
  
  results.append( item )
  
  return results
End Function