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

  1. /*
  2.     fnnum.c             11/3/86
  3.  
  4.     % num_fenter, num_fkey,    strminus, digit_count, clear_field
  5.  
  6.     Misc. routines used by numeric field functions.
  7.  
  8.     C-scape 3.2
  9.     Copyright (c) 1986, 1987, 1988 by Oakland Group, Inc.
  10.     ALL RIGHTS RESERVED.
  11.  
  12.     Revision History:
  13.     -----------------
  14.      4/06/88 jmd     added call to sed_DoSpecial
  15.      5/12/88 jmd    added calls to sed_GetScratchPad()
  16.      9/17/88 jmd    added global error msg strings for easy changing
  17.      9/17/88 jmd     added std_ funcs
  18.      9/24/88 jmd     clears after first key pressed
  19.     10/06/88 jmd    added snum_fenter
  20.     10/09/88 jmd     added SED_ABORT support
  21.  
  22.      6/07/89 jmd    added test for mouse code (later removed)
  23.  
  24.      1/31/90 jmd    don't reset baton on MOU_CLICK
  25.      3/28/90 jmd    ansi-fied
  26.      7/26/90 jdc    fixed for use with only two writeable positions
  27. */
  28.  
  29. #include <stdio.h>
  30. #include <string.h>
  31. #include <ctype.h>
  32.  
  33. #include "cscape.h"
  34. #include "fnfunc.h"            /* for field functions */
  35. #include "strdecl.h"        /* for C-scape string functions */
  36. #include "scancode.h"
  37.  
  38. void num_fenter(sed_type sed)
  39. /*
  40.     fenter function for numeric fields.
  41. */
  42. {
  43.     std_fenter(sed);
  44.     sed_GoEnd(sed);
  45. }
  46.  
  47. void num_fkey(sed_type sed)
  48. /*
  49.     Generic fkey function for numeric fields.
  50.     Supports right to left calculator style entry.
  51.     The '-' key toggles the minus sign.
  52.     The Space Bar key clears the field to 0.
  53. */
  54. {
  55.     int   scancode, key;
  56.  
  57.     scancode = kb_Read();
  58.  
  59.     if (sed_DoSpecial(sed, scancode))
  60.         return;
  61.     if (special_key(sed, scancode))
  62.         return;
  63.     if (inter_field(sed, scancode))
  64.         return;
  65.     if (inter_page(sed, scancode))
  66.         return;
  67.  
  68.     switch(scancode) {
  69.     case DEL:
  70.     case BACKSPACE:
  71.         sed_PullLeft(sed);
  72.         if (digit_count(sed_GetCurrRecord(sed)) == 0) {
  73.             sed_Overwrite(sed, '0');
  74.         }
  75.         break;
  76.     default:
  77.         /* don't allow characters in the first position */
  78.         /* overwrite leading zeroes                        */
  79.  
  80.         key = ascii(scancode);
  81.         if (isdigit(key)) {
  82.             if (sed_GetBaton(sed) == SED_FIRST) {
  83.                 /* Clear field if first key pressed is a digit */
  84.                 clear_field(sed);
  85.             }
  86.  
  87.             if (sed_GetCurrChar(sed) == '0'
  88.              && digit_count(sed_GetCurrRecord(sed)) == 1) {
  89.  
  90.                 sed_Overwrite(sed, key);
  91.             }
  92.             else if (sed_GetCurrRecordLen(sed) > 1
  93.              && sed_GetChar(sed, 1) == ' ') {
  94.  
  95.                 sed_PushLeft(sed, key);
  96.             }
  97.         }
  98.  
  99.         /* toggle minus sign if appropriate */
  100.         else if (key == '-') {
  101.             strcpy(sed_GetScratchPad(sed), sed_GetCurrRecord(sed));
  102.             sed_SetCurrRecord(sed, strminus(sed_GetScratchPad(sed)));
  103.             sed_UpdateCurrField(sed);
  104.         }
  105.  
  106.         /* Clear the field if ' ' is pressed */
  107.         else if (key == ' ') {
  108.             clear_field(sed);
  109.         }
  110.  
  111.         break;
  112.     }
  113.  
  114.     /* reset baton */
  115.     if (scancode != MOU_CLICK) {
  116.         sed_SetBaton(sed, -1);
  117.     }
  118. }
  119.  
  120. char *strminus(char *s)
  121. /*
  122.     Toggles the minus sign in a numeric string.
  123. */
  124. {
  125.     char *p;
  126.  
  127.     for (p = s;; p++) {
  128.         if (*p == '-') {
  129.             *p = ' ';
  130.             break;
  131.         }
  132.         else if (*p != ' ' && p > s) {
  133.             *(p-1) = '-';
  134.             break;
  135.         }
  136.         else if (*p == '\0' && p > s+1) {
  137.             *(p-2) = '-';
  138.             *(p-1) = '0';
  139.             break;
  140.         }
  141.     }
  142.     return(s);
  143. }
  144.  
  145. int digit_count(char *str)
  146. /*
  147.     Counts number of (hex) digits in a string.
  148. */
  149. {
  150.     register int    count = 0;
  151.  
  152.     for(;*str;str++) {
  153.         if (isxdigit(*str))
  154.             count++;
  155.     }
  156.  
  157.     return(count);
  158. }
  159.  
  160. void clear_field(sed_type sed)
  161. /*
  162.     Clear a field to 0.
  163. */
  164. {
  165.     strcpy(sed_GetScratchPad(sed), "");
  166.     strpad(sed_GetScratchPad(sed), sed_GetCurrRecordLen(sed));
  167.     sed_SetCurrRecord(sed, sed_GetScratchPad(sed));
  168.     sed_UpdateCurrField(sed);
  169.     sed_Overwrite(sed, '0');
  170. }
  171.