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

  1. /*
  2.     fnclong.c             11/13/86
  3.  
  4.     % clong_funcs
  5.  
  6.     Long editing functions.
  7.     With commas.
  8.  
  9.     Normally this functions saves enough space at the left of the field
  10.     to display a minus sign.  (toggled with the '-' key).
  11.     If you wish to disable this feature undefine the symbol MINUS and
  12.     recompile this file.
  13.  
  14.     C-scape 3.2
  15.     Copyright (c) 1986, 1987, 1988 by Oakland Group, Inc.
  16.     ALL RIGHTS RESERVED.
  17.  
  18.     Revision History:
  19.     -----------------
  20.     10/01/87 jmd     added casting
  21.      4/06/88 jmd     added call to sed_DoSpecial
  22.      5/12/88 jmd    added calls to sed_GetScratchPad()
  23.      5/14/88 jmd    now prevents comma expansion from putting chars in
  24.                     the first location, 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.      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.  
  53. OGLOBAL field_funcs_struct clong_funcs = {
  54.     num_fenter,
  55.     clong_fexit,
  56.     clong_fkey,
  57.     clong_senter,
  58.     clong_sexit,
  59.     sizeof(long)
  60. };
  61.  
  62. boolean clong_fexit(sed_type sed)
  63. /*
  64.     Validates a long using the string in field data 1.
  65. */
  66. {
  67.     long val;
  68.  
  69.     if (sed_GetBaton(sed) != SED_ABORT) {
  70.  
  71.         /* test for overflow/underflow */
  72.  
  73.         if (!valid_Range(sed, (long)LONG_MIN, (long)LONG_MAX)) {
  74.              kb_Stuff(KEY_INVALID);
  75.             return(FALSE);
  76.         }
  77.  
  78.         /* format the field's record */
  79.         std_format(sed);
  80.  
  81.         strcpy(sed_GetScratchPad(sed), sed_GetCurrRecord(sed));
  82.         sscanf(strnocomma(sed_GetScratchPad(sed)), "%ld", &val);
  83.  
  84.         /* call standard numeric validation routine (fnstdval.c) */
  85.         if (!std_NumValid(sed, (double) val)) {
  86.             return(FALSE);
  87.         }
  88.     }
  89.  
  90.     return(std_fexit(sed));
  91. }
  92.  
  93. void clong_fkey(sed_type sed)
  94. {
  95.     int   scancode, key;
  96.  
  97.     scancode = kb_Read();
  98.  
  99.     if (sed_DoSpecial(sed, scancode))
  100.         return;
  101.     if (special_key(sed, scancode))
  102.         return;
  103.     if (inter_field(sed, scancode))
  104.         return;
  105.     if (inter_page(sed, scancode))
  106.         return;
  107.  
  108.     switch(scancode) {
  109.     case BACKSPACE:
  110.         sed_PullLeft(sed);
  111.         if (digit_count(sed_GetCurrRecord(sed)) == 0)
  112.             sed_Overwrite(sed, '0');
  113.         else {
  114.             strcpy(sed_GetScratchPad(sed), sed_GetCurrRecord(sed));
  115.             sed_SetCurrRecord(sed, strcomma(sed_GetScratchPad(sed)));
  116.             sed_UpdateCurrField(sed);
  117.         }
  118.         break;
  119.     default:
  120.         /* don't allow characters in the first position */
  121.         /* overwrite leading zeroes                        */
  122.         /* insert commas where necessary                */
  123.  
  124.         key = ascii(scancode);
  125.         if (isdigit(key)) {
  126.             if (sed_GetBaton(sed) == SED_FIRST) {
  127.                 /* Clear field if first key pressed is a digit */
  128.                 clear_field(sed);
  129.             }
  130.  
  131. #ifdef MINUS
  132.             if (sed_GetChar(sed, 1) != ' ' && sed_GetChar(sed, 1) != '-') {
  133.                 /* don't allow characters in the first position
  134.                    (save for minus sign) */
  135.                 break;
  136.             }
  137.  
  138.             if ((sed_GetCurrRecordLen(sed) > 4) &&
  139.                 isdigit(sed_GetChar(sed, 2)) &&
  140.                 isdigit(sed_GetChar(sed, 3)) &&
  141.                 isdigit(sed_GetChar(sed, 4)) ){
  142.  
  143.                 /*     make sure comma expansion doesn't
  144.                     place a character into first position */
  145.                 break;
  146.             }
  147. #else
  148.             if (sed_GetChar(sed, 0) != ' ' && sed_GetChar(sed, 0) != '-') {
  149.                 /* if minus is disable don't allow more numbers
  150.                    after field is filled */
  151.                 break;
  152.             }
  153.  
  154.             if ((sed_GetCurrRecordLen(sed) > 3) &&
  155.                 isdigit(sed_GetChar(sed, 1)) &&
  156.                 isdigit(sed_GetChar(sed, 2)) &&
  157.                 isdigit(sed_GetChar(sed, 3)) ){
  158.  
  159.                 /*     make sure comma expansion doesn't get too big */
  160.                 break;
  161.             }
  162.  
  163. #endif
  164.  
  165.             if (sed_GetCurrChar(sed) == '0' &&
  166.                 digit_count(sed_GetCurrRecord(sed)) == 1) {
  167.  
  168.                 sed_Overwrite(sed, key);
  169.             }
  170.             else {
  171.                 sed_PushLeft(sed, key);
  172.                 strcpy(sed_GetScratchPad(sed), sed_GetCurrRecord(sed));
  173.                 sed_SetCurrRecord(sed, strcomma(sed_GetScratchPad(sed)));
  174.                 sed_UpdateCurrField(sed);
  175.             }
  176.         }
  177.  
  178. #ifdef MINUS
  179.         /* toggle minus sign if appropriate */
  180.         else if (key == '-') {
  181.             strcpy(sed_GetScratchPad(sed), sed_GetCurrRecord(sed));
  182.             sed_SetCurrRecord(sed, strminus(sed_GetScratchPad(sed)));
  183.             sed_UpdateCurrField(sed);
  184.         }
  185. #endif
  186.         /* Clear the field if ' ' is pressed */
  187.         else if (key == ' ') {
  188.             clear_field(sed);
  189.         }
  190.         break;
  191.     }
  192.  
  193.     /* reset baton */
  194.     if (scancode != MOU_CLICK) {
  195.         sed_SetBaton(sed, -1);
  196.     }
  197. }
  198.  
  199. void clong_senter(sed_type sed, int fieldno)
  200. /*
  201.     Convert native type to string for record.
  202. */
  203. {
  204.     sprintf(sed_GetScratchPad(sed), "%ld", *((long *) sed_GetVar(sed, fieldno)));
  205.     strright(sed_GetScratchPad(sed), sed_GetRecordLen(sed, fieldno));
  206.     sed_SetRecord(sed, strcomma(sed_GetScratchPad(sed)), fieldno);
  207.  
  208.     std_senter(sed, fieldno);
  209. }
  210.  
  211. void clong_sexit(sed_type sed, int fieldno)
  212. /*
  213.     Converts record back to native type.
  214. */
  215. {
  216.     if (sed_GetBaton(sed) != SED_ABORT) {
  217.         strcpy(sed_GetScratchPad(sed), sed_GetRecord(sed, fieldno));
  218.         sscanf(strnocomma(sed_GetScratchPad(sed)), "%ld", (long *) sed_GetVar(sed, fieldno));
  219.     }
  220. }
  221.  
  222.