home *** CD-ROM | disk | FTP | other *** search
/ QBasic & Borland Pascal & C / Delphi5.iso / C / Samples / CSAPE32.ARJ / SOURCE / CSSRC / FNVALNUM.C < prev    next >
C/C++ Source or Header  |  1990-03-28  |  2KB  |  104 lines

  1. /*
  2.       fnvalnum.c
  3.  
  4.     % valid_Double
  5.  
  6.     Numerical validation functions
  7.  
  8.     C-scape 3.2
  9.     Copyright (c) 1986, 1987, 1988 by Oakland Group, Inc.
  10.     ALL RIGHTS RESERVED.
  11.  
  12.     Revision History:
  13.     -----------------
  14.      9/17/88 jmd    Converted to one function and macros, renamed file
  15.     12/16/88 jmd    Added test for empty validation string
  16.      3/28/90 jmd    ansi-fied
  17. */
  18.  
  19. #include <stdio.h>
  20. #include <string.h>
  21. #include <ctype.h>
  22.  
  23. #include "cscape.h"
  24. #include "ostdlib.h"            /* for atol() */
  25.  
  26. boolean valid_Double(double num, char *vstr)
  27. /*
  28.     Returns whether the value of num is within the range
  29.     specified by vstr.
  30.     The rules for vstr are as follows:
  31.     "(x1,y1)"          ===> (x1 < num) && (num < y1)
  32.     "(x1,y1)(x2,y2)" ===> ((x1 < num) && (num < y1)) || ((x2 < num) && (num < y2))
  33.     "(,y1)"         ===> (num < y1)
  34.     "(x1,)"         ===> (x1 < num)
  35.     Return TRUE if vstr == NULL;
  36. */
  37. {
  38.     double     x, y;
  39.     int     state;
  40.     boolean lower, upper;
  41.     char     *p, *q;
  42.     char     temp[VALID_SLEN + 1];
  43.     boolean result = FALSE;
  44.  
  45.     if (vstr == NULL || vstr[0] == '\0') {
  46.         return(TRUE);
  47.     }
  48.  
  49.     for (p = vstr, state = 0; *p != '\0'; p++) {
  50.         switch(state) {
  51.         case 0:
  52.             if (*p == '(') {
  53.                 q = temp;
  54.                 state = 1;
  55.             }
  56.             break;
  57.         case 1:                    /* "(" */
  58.             if (*p == ','|| q >= temp + VALID_SLEN) {
  59.                 if (q != temp) {
  60.                     *q = '\0';
  61.                     x = atof(temp);
  62.                     lower = FALSE;
  63.                 }
  64.                 else {
  65.                     lower = TRUE;
  66.                 }
  67.                 q = temp;
  68.                 state = 2;
  69.             }
  70.             else if (isdigit(*p) || *p == '-' || *p == '.' || *p == 'e' || *p == 'E') {
  71.                 *q++ = *p;
  72.             }
  73.             break;
  74.         case 2:                    /* "(xx," */
  75.             if (*p == ')'|| q >= temp + VALID_SLEN) {
  76.                 if (q != temp) {
  77.                     *q = '\0';
  78.                     y = atof(temp);
  79.                     upper = FALSE;
  80.                 }
  81.                 else {
  82.                     upper = TRUE;
  83.                 }
  84.  
  85.                 /* evaluate */
  86.                 result = ((lower || (num >= x)) && (upper || (num <= y)));
  87.                 if (result) {
  88.                     return(TRUE);
  89.                 }
  90.  
  91.                 q = temp;
  92.                 state = 0;
  93.             }
  94.             else if (isdigit(*p) || *p == '-' || *p == '.' || *p == 'e' || *p == 'E') {
  95.                 *q++ = *p;
  96.             }
  97.             break;
  98.         }
  99.     }
  100.  
  101.     return(FALSE);
  102. }
  103.  
  104.