~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to mystrings/str2int.c

  • Committer: Brian Aker
  • Date: 2008-07-31 19:57:34 UTC
  • mfrom: (236.1.27 codestyle)
  • Revision ID: brian@tangent.org-20080731195734-c7cu4gx70xgjr68o
Merge from Monty.

Show diffs side-by-side

added added

removed removed

Lines of Context:
22
22
  The result is a pointer to the first character after the number;
23
23
  trailing spaces will NOT be skipped.
24
24
 
25
 
  If an error is detected, the result will be NullS, the value put
 
25
  If an error is detected, the result will be (char *)0, the value put
26
26
  in val will be 0, and errno will be set to
27
27
        EDOM    if there are no digits
28
28
        ERANGE  if the result would overflow or otherwise fail to lie
39
39
 
40
40
#include "m_string.h"
41
41
#include "m_ctype.h"
42
 
#include <mysys/my_sys.h>                       /* defines errno */
43
42
#include <errno.h>
44
43
 
45
44
#define char_val(X) (X >= '0' && X <= '9' ? X-'0' :\
66
65
  /*  Check that the radix is in the range 2..36  */
67
66
  if (radix < 2 || radix > 36) {
68
67
    errno=EDOM;
69
 
    return NullS;
 
68
    return (char *)0;
70
69
  }
71
70
 
72
71
  /*  The basic problem is: how do we handle the conversion of
116
115
 
117
116
  if (start == src) {
118
117
    errno=EDOM;
119
 
    return NullS;
 
118
    return (char *)0;
120
119
  }
121
120
 
122
121
  /*  The invariant we want to maintain is that src is just
136
135
  {
137
136
    if ((long) -(d=digits[n]) < limit) {
138
137
      errno=ERANGE;
139
 
      return NullS;
 
138
      return (char *)0;
140
139
    }
141
140
    limit = (limit+d)/radix, sofar += d*scale; scale *= radix;
142
141
  }
145
144
    if ((long) -(d=digits[n]) < limit)          /* get last digit */
146
145
    {
147
146
      errno=ERANGE;
148
 
      return NullS;
 
147
      return (char *)0;
149
148
    }
150
149
    sofar+=d*scale;
151
150
  }
162
161
    if (sofar < -LONG_MAX || (sofar= -sofar) > upper)
163
162
    {
164
163
      errno=ERANGE;
165
 
      return NullS;
 
164
      return (char *)0;
166
165
    }
167
166
  }
168
167
  else if (sofar < lower)
169
168
  {
170
169
    errno=ERANGE;
171
 
    return NullS;
 
170
    return (char *)0;
172
171
  }
173
172
  *val = sofar;
174
173
  errno=0;                      /* indicate that all went well */