57: def parse_commands(data)
58: context = resource[:context]
59:
60: if (context.length > 0)
61: context << "/" if context[-1, 1] != "/"
62: end
63:
64: if data.is_a?(String)
65: data = data.split($/)
66: end
67: args = []
68: data.each do |line|
69: line.strip!
70: next if line.nil? || line.empty?
71: argline = []
72: sc = StringScanner.new(line)
73: cmd = sc.scan(/\w+|==|!=/)
74: formals = COMMANDS[cmd]
75: fail("Unknown command #{cmd}") unless formals
76: argline << cmd
77: narg = 0
78: formals.each do |f|
79: sc.skip(/\s+/)
80: narg += 1
81: if f == :path
82: start = sc.pos
83: nbracket = 0
84: begin
85: sc.skip(/([^\]\[\s\\]|\\.)+/)
86: ch = sc.getch
87: nbracket += 1 if ch == "["
88: nbracket -= 1 if ch == "]"
89: fail("unmatched [") if nbracket < 0
90: end until nbracket == 0 && (sc.eos? || ch =~ /\s/)
91: len = sc.pos - start
92: len -= 1 unless sc.eos?
93: unless p = sc.string[start, len]
94: fail("missing path argument #{narg} for #{cmd}")
95: end
96: p.chomp!("/")
97: if p[0,1] != "$" && p[0,1] != "/"
98: argline << context + p
99: else
100: argline << p
101: end
102: elsif f == :string
103: delim = sc.peek(1)
104: if delim == "'" || delim == "\""
105: sc.getch
106: argline << sc.scan(/([^\\#{delim}]|(\\.))*/)
107: sc.getch
108: else
109: argline << sc.scan(/[^\s]+/)
110: end
111: unless argline[-1]
112: fail("missing string argument #{narg} for #{cmd}")
113: end
114: elsif f == :comparator
115: argline << sc.scan(/(==|!=|=~|<|<=|>|>=)/)
116: unless argline[-1]
117: puts sc.rest
118: fail("invalid comparator for command #{cmd}")
119: end
120: elsif f == :int
121: argline << sc.scan(/\d+/).to_i
122: elsif f== :glob
123: argline << sc.rest
124: end
125: end
126: args << argline
127: end
128: return args
129: end