/[eiffelstudio]/FreeELKS/trunk/library/kernel/string_to_integer_convertor.e
ViewVC logotype

Diff of /FreeELKS/trunk/library/kernel/string_to_integer_convertor.e

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 91476 by ericb, Sat Feb 4 16:56:42 2006 UTC revision 91477 by ericb, Sun Jan 14 09:47:13 2007 UTC
# Line 11  class Line 11  class
11    
12  inherit  inherit
13          STRING_TO_NUMERIC_CONVERTOR          STRING_TO_NUMERIC_CONVERTOR
14            
15  create  create
16          make          make
17    
18  feature{NONE} -- Initialization  feature{NONE} -- Initialization
19    
20          make is          make is
21                          --                          -- Initialize.
22                  do                  do
23                          reset (type_no_limitation)                          reset (type_no_limitation)
24                          set_leading_separators (" ")                          set_leading_separators (" ")
# Line 29  feature{NONE} -- Initialization Line 29  feature{NONE} -- Initialization
29                          leading_separators_not_acceptable:                          leading_separators_not_acceptable:
30                                  not leading_separators_acceptable                                  not leading_separators_acceptable
31                          trailing_separatorsnot_acceptable:                          trailing_separatorsnot_acceptable:
32                                  not trailing_separators_acceptable                                                        not trailing_separators_acceptable
33                  end                  end
34                    
35  feature -- State machine setting  feature -- State machine setting
36    
37          reset (type: INTEGER) is                                  reset (type: INTEGER) is
38                            -- Reset current convertor to parse integer of type `type'.
39                  do                  do
40                          last_state := 0                          last_state := 0
41                          part1 := 0                                        part1 := 0
42                          part2 := 0                          part2 := 0
43                          sign := 0                          sign := 0
44                          conversion_type := type                          conversion_type := type
# Line 46  feature        -- State machine setting Line 47  feature        -- State machine setting
47                          internal_overflowed_set: internal_overflowed = False                          internal_overflowed_set: internal_overflowed = False
48                          part1_set: part1 = 0                          part1_set: part1 = 0
49                          part2_set: part2 = 0                          part2_set: part2 = 0
50                  end                              end
51                                            
52  feature -- Status reporting  feature -- Status reporting
53    
54          separators_valid (separators: STRING): BOOLEAN is          separators_valid (separators: STRING): BOOLEAN is
55                            -- Are separators contained in `separators' valid?
56                  local                  local
57                          i: INTEGER                          i: INTEGER
58                          l_c: INTEGER                          l_c: INTEGER
# Line 72  feature -- Status reporting Line 74  feature -- Status reporting
74                                  end                                  end
75                                  i := i + 1                                  i := i + 1
76                          end                          end
77                  end                      end
78                    
79          overflowed: BOOLEAN is          overflowed: BOOLEAN is
80                            -- Is integer parsed so fa overflowed?
81                  do                  do
82                          Result := (internal_overflowed and then sign = 0)                          Result := (internal_overflowed and then sign = 0)
83                  end                  end
84                    
85          underflowed: BOOLEAN is          underflowed: BOOLEAN is
86                            -- Is integer parsed so fa underflowed?
87                  do                  do
88                          Result := (internal_overflowed and then sign = 1)                          Result := (internal_overflowed and then sign = 1)
89                  end                              end
90                            
91          parse_successful: BOOLEAN is                                      parse_successful: BOOLEAN is
92                          -- This only means we didn't enter an invalid state when parsing,                          -- This only means we didn't enter an invalid state when parsing,
93                          -- it doesn't mean that we have got an valid integer.                          -- it doesn't mean that we have got an valid integer.
94                          -- You need to check `is_integral_integer' or `is_part_of_integer'.                          -- You need to check `is_integral_integer' or `is_part_of_integer'.
95                  do                  do
96                          Result := (last_state /=4) and (last_state /=5)                          Result := (last_state /=4) and (last_state /=5)
97                  end                  end
98                    
99                    
100  feature -- String parsing  feature -- String parsing
101                    
102          parse_string_with_type (s: STRING; type: INTEGER) is          parse_string_with_type (s: STRING_GENERAL; type: INTEGER) is
103                            -- Parse string `s' as integer of type `type'.
104                  local                  local
105                          i: INTEGER                          i: INTEGER
106                          l_c: INTEGER                                              l_c: INTEGER
107                  do                  do
108                          reset (type)                          reset (type)
109                          from                          from
# Line 107  feature -- String parsing Line 112  feature -- String parsing
112                          until                          until
113                                  i > l_c or last_state = 4 or last_state = 5                                  i > l_c or last_state = 4 or last_state = 5
114                          loop                          loop
115                                  parse_character (s.item (i))                                  parse_character (s.code (i).to_character_8)
116                                  i := i + 1                                  i := i + 1
117                          end                          end
118                  end                  end
119    
120          parse_character (c: CHARACTER) is          parse_character (c: CHARACTER) is
121                            -- Parse next character `c'.
122                  local                  local
123                          temp_p1: like max_natural_type                          temp_p1: like max_natural_type
124                          temp_p2: like max_natural_type                          temp_p2: like max_natural_type
# Line 124  feature -- String parsing Line 130  feature -- String parsing
130                                  -- Sign         = "+" | "-"                                  -- Sign         = "+" | "-"
131                                  -- Integer      = Digit | Digit Integer                                  -- Integer      = Digit | Digit Integer
132                                  -- Digit        = "0"|"1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9"                                  -- Digit        = "0"|"1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9"
133                                                            
134                                          -- last_state = 0 : waiting sign or first digit                                          -- last_state = 0 : waiting sign or first digit
135                                          -- last_state = 1 : sign read, waiting first digit                                          -- last_state = 1 : sign read, waiting first digit
136                                          -- last_state = 2 : in the number                                          -- last_state = 2 : in the number
# Line 140  feature -- String parsing Line 146  feature -- String parsing
146                                          if c.is_digit then                                          if c.is_digit then
147                                                  last_state := 2                                                  last_state := 2
148                                                  part1 := 0                                                  part1 := 0
149                                                  part2 := (c.code - 48).to_natural_64                                                                                              part2 := (c.code - 48).to_natural_64
150                                          elseif c = '-' or c = '+' then                                          elseif c = '-' or c = '+' then
151                                                  last_state := 1                                                  last_state := 1
152                                                  if c = '-' then                                                  if c = '-' then
# Line 154  feature -- String parsing Line 160  feature -- String parsing
160                                          end                                          end
161                                  when 1 then                                  when 1 then
162                                                  -- Let's find first digit after sign.                                                  -- Let's find first digit after sign.
163                                          if c.is_digit then                                                if c.is_digit then
164                                                  part1 := 0                                                  part1 := 0
165                                                  part2 := (c.code - 48).to_natural_64                                                                                                                      part2 := (c.code - 48).to_natural_64
166                                                  if conversion_type /= type_no_limitation then                                                  if conversion_type /= type_no_limitation then
167                                                          internal_overflowed := overflow_checker.will_overflow (part1, part2, conversion_type, sign)                                                                                                              internal_overflowed := overflow_checker.will_overflow (part1, part2, conversion_type, sign)
168                                                          if internal_overflowed then                                                          if internal_overflowed then
169                                                                  part1 := temp_p1                                                                  part1 := temp_p1
170                                                                  part2 := temp_p2                                                                  part2 := temp_p2
171                                                                  last_state := 5                                                                                                                          last_state := 5
172                                                          end                                                              end
173                                                  end                                                  end
174                                                  last_state := 2                                                  last_state := 2
175                                          else                                          else
# Line 175  feature -- String parsing Line 181  feature -- String parsing
181                                                  temp_p1 := part1                                                  temp_p1 := part1
182                                                  temp_p2 := part2                                                  temp_p2 := part2
183                                                  part1 := part1*10 + part2                                                  part1 := part1*10 + part2
184                                                  part2 := (c.code - 48).to_natural_64                                                                                      part2 := (c.code - 48).to_natural_64
185                                                  if conversion_type /= type_no_limitation then                                                  if conversion_type /= type_no_limitation then
186                                                          internal_overflowed := overflow_checker.will_overflow (part1, part2, conversion_type, sign)                                                                                                              internal_overflowed := overflow_checker.will_overflow (part1, part2, conversion_type, sign)
187                                                          if overflowed then                                                          if overflowed then
188                                                                  last_state := 5                                                                  last_state := 5
189                                                                  part1 := temp_p1                                                                  part1 := temp_p1
190                                                                  part2 := temp_p2                                                                                                                                  part2 := temp_p2
191                                                          end                                                              end
192                                                  end                                                                                              end
193                                          elseif trailing_separators_acceptable and then trailing_separators.has (c) then                                                                          elseif trailing_separators_acceptable and then trailing_separators.has (c) then
194                                                  last_state := 3                                                                          last_state := 3
195                                          else                                          else
196                                                  last_state := 4                                                  last_state := 4
197                                          end                                          end
# Line 195  feature -- String parsing Line 201  feature -- String parsing
201                                          else                                          else
202                                                  last_state := 4                                                  last_state := 4
203                                          end                                          end
204                                  end                                                                              end
205                          end                              end
206                  end                  end
207                    
208  feature -- Status reporting  feature -- Status reporting
209    
210          conversion_type_valid (type: INTEGER): BOOLEAN is          conversion_type_valid (type: INTEGER): BOOLEAN is
211                            -- If conversion `type' valid?
212                  do                  do
213                          Result := integer_natural_type_valid (type)                                      Result := integer_natural_type_valid (type)
214                  end                              end
215    
216          is_part_of_integer: BOOLEAN is          is_part_of_integer: BOOLEAN is
217                          -- Is character sequence that has been parsed so far a valid start part of an integer?                            -- Is character sequence that has been parsed so far a valid start part of an integer?
218                  do                  do
219                          Result := ((last_state = 0) or (last_state = 1) or                          Result := ((last_state = 0) or (last_state = 1) or
220                                            (last_state = 2) or (last_state = 3)) and                                            (last_state = 2) or (last_state = 3)) and
221                                            (not internal_overflowed)                                            (not internal_overflowed)
222                  end                  end
223                    
224          is_integral_integer: BOOLEAN is          is_integral_integer: BOOLEAN is
225                          -- Is character sequence that has been parsed so far a valid integral integer?                            -- Is character sequence that has been parsed so far a valid integral integer?
226                  do                  do
227                          Result := ((last_state = 2) or (last_state = 3)) and                          Result := ((last_state = 2) or (last_state = 3)) and
228                                            (not internal_overflowed)                                                (not internal_overflowed)
229                  end                  end
230    
231          parsed_integer_8: INTEGER_8 is          parsed_integer_8: INTEGER_8 is
# Line 234  feature -- Status reporting Line 241  feature -- Status reporting
241                          else                          else
242                                  Result := l1 + part2.as_integer_8                                  Result := l1 + part2.as_integer_8
243                          end                          end
244                  end                              end
245                    
246          parsed_integer_16: INTEGER_16 is          parsed_integer_16: INTEGER_16 is
247                          -- INTEGER_16 representation of parsed string                          -- INTEGER_16 representation of parsed string
248                  local                  local
# Line 249  feature -- Status reporting Line 256  feature -- Status reporting
256                                  Result := l1 + part2.as_integer_16                                  Result := l1 + part2.as_integer_16
257                          end                          end
258                  end                  end
259                                    
260          parsed_integer_32, parsed_integer: INTEGER is          parsed_integer_32, parsed_integer: INTEGER is
261                          -- INTEGER representation of parsed string                          -- INTEGER representation of parsed string
262                  local                  local
# Line 262  feature -- Status reporting Line 269  feature -- Status reporting
269                          else                          else
270                                  Result := l1 + part2.as_integer_32                                  Result := l1 + part2.as_integer_32
271                          end                          end
272                  end                      end
273                    
274          parsed_integer_64: INTEGER_64 is          parsed_integer_64: INTEGER_64 is
275                          -- INTEGER_64 representation of parsed string                          -- INTEGER_64 representation of parsed string
276                  local                  local
277                          l1: INTEGER_64                          l1: INTEGER_64
278                  do                  do
# Line 276  feature -- Status reporting Line 283  feature -- Status reporting
283                          else                          else
284                                  Result := l1 + part2.as_integer_64                                  Result := l1 + part2.as_integer_64
285                          end                          end
286                  end                      end
287                            
288          parsed_natural_8: NATURAL_8 is          parsed_natural_8: NATURAL_8 is
289                          -- NATURAL_8 representation of parsed string                          -- NATURAL_8 representation of parsed string
290                  local                  local
# Line 286  feature -- Status reporting Line 293  feature -- Status reporting
293                          l1 := part1.as_natural_8                          l1 := part1.as_natural_8
294                          l1 := l1 * 10                          l1 := l1 * 10
295                          Result := l1 + part2.as_natural_8                          Result := l1 + part2.as_natural_8
296                  end                      end
297                                            
298          parsed_natural_16: NATURAL_16 is          parsed_natural_16: NATURAL_16 is
299                          -- NATURAL_16 representation of parsed string                          -- NATURAL_16 representation of parsed string
300                  local                  local
# Line 296  feature -- Status reporting Line 303  feature -- Status reporting
303                          l1 := part1.as_natural_16                          l1 := part1.as_natural_16
304                          l1 := l1 * 10                          l1 := l1 * 10
305                          Result := l1 + part2.as_natural_16                          Result := l1 + part2.as_natural_16
306                  end                      end
307                                    
308          parsed_natural_32, parsed_natural: NATURAL_32 is          parsed_natural_32, parsed_natural: NATURAL_32 is
309                          -- NATURAL_32 representation of parsed string                          -- NATURAL_32 representation of parsed string
310                  local                  local
311                          l1: NATURAL_32                          l1: NATURAL_32
312                  do                  do
313                          l1 := part1.as_natural_32                          l1 := part1.as_natural_32
314                          l1 := l1 * 10                          l1 := l1 * 10
315                          Result := l1 + part2.as_natural_32                          Result := l1 + part2.as_natural_32
316                  end                      end
317                    
318          parsed_natural_64: NATURAL_64 is          parsed_natural_64: NATURAL_64 is
319                          -- NATURAL_64 representation of parsed string                          -- NATURAL_64 representation of parsed string
320                  local                  local
# Line 316  feature -- Status reporting Line 323  feature -- Status reporting
323                          l1 := part1.as_natural_64                          l1 := part1.as_natural_64
324                          l1 := l1 * 10                          l1 := l1 * 10
325                          Result := l1 + part2.as_natural_64                          Result := l1 + part2.as_natural_64
326                  end                      end
327                    
328  feature{NONE} -- Implementation  feature{NONE} -- Implementation
329            
330          overflow_checker: INTEGER_OVERFLOW_CHECKER is          overflow_checker: INTEGER_OVERFLOW_CHECKER is
331                          -- Overflow checker                          -- Overflow checker
332                  once                  once
333                          create Result.make                          create Result.make
334                  end                  end
335                    
336          part1, part2: like max_natural_type          part1, part2: like max_natural_type
337                          -- Naturals used for conversion                          -- Naturals used for conversion
338                            
339          internal_overflowed: BOOLEAN          internal_overflowed: BOOLEAN
340                                                                            -- Internal overflow flag
341    
342  end  end

Legend:
Removed from v.91476  
changed lines
  Added in v.91477

  ViewVC Help
Powered by ViewVC 1.1.23