module Sith

Public Class Methods

load_macros(macro_source) click to toggle source
# File lib/sith/loader.rb, line 2
def self.load_macros(macro_source)
  lines = macro_source.split("\n")
  macros = {}
  i = 0
  while i < lines.length
    line = lines[i]
    if line.lstrip.start_with? 'macro_mapper'
      offset = line.length - line.lstrip.length
      a = line.index('(')
      label = line[offset + 12...a].strip.to_sym
      args = line[a + 1..-1].rstrip[0...-1].split(/[, \"]/)
      arg = args[0].to_sym
      delimiter =  args.length >= 2 ? args[-1] : "\n"
      end_index = lines[i..-1].find_index { |l| (l[offset..-1] || '').start_with? 'end' }
      body = lines[i + 1...i + end_index].join("\n")
      i = i + end_index + 1
      macros[label] = MacroMapper.new(arg, delimiter, body)
    elsif line.lstrip.start_with? 'macro'
      offset = line.length - line.lstrip.length
      a = line.index('(')
      label = line[offset + 5...a].strip.to_sym
      args = line[a + 1..-1].rstrip[0...-1].split(',').map(&:strip)
      if args.length == 1 && args[0][0] == '*'
        stararg, args = true, [args[0][1..-1].to_sym]
      else
        stararg, args = false, args.map(&:to_sym)
      end
      end_index = lines[i..-1].find_index { |l| (l[offset..-1] || '').start_with? 'end' }
      body = lines[i + 1...i + end_index].join("\n")
      i = i + end_index + 1
      macros[label] = Macro.new(args, stararg, body)
    else
      i += 1
    end
  end
  macros
end