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

  1. /*
  2.     fnmoney.c 10/30/86
  3.  
  4.     % money_funcs
  5.  
  6.     Money editing functions.
  7.     These functions use a long and put a decimal point at position 2.
  8.     The value returned is in cents. Divide by 100 to get a dollar amount.
  9.  
  10.     Normally this functions saves enough space at the left of the field
  11.     to display a minus sign.  (toggled with the '-' key).
  12.     If you wish to disable this feature undefine the symbol MINUS and
  13.     recompile this file.
  14.  
  15.     C-scape 3.2
  16.     Copyright (c) 1986, 1987, 1988 by Oakland Group, Inc.
  17.     ALL RIGHTS RESERVED.
  18.  
  19.     Revision History:
  20.     -----------------
  21.     10/01/87 jmd     added casting
  22.      4/06/88 jmd     added call to sed_DoSpecial
  23.      5/12/88 jmd    added calls to sed_GetScratchPad()
  24.      5/14/88 jmd    added MINUS option
  25.      9/17/88 jmd    added global error msg strings for easy changing
  26.      9/17/88 jmd     added std_ funcs
  27.      9/24/88 jmd     clears after first key pressed
  28.     10/09/88 jmd     added SED_ABORT support
  29.     10/14/88 jdc    added var_size element to field_funcs_struct
  30.  
  31.      6/07/89 jmd    added test for mouse code (later removed)
  32.  
  33.      1/31/90 jmd    don't reset baton on MOU_CLICK
  34.      3/14/90 jmd    moved formatting before validation
  35.      3/28/90 jmd    ansi-fied
  36.      4/12/90 pmcm     added valid_Range check for over/underflow in fexit
  37.      4/13/90 jmd    added olimits.h
  38.      8/15/90 pmcm    now works w/minimum of 4 writeables, 3 if MINUS not def'd
  39.      9/11/90 pmcm    changed sed_SetMouseCode to kb_Stuff
  40. */
  41.  
  42. #include <stdio.h>
  43. #include <string.h>
  44. #include <ctype.h>
  45.  
  46. #include "cscape.h"
  47. #include "fnfunc.h"            /* for field functions */
  48. #include "strdecl.h"        /* for C-scape string functions */
  49. #include "scancode.h"
  50. #include "olimits.h"
  51.  
  52. #define MINUS                /* defining this enables the minus sign */
  53. #define    DECP    2            /* number of digits past the decimal point */
  54.  
  55. OGLOBAL field_funcs_struct money_funcs = {
  56.     num_fenter,
  57.     money_fexit,
  58.     money_fkey,
  59.     money_senter,
  60.     money_sexit,
  61.     sizeof(long)
  62. };
  63.  
  64. boolean money_fexit(sed_type sed)
  65. /*
  66.     Validates a long using the string in field data 1.
  67. */
  68. {
  69.     long val;
  70.  
  71.     if (sed_GetBaton(sed) != SED_ABORT) {
  72.  
  73.         /* test for overflow/underflow */
  74.  
  75.         if (!valid_Range(sed, (long)LONG_MIN, (long)LONG_MAX)) {
  76.              kb_Stuff(KEY_INVALID);
  77.             return(FALSE);
  78.         }
  79.  
  80.         /* format the field's record */
  81.         std_format(sed);
  82.  
  83.         strcpy(sed_GetScratchPad(sed), sed_GetCurrRecord(sed));
  84.         sscanf(strnodecp(sed_GetScratchPad(sed)), "%ld", &val);
  85.  
  86.         /* call standard numeric validation routine (fnstdval.c) */
  87.         if (!std_NumValid(sed, (double) val)) {
  88.             return(FALSE);
  89.         }
  90.     }
  91.  
  92.     return(std_fexit(sed));
  93. }
  94.  
  95. void money_fkey(sed_type sed)
  96. {
  97.     int     scancode;
  98.     int        key;
  99.  
  100.     scancode = kb_Read();
  101.  
  102.     if (sed_DoSpecial(sed, scancode))
  103.         return;
  104.     if (special_key(sed, scancode))
  105.         return;
  106.     if (inter_field(sed, scancode))
  107.         return;
  108.     if (inter_page(sed, scancode))
  109.         return;
  110.  
  111.     switch(scancode) {
  112.     case BACKSPACE:
  113.         sed_PullLeft(sed);
  114.         strcpy(sed_GetScratchPad(sed), sed_GetCurrRecord(sed));
  115.         sed_SetCurrRecord(sed, strdecp(sed_GetScratchPad(sed), DECP));
  116.         sed_UpdateCurrField(sed);
  117.         break;
  118.     default:
  119.         /* don't allow characters in the first position */
  120.  
  121.         key = ascii(scancode);
  122.         if (isdigit(key)) {
  123.             if (sed_GetBaton(sed) == SED_FIRST) {
  124.                 /* Clear field if first key pressed is a digit */
  125.                 strfill(sed_GetScratchPad(sed), ' ', strlen(sed_GetCurrRecord(sed)));
  126.                 sed_SetCurrRecord(sed, strdecp(sed_GetScratchPad(sed), DECP));
  127.                 sed_UpdateCurrField(sed);
  128.             }
  129.         
  130.             /*  allow entry of digits into field until full.  
  131.  
  132.                 i.e., until    there are no more leading blanks and 
  133.                 the leading digit is non-zero.
  134.  
  135.                 consider the minus sign, if enabled.
  136.             */
  137.                 
  138. #ifdef MINUS
  139.             if (sed_GetChar(sed, 1) != ' ' && 
  140.                 sed_GetChar(sed, 1) != '-' &&
  141.                 sed_GetChar(sed, 1) != '0'        ) {
  142.  
  143.                 break;
  144.             }
  145. #else
  146.             if (sed_GetChar(sed, 0) != ' ' && 
  147.                 sed_GetChar(sed, 0) != '-' &&
  148.                 sed_GetChar(sed, 0) != '0'        ) {
  149.  
  150.                 break;
  151.             }
  152. #endif
  153.             if (sed_PushLeft(sed, key) == '-') {
  154.                 *sed_GetCurrRecord(sed) = '-';
  155.             }
  156.             strcpy(sed_GetScratchPad(sed), sed_GetCurrRecord(sed));
  157.             sed_SetCurrRecord(sed, strdecp(sed_GetScratchPad(sed), DECP));
  158.             sed_UpdateCurrField(sed);
  159.         }
  160.  
  161. #ifdef MINUS
  162.         /* toggle minus sign if appropriate */
  163.         else if (key == '-') {
  164.             strcpy(sed_GetScratchPad(sed), sed_GetCurrRecord(sed));
  165.             sed_SetCurrRecord(sed, strminus(sed_GetScratchPad(sed)));
  166.             sed_UpdateCurrField(sed);
  167.         }
  168. #endif
  169.         /* Clear the field if ' ' is pressed */
  170.  
  171.         else if (key == ' ') {
  172.             strfill(sed_GetScratchPad(sed), ' ', strlen(sed_GetCurrRecord(sed)));
  173.             sed_SetCurrRecord(sed, strdecp(sed_GetScratchPad(sed), DECP));
  174.             sed_UpdateCurrField(sed);
  175.         }
  176.  
  177.         break;
  178.     }
  179.  
  180.     /* reset baton */
  181.     if (scancode != MOU_CLICK) {
  182.         sed_SetBaton(sed, -1);
  183.     }
  184. }
  185.  
  186. void money_senter(sed_type sed, int fieldno)
  187. /*
  188.     Convert native type to string for record.
  189. */
  190. {
  191.     sprintf(sed_GetScratchPad(sed), "%ld", *((long *) sed_GetVar(sed, fieldno)));
  192.     strright(sed_GetScratchPad(sed), sed_GetRecordLen(sed, fieldno));
  193.     sed_SetRecord(sed, strdecp(sed_GetScratchPad(sed), DECP), fieldno);
  194.  
  195.     std_senter(sed, fieldno);
  196. }
  197.  
  198. void money_sexit(sed_type sed, int fieldno)
  199. /*
  200.     Converts record back to native type.
  201. */
  202. {
  203.     if (sed_GetBaton(sed) != SED_ABORT) {
  204.         strcpy(sed_GetScratchPad(sed), sed_GetRecord(sed, fieldno));
  205.         sscanf(strnodecp(sed_GetScratchPad(sed)), "%ld", (long *) sed_GetVar(sed, fieldno));
  206.     }
  207. }
  208.  
  209.