FreeBASIC  0.91.0
str_convfrom_lng.c
Go to the documentation of this file.
1 /* vallng function */
2 
3 #include "fb.h"
4 
5 FBCALL long long fb_hStr2Longint( char *src, ssize_t len )
6 {
7  char *p;
8  int radix, skip;
9 
10  /* skip white spc */
11  p = fb_hStrSkipChar( src, len, 32 );
12 
13  len -= (ssize_t)(p - src);
14  if( len < 1 )
15  return 0;
16 
17  radix = 10;
18  if( (len >= 2) && (p[0] == '&') )
19  {
20  skip = 2;
21  switch( p[1] )
22  {
23  case 'h':
24  case 'H':
25  radix = 16;
26  break;
27  case 'o':
28  case 'O':
29  radix = 8;
30  break;
31  case 'b':
32  case 'B':
33  radix = 2;
34  break;
35 
36  default: /* assume octal */
37  radix = 8;
38  skip = 1;
39  break;
40  }
41 
42  if( radix != 10 )
43  {
44  p += skip;
45 #ifdef HOST_MINGW
46  return fb_hStrRadix2Longint( p, len - skip, radix );
47 #endif
48  }
49  }
50 
51  /* strtoll() saturates values outside [-2^63, 2^63)
52  so use strtoull() instead */
53  return (long long)strtoull( p, NULL, radix );
54 }
55 
56 FBCALL long long fb_VALLNG ( FBSTRING *str )
57 {
58  long long val;
59 
60  if( str == NULL )
61  return 0;
62 
63  if( (str->data == NULL) || (FB_STRSIZE( str ) == 0) )
64  val = 0;
65  else
66  val = fb_hStr2Longint( str->data, FB_STRSIZE( str ) );
67 
68  /* del if temp */
69  fb_hStrDelTemp( str );
70 
71  return val;
72 }