File: string_command_line.e

package info (click to toggle)
smarteiffel 1.1-11
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 12,288 kB
  • ctags: 40,785
  • sloc: ansic: 35,791; lisp: 4,036; sh: 1,783; java: 895; ruby: 613; python: 209; makefile: 115; csh: 78; cpp: 50
file content (145 lines) | stat: -rw-r--r-- 4,336 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
-- This file is part of SmartEiffel The GNU Eiffel Compiler Tools and Libraries
--
-- SmartEiffel is  free software;  you can redistribute it and/or  modify it
-- under  the terms of the  GNU General Public License, as published by  the
-- Free Software Foundation; either version 2, or (at your option) any later
-- version.
-- SmartEiffel is distributed in the hope that it will be useful but WITHOUT 
-- ANY WARRANTY;  without  even the implied warranty  of MERCHANTABILITY  or
-- FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
-- more details.  You should have received a copy of  the GNU General Public
-- License along with SmartEiffel;  see the file COPYING.  If not,  write to
-- the Free Software Foundation,  Inc., 59 Temple Place - Suite 330,  Boston, 
-- MA 02111-1307, USA.
--
-- Copyright(C) 1994-2002: INRIA - LORIA (INRIA Lorraine) - ESIAL U.H.P.
--			   - University of Nancy 1 - FRANCE
-- Copyright(C) 2003:      INRIA - LORIA (INRIA Lorraine) - I.U.T. Charlemagne
--			   - University of Nancy 2 - FRANCE
--
--		 Dominique COLNET, Suzanne COLLIN, Olivier ZENDRA,
--			   Philippe RIBET, Cyril ADRIAN
--
-- http://SmartEiffel.loria.fr - SmartEiffel@loria.fr
--
expanded class STRING_COMMAND_LINE
--
-- Emulate a command line using a string
--
inherit
   COMMAND_LINE_TOOLS

feature {STRING_COMMAND_LINE_VISITOR}

   accept(visitor: STRING_COMMAND_LINE_VISITOR) is
      do
         visitor.visit_string_command_line(Current)
      end

feature

   set_command_name(c: STRING) is
      do
         command_name.copy(c)
      end

   parse(command_line: STRING) is
         -- Only a very small subset of SmartEiffel options are supported
         -- here:
         --    -no_gc
         --    -no_strip
         --    -no_split
         --    -sedb
         --    -wedit
         --    -compact
      local
         arg: STRING
      do
         from
            command_line_buffer.copy(command_line)
         until
            command_line_buffer.is_empty
         loop
            next_option
            arg := option_buffer
            if flag_match(once "no_gc", arg) then
               gc_handler.no_gc
            elseif flag_match(fz_no_strip,arg) then
               system_tools.set_no_strip
            elseif flag_match(fz_no_split,arg) then
               ace.set_no_split(True)
            elseif is_trace_flag(arg) then
            elseif flag_match(fz_wedit,arg) then
               ace.set_wedit(True)
            elseif flag_match(fz_compact,arg) then
               cpp.set_compact(True)
            else
               echo.w_put_string(command_name)
               echo.w_put_string(": unsupported option %"")
               echo.w_put_string(arg)
               echo.w_put_string("%".%N")
            end
         end
      end

feature {NONE}

   next_option is
         -- Finds the next option after having skipped the separators
      local
         low, up, i: INTEGER
      do
         from
            low := 1
         until
            low > command_line_buffer.count or else not command_line_buffer.item(low).is_separator
         loop
            low := low + 1
         end
         from
            up := low
         until
            up > command_line_buffer.count or else command_line_buffer.item(up).is_separator
         loop
            up := up + 1
         end
         option_buffer.clear
         if up > command_line_buffer.count then
            from
               i := low
            until
               i > command_line_buffer.count
            loop
               option_buffer.extend(command_line_buffer.item(i))
               i := i + 1
            end
            command_line_buffer.clear
         else
            from
               i := low
            until
               i = up
            loop
               option_buffer.extend(command_line_buffer.item(i))
               i := i + 1
            end
            command_line_buffer.shrink(up, command_line_buffer.count)
         end
      end

   command_line_buffer: STRING is
      once
         create Result.make(16)
      end

   option_buffer: STRING is
      once
         create Result.make(16)
      end

   command_name: STRING is
      once
         Result := "string_command_line" -- must be changed by the tools which use the STRING_COMMAND_LINE
      end

end