home *** CD-ROM | disk | FTP | other *** search
/ QBasic & Borland Pascal & C / Delphi5.iso / C / Samples / CSAPE32.ARJ / SOURCE / FUNCS / FNPNUM.C < prev    next >
C/C++ Source or Header  |  1990-07-26  |  2KB  |  116 lines

  1. /*
  2.     fnpnum.c             10/10/87
  3.  
  4.     % pint_funcs, plong_funcs
  5.  
  6.     Misc. routines used by positive numeric field functions.
  7.     The positive numeric functions do not allow the entry of
  8.     negative numbers.
  9.  
  10.     pnum_fkey()
  11.  
  12.     C-scape 3.2
  13.     Copyright (c) 1986, 1987, 1988 by Oakland Group, Inc.
  14.     ALL RIGHTS RESERVED.
  15.  
  16.     Revision History:
  17.     -----------------
  18.      4/06/88 jmd     added call to sed_DoSpecial
  19.      9/24/88 jmd     clears after first key pressed
  20.     10/09/88 jmd     added SED_ABORT support
  21.     10/14/88 jdc    added var_size element to field_funcs_struct
  22.  
  23.      6/07/89 jmd    added test for mouse code (later removed)
  24.  
  25.      1/31/90 jmd    don't reset baton on MOU_CLICK
  26.      3/28/90 jmd    ansi-fied
  27.      7/26/90 jdc    fixed for use with only one writeable position
  28. */
  29.  
  30. #include <stdio.h>
  31. #include <string.h>
  32. #include <ctype.h>
  33.  
  34. #include "cscape.h"
  35. #include "fnfunc.h"            /* for field functions */
  36. #include "scancode.h"
  37.  
  38. /* positive integer funcs */
  39. OGLOBAL field_funcs_struct pint_funcs = {
  40.     num_fenter,
  41.     int_fexit,
  42.     pnum_fkey,
  43.     int_senter,
  44.     int_sexit,
  45.     sizeof(int)
  46. };
  47.  
  48. /* positive long funcs */
  49. OGLOBAL field_funcs_struct plong_funcs = {
  50.     num_fenter,
  51.     long_fexit,
  52.     pnum_fkey,
  53.     long_senter,
  54.     long_sexit,
  55.     sizeof(long)
  56. };
  57.  
  58. void pnum_fkey(sed_type sed)
  59. /*
  60.     Generic fkey function for positive numeric fields.
  61.     Supports right to left calculator style entry.
  62.     The Space Bar key clears the field to 0.
  63. */
  64. {
  65.     int   scancode, key;
  66.  
  67.     scancode = kb_Read();
  68.  
  69.     if (sed_DoSpecial(sed, scancode))
  70.         return;
  71.     if (special_key(sed, scancode))
  72.         return;
  73.     if (inter_field(sed, scancode))
  74.         return;
  75.     if (inter_page(sed, scancode))
  76.         return;
  77.  
  78.     switch(scancode) {
  79.     case BACKSPACE:
  80.         sed_PullLeft(sed);
  81.         if (digit_count(sed_GetCurrRecord(sed)) == 0) {
  82.             sed_Overwrite(sed, '0');
  83.         }
  84.         break;
  85.     default:
  86.         /* overwrite leading zeroes                        */
  87.         key = ascii(scancode);
  88.         if (isdigit(key)) {
  89.             if (sed_GetBaton(sed) == SED_FIRST) {
  90.                 /* Clear field if first key pressed is a digit */
  91.                 clear_field(sed);
  92.             }
  93.             if (sed_GetCurrChar(sed) == '0'
  94.              && digit_count(sed_GetCurrRecord(sed)) == 1) {
  95.  
  96.                 sed_Overwrite(sed, key);
  97.             }
  98.             else if (sed_GetChar(sed, 0) == ' ') {
  99.                 sed_PushLeft(sed, key);
  100.             }
  101.         }
  102.  
  103.         /* Clear the field if ' ' is pressed */
  104.         else if (key == ' ') {
  105.             clear_field(sed);
  106.         }
  107.  
  108.         break;
  109.     }
  110.  
  111.     /* reset baton */
  112.     if (scancode != MOU_CLICK) {
  113.         sed_SetBaton(sed, -1);
  114.     }
  115. }
  116.