File: cmath.c

package info (click to toggle)
regina 3.3-5
  • links: PTS
  • area: main
  • in suites: lenny
  • size: 4,944 kB
  • ctags: 7,235
  • sloc: ansic: 50,555; sh: 2,727; lex: 2,298; yacc: 1,498; makefile: 1,019; cpp: 117
file content (123 lines) | stat: -rw-r--r-- 3,299 bytes parent folder | download | duplicates (3)
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
#ifndef lint
static char *RCSid = "$Id: cmath.c,v 1.5 2004/02/10 10:43:47 mark Exp $";
#endif

/*
 *  The Regina Rexx Interpreter
 *  Copyright (C) 1992-1994  Anders Christensen <anders@pvv.unit.no>
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Library General Public
 *  License as published by the Free Software Foundation; either
 *  version 2 of the License, or (at your option) any later version.
 *
 *  This library 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
 *  Library General Public License for more details.
 *
 *  You should have received a copy of the GNU Library General Public
 *  License along with this library; if not, write to the Free
 *  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */

/*
 * More attention should be paid to overflow and underflow conditions.
 * This *is* done in some of the routines for the GCC compiler, but should
 * be done in an ANSI-compatible manner.
 */


#include "rexx.h"
#include <math.h>
#include <stdio.h>
#include <string.h>

#ifdef SunKludges
double strtod( const char *, char ** ) ;
#endif

double myatof( const tsd_t *TSD, const streng *string )
{
   char *str,*ptr ;
   double answer ;

   str = str_ofTSD(string) ;
   answer = strtod(str,&ptr) ;

   /* remove leading spaces */
   for (;(*ptr)&&(rx_isspace(*ptr));ptr++) ;
#ifdef SUNOS_STRTOD_BUG
   for (;*ptr=='0';ptr++) ;
#endif /* SUNOS_STRTOD_BUG */
   if (*ptr)
       exiterror( ERR_BAD_ARITHMETIC, 0 )  ;
   FreeTSD( str ) ;

   return answer ;
}


int myisnumber( const streng *string )
{
   const register char *ptr=NULL, *eptr=NULL ;
   int num=0 ;

   if (!string->len)
      return 0 ;

   ptr = string->value ;
   eptr = Str_end( string ) ;

   for (; (ptr<eptr) && (rx_isspace(*ptr)); ptr++) ;
   if ((ptr<eptr) && ((*ptr=='-') || (*ptr=='+')))
      for (ptr++; (ptr<eptr) && (rx_isspace(*ptr)); ptr++) ;

   for (; (ptr<eptr) && rx_isdigit(*ptr); ptr++, num++) ;
   if ((ptr<eptr) && *ptr=='.')
      for (ptr++;(ptr<eptr) && rx_isdigit(*ptr); ptr++, num++) ;

   if (!num)
      return 0 ;

   if ((ptr<eptr) && ((*ptr=='e') || (*ptr=='E')))
   {
      ptr++ ;
      num = 0 ;
      if ((ptr<eptr) && ((*ptr=='-') || (*ptr=='+')))
         ptr++ ;

      for (; (ptr<eptr) && rx_isdigit(*ptr); ptr++, num++ ) ;
      if (!num)
         return 0 ;
   }

   for (; (ptr<eptr) && (rx_isspace(*ptr)); ptr++) ;
   return (ptr==eptr) ;
}


/*
 * Takes 'string' as parameter, analyze whether it is an integer, and
 * return a boolean variable which is true iff 'string' is a legal
 * integer. The format of a legal integer is (the regexpr):
 *        [ ]*([-+][ ]*)?[0-9]+[ ]*
 */
int myisinteger( const streng *string )
{
   const char *cptr=NULL, *eptr=NULL ;

   cptr = string->value ;
   eptr = cptr + string->len ;

   for (;cptr<eptr && rx_isspace(*cptr); cptr++) ;
   if (cptr<eptr && (*cptr=='-' || *cptr=='+'))
      for (cptr++; cptr<eptr && rx_isspace(*cptr); cptr++) ;

   if (cptr>=eptr)
      return 0 ;

   for (;cptr<eptr && rx_isdigit(*cptr); cptr++) ;
   for (;cptr<eptr && rx_isspace(*cptr); cptr++) ;
   return (cptr==eptr) ;
}