home *** CD-ROM | disk | FTP | other *** search
/ QBasic & Borland Pascal & C / Delphi5.iso / C / Samples / CSAPE32.ARJ / SOURCE / CSSRC / FNSDOUBL.C < prev    next >
C/C++ Source or Header  |  1990-11-06  |  4KB  |  141 lines

  1. /*
  2.     fnsdoubl.c         5/2/87
  3.  
  4.     % sdouble_funcs
  5.  
  6.     Double editing functions.
  7.     The field variable should be a double *.
  8.     The record length should be greater than 12.
  9.     These funcs edit doubles in a string_like fashion.
  10.  
  11.     C-scape 3.2
  12.     Copyright (c) 1986, 1987, 1988 by Oakland Group, Inc.
  13.     ALL RIGHTS RESERVED.
  14.  
  15.     Revision History:
  16.     -----------------
  17.      4/06/88 jmd     added call to sed_DoSpecial
  18.      5/12/88 jmd    added calls to sed_GetScratchPad()
  19.      9/15/88 jmd     removed vid_Cursor calls
  20.      9/17/88 jmd     added std_ funcs
  21.     10/06/88 jmd    added snum_fenter, now uses %f and %g
  22.     10/09/88 jmd     added SED_ABORT support
  23.     10/14/88 jdc    added var_size element to field_funcs_struct
  24.  
  25.      6/01/89 gam    added ocountry stuff
  26.      6/07/89 jmd    added test for mouse code (later removed)
  27.     10/02/89 gam    fixed some of the ocountry stuff
  28.     10/17/89 jdc    fixed filter (no extended ascii)
  29.      3/14/90 jmd    moved formatting before validation
  30.      3/28/90 jmd    ansi-fied
  31.     10/06/90 pmcm    changed %lg to %le in sdouble_fexit for VAX C
  32.     10/06/90 pmcm    changed %lg to %le in sdouble_sexit for VAX C
  33. */
  34.  
  35. #include <stdio.h>
  36. #include <ctype.h>
  37. #include <string.h>
  38.  
  39. #include "cscape.h"
  40. #include "fnfunc.h"            /* for field functions */
  41. #include "strdecl.h"        /* for C-scape string functions */
  42.  
  43. #include "scancode.h"
  44.  
  45. OSTATIC sfilter_func (sdouble_filter);
  46.  
  47. OGLOBAL field_funcs_struct sdouble_funcs = {
  48.     stdBigCur_fenter,
  49.     sdouble_fexit,
  50.     sdouble_fkey,
  51.     sdouble_senter,
  52.     sdouble_sexit,
  53.     sizeof(double)
  54. };
  55.  
  56. boolean sdouble_fexit(sed_type sed)
  57. {
  58.     double val;
  59.  
  60.     if (sed_GetBaton(sed) != SED_ABORT) {
  61.  
  62.         /* format the field's record */
  63.         std_format(sed);
  64.  
  65.         strcpy(sed_GetScratchPad(sed), sed_GetCurrRecord(sed));
  66.         strnocomma(sed_GetScratchPad(sed));
  67.         strtrans(sed_GetScratchPad(sed), ocountry.dec_char, '.');
  68.  
  69. #ifdef OAK_VMS
  70.         /* Note: VMS does not support %g in sscanf */
  71.         sscanf(sed_GetScratchPad(sed), "%le", &val);
  72. #else
  73.         sscanf(sed_GetScratchPad(sed), "%lg", &val);
  74. #endif
  75.  
  76.         /* call standard numeric validation routine (fnstdval.c) */
  77.         if (!std_NumValid(sed, (double) val)) {
  78.             return(FALSE);
  79.         }
  80.     }
  81.  
  82.     return(std_fexit(sed));
  83. }
  84.  
  85. void sdouble_fkey(sed_type sed)
  86. /*
  87.     Hands its work to StrCommon_fkey (fnstrcom.c)
  88.     Passes a filter function (below) to decide which
  89.     characters can be typed in.
  90. */
  91. {
  92.     StrCommon_fkey(sed, sdouble_filter);
  93. }
  94.  
  95. static boolean sdouble_filter(int key)
  96. /*
  97.     Filter function for sdouble_funcs
  98.     for use with StrCommon_fkey
  99. */
  100. {
  101.     return(isprint(key) && (isdigit(key) || key == '-' || key == ocountry.dec_char));
  102. }
  103.  
  104. void sdouble_senter(sed_type sed, int fieldno)
  105. /*
  106.     Convert the native double into the record string.
  107. */
  108. {
  109.     sprintf(sed_GetScratchPad(sed), "%lg", *((double *) sed_GetVar(sed, fieldno)));
  110.     strtrans(sed_GetScratchPad(sed), '.', ocountry.dec_char);
  111.     strleft(sed_GetScratchPad(sed), sed_GetRecordLen(sed, fieldno));
  112.     strclip(sed_GetScratchPad(sed));
  113.     sed_SetRecord(sed, sed_GetScratchPad(sed), fieldno);
  114.  
  115.     std_senter(sed, fieldno);
  116. }
  117.  
  118. void sdouble_sexit(sed_type sed, int fieldno)
  119. /*
  120.     Convert the record string back into the native double.
  121.     Remove commas from string first.
  122. */
  123. {
  124.     if (sed_GetBaton(sed) != SED_ABORT) {
  125.         strcpy(sed_GetScratchPad(sed), sed_GetRecord(sed, fieldno));
  126.         strnocomma(sed_GetScratchPad(sed));
  127.         strtrans(sed_GetScratchPad(sed), ocountry.dec_char, '.');
  128.  
  129. #ifdef OAK_VMS
  130.         /* Note: VMS does not support %g in sscanf */
  131.         sscanf(sed_GetScratchPad(sed), "%le", (double *) sed_GetVar(sed, fieldno));
  132. #else
  133.         sscanf(sed_GetScratchPad(sed), "%lg", (double *) sed_GetVar(sed, fieldno));
  134. #endif
  135.  
  136.     }
  137. }
  138.  
  139.  
  140.  
  141.