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

  1. /*
  2.     fnsfloat.c         5/2/87
  3.  
  4.     % sfloat_funcs
  5.  
  6.     Float editing functions.
  7.     The field variable should be a float *.
  8.     The record length should be greater than 7.
  9.     These funcs edit floats 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.      5/12/88 jmd    added calls to sed_GetScratchPad()
  18.      9/15/88 jmd     removed vid_Cursor calls
  19.      9/17/88 jmd     added std_ funcs
  20.     10/06/88 jmd    added snum_fenter, added validation, use %g now
  21.     10/09/88 jmd     added SED_ABORT support
  22.     10/14/88 jdc    added var_size element to field_funcs_struct
  23.     12/16/88 jmd    added vsfloat_fexit
  24.  
  25.      6/03/89 jmd    added strclip to senter func
  26.  
  27.      1/25/90 jmd    converted kb_Check to kb_CheckWait
  28.      3/14/90 jmd    moved formatting before validation
  29.      3/14/90 pmcm      sdouble_fexit now uses local double for validation, not float
  30.      3/16/90 jmd    added support for KEY_INVALID in fexit
  31.      3/28/90 jmd    ansi-fied
  32.      9/07/90 jmd    ifdef'd out code that call sexit/senter
  33.      9/11/90 pmcm    changed sed_SetMouseCode to kb_Stuff
  34.     10/06/90 pmcm    changed sscanf %lg to %le in sfloat_fexit for VAX C
  35.     10/06/90 pmcm    changed sscanf %g  to %f  in sfloat_sexit for VAX C
  36. */
  37.  
  38. #include <stdio.h>
  39. #include <ctype.h>
  40. #include <string.h>
  41.  
  42. #include "cscape.h"
  43. #include "fnfunc.h"            /* for field functions */
  44. #include "strdecl.h"        /* for C-scape string functions */
  45. #include "scancode.h"
  46.  
  47. OGLOBAL field_funcs_struct sfloat_funcs = {
  48.     stdBigCur_fenter,
  49.     sfloat_fexit,
  50.     sdouble_fkey,
  51.     sfloat_senter,
  52.     sfloat_sexit,
  53.     sizeof(float)
  54. };
  55.  
  56. boolean sfloat_fexit(sed_type sed)
  57. {
  58.     double val;
  59.  
  60.     if (sed_GetBaton(sed) != SED_ABORT) {
  61.         /* format the field's record */
  62.         std_format(sed);
  63.  
  64. #ifdef OAK_VMS
  65.         /* Note: VMS does not support %g in sscanf */
  66.         sscanf(sed_GetCurrRecord(sed), "%le", &val);
  67. #else
  68.         sscanf(sed_GetCurrRecord(sed), "%lg", &val);
  69. #endif
  70.  
  71.         if ( !valid_Double(val, (char *) sed_GetCurrFieldData(sed, 1)) ) {
  72.  
  73.             /* Invalid entry: notify fkey function via mouse code */
  74.             kb_Stuff(KEY_INVALID);
  75.             return(FALSE);
  76.         }
  77.  
  78. #ifdef DOSEXIT    
  79.         sed_DoFieldSexit(sed, sed_GetFieldNo(sed));
  80.         sed_DoFieldSenter(sed, sed_GetFieldNo(sed));
  81.         sed_UpdateCurrField(sed);
  82. #endif
  83.     }
  84.  
  85.     return(std_fexit(sed));
  86. }
  87.  
  88. void sfloat_senter(sed_type sed, int fieldno)
  89. /*
  90.     Convert the native float into the record string.
  91. */
  92. {
  93.     sprintf(sed_GetScratchPad(sed), "%g", *((float *) sed_GetVar(sed, fieldno)));
  94.     strleft(sed_GetScratchPad(sed), sed_GetRecordLen(sed, fieldno));
  95.     strclip(sed_GetScratchPad(sed));
  96.     sed_SetRecord(sed, sed_GetScratchPad(sed), fieldno);
  97.  
  98.     std_senter(sed, fieldno);
  99. }
  100.  
  101. void sfloat_sexit(sed_type sed, int fieldno)
  102. /*
  103.     Convert the record string back into the native float.
  104.     Remove commas from string first.
  105. */
  106. {
  107.     if (sed_GetBaton(sed) != SED_ABORT) {
  108.         strcpy(sed_GetScratchPad(sed), sed_GetRecord(sed, fieldno));
  109.         strnocomma(sed_GetScratchPad(sed));
  110.  
  111. #ifdef OAK_VMS
  112.         /* Note: VMS does not support %g in sscanf */
  113.         sscanf(sed_GetScratchPad(sed), "%f", (float *) sed_GetVar(sed, fieldno));
  114. #else
  115.         sscanf(sed_GetScratchPad(sed), "%g", (float *) sed_GetVar(sed, fieldno));
  116. #endif    
  117.  
  118.     }
  119. }
  120.  
  121.  
  122.