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

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