class IarProject

Attributes

asmfiles[RW]
filepath[RW]
headerfiles[RW]
projectdirectory[RW]
srcfiles[RW]

Public Class Methods

new(filepath: '') click to toggle source
# File lib/warlock/iar_project.rb, line 10
def initialize(filepath: '')
    @filepath = filepath
    @projectdirectory = File.dirname(filepath)
    @srcfiles = Array.new()
    @headerfiles = Array.new()
    @asmfiles = Array.new()
    read_data_from_file()
end

Public Instance Methods

add_source_file(referencefile: '', expectedclosenesslevel: 1) click to toggle source
# File lib/warlock/iar_project.rb, line 19
def add_source_file(referencefile: '', expectedclosenesslevel: 1)
  normalizedReferencePath = Pathname.new(referencefile).cleanpath
  referenceFileParts = normalizedReferencePath.to_s.downcase.split( '/' )
  toAddArraySize = referenceFileParts.length()
  result = 0
  referenceLine = ''

  srcfiles.each do |l|
    line = l.downcase
    path = line.match(/[$]proj_dir[$](.*)/)[1]
    path = projectdirectory + '/' + path
    normalizedPath = Pathname.new(path).cleanpath
    srcProjectFileParts = normalizedPath.to_s.downcase.split('/');
  
    existingAraySize = srcProjectFileParts.length()
        
    size = [].push(existingAraySize).push(toAddArraySize).max()

    i = 0;
    for i in 1..size
        if srcProjectFileParts[i] != referenceFileParts[i]
            break
        end
    end
    if i != 0
        i = i -1
    end

    if i >= expectedclosenesslevel
      # first match of file with requried closeness level
      referenceLine = l
      srcfileLine = build_src_file_line_by_template(srcfile: referencefile, templatefile: referenceLine)
      insert_src_file_line_above_reference(srcfileLine: srcfileLine, referenceLine: referenceLine)
      break
    end
  end
end
calculate_closeness_level(referencefile: '') click to toggle source
# File lib/warlock/iar_project.rb, line 57
def calculate_closeness_level(referencefile: '') 
    normalizedReferencePath = Pathname.new(referencefile).cleanpath
    referenceFileParts = normalizedReferencePath.to_s.downcase.split( '/' )
    toAddArraySize = referenceFileParts.length()
    result = 0
    srcfiles.each do |l|
      line = l.downcase
      path = line.match(/[$]proj_dir[$](.*)/)[1]
      path = projectdirectory + '/' + path
      normalizedPath = Pathname.new(path).cleanpath
      srcProjectFileParts = normalizedPath.to_s.downcase.split('/');
    
      existingAraySize = srcProjectFileParts.length()
          
      size = [].push(existingAraySize).push(toAddArraySize).max()

      i = 0;
      for i in 1..size
          if srcProjectFileParts[i] != referenceFileParts[i]
              break
          end
      end
      if i != 0
          i = i -1
      end

      if i>result
        result = i
      end

    end

    return result
   
end

Private Instance Methods

build_src_file_line_by_template(srcfile: '', templatefile: '') click to toggle source
# File lib/warlock/iar_project.rb, line 135
def build_src_file_line_by_template(srcfile: '', templatefile: '')
    normalizedSrcFilePath = srcfile.split('/').join('\\')
    resultLine = ''
    srcFilePathElements = normalizedSrcFilePath.split('\\')
    srcFilePathElements.each do |element|
        templateParts = templatefile.split(element)
        if templateParts.length == 2
            resultLine = templateParts[0] + element + normalizedSrcFilePath.split(element)[1] + '</name>'
            break
        end
    end
    return resultLine
end
insert_src_file_line_above_reference(srcfileLine: '', referenceLine: '') click to toggle source
# File lib/warlock/iar_project.rb, line 149
def insert_src_file_line_above_reference(srcfileLine: '', referenceLine: '')
  File.chmod(0604, filepath) # files could be read only by default
  lines = File.readlines(filepath)
  if i = lines.index(referenceLine)
    requiredSpaces = srcfileLine.split('<name>')[0]
    requiredSpaces = requiredSpaces[0..-3]
    lines.insert(i+1, requiredSpaces.to_s + '</file>'.to_s+$/) 
    lines.insert(i+2, requiredSpaces.to_s + '<file>'.to_s+$/) 
    lines.insert(i+3, srcfileLine.to_s+$/) 
    File.open(filepath, 'w+b') { |file| file.write(lines.join) }
  end
end
read_data_from_file() click to toggle source
# File lib/warlock/iar_project.rb, line 95
def read_data_from_file
  isFileBlockStarted = false
  isLineCaptured = false

  f=File.open(filepath, 'r')

  f.each do |l|            
      line = l.downcase
      if line =~ /<file>/
          isFileBlockStarted = true
      else
          if isFileBlockStarted == true
              path = line.match(/<name>(.*)<\/name>/)
              unless path == nil
                line = path[1]
                if (line =~ /[.]c|h/)   #somehow not only c and h files match
                  if line[-1] == 'c'
                    srcfiles.push(l)                      
                  elsif line[-1] == 'h'
                    headerfiles.push(l)
                  else
                    asmfiles.push(l) 
                  end
                    isLineCaptured = true
                end                    
              else
                  isFileBlockStarted = false
              end
          end
      end    
      if isLineCaptured == true
          if line =~ /<\/file>/
              isLineCaptured = false
              isFileBlockStarted = false
          end
      end
  end
  f.close
end