home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 7 / 07.iso / c / c185 / 1.ddi / FUNCS.EXE / CSCAPE / SOURCE / FNNUM.C < prev    next >
Encoding:
C/C++ Source or Header  |  1989-09-07  |  3.3 KB  |  169 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.1
  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.  
  25. #include <stdio.h>
  26. #include <string.h>
  27. #include <ctype.h>
  28.  
  29. #include "cscape.h"
  30. #include "fnfunc.h"            /* for field functions */
  31. #include "strdecl.h"        /* for C-scape string functions */
  32. #include "scancode.h"
  33.  
  34. void num_fenter(sed)
  35.     sed_type sed;
  36. /*
  37.     fenter function for numeric fields.
  38. */
  39. {
  40.     std_fenter(sed);
  41.     sed_GoEnd(sed);
  42. }
  43.  
  44. void num_fkey(sed)
  45.     sed_type sed;
  46. /*
  47.     Generic fkey function for numeric fields.
  48.     Supports right to left calculator style entry.
  49.     The '-' key toggles the minus sign.
  50.     The Space Bar key clears the field to 0.
  51. */
  52. {
  53.     int   scancode, key;
  54.  
  55.     scancode = kb_Read();
  56.  
  57.     if (sed_DoSpecial(sed, scancode))
  58.         return;
  59.     if (special_key(sed, scancode))
  60.         return;
  61.     if (inter_field(sed, scancode))
  62.         return;
  63.     if (inter_page(sed, scancode))
  64.         return;
  65.  
  66.     switch(scancode) {
  67.     case DEL:
  68.     case BACKSPACE:
  69.         sed_PullLeft(sed);
  70.         if (digit_count(sed_GetCurrRecord(sed)) == 0) {
  71.             sed_Overwrite(sed, '0');
  72.         }
  73.         break;
  74.     default:
  75.         /* don't allow characters in the first position */
  76.         /* overwrite leading zeroes                        */
  77.  
  78.         key = ascii(scancode);
  79.         if (isdigit(key)) {
  80.             if (sed_GetBaton(sed) == SED_FIRST) {
  81.                 /* Clear field if first key pressed is a digit */
  82.                 clear_field(sed);
  83.             }
  84.  
  85.             if (sed_GetChar(sed, 1) == ' ' || sed_GetChar(sed, 1) == '-'){
  86.                 if (sed_GetCurrChar(sed) == '0' &&
  87.                   digit_count(sed_GetCurrRecord(sed)) == 1) {
  88.                     sed_Overwrite(sed, key);
  89.                 }
  90.                 else {
  91.                     sed_PushLeft(sed, key);
  92.                 }
  93.             }
  94.         }
  95.  
  96.         /* toggle minus sign if appropriate */
  97.         else if (key == '-') {
  98.             strcpy(sed_GetScratchPad(sed), sed_GetCurrRecord(sed));
  99.             sed_SetCurrRecord(sed, strminus(sed_GetScratchPad(sed)));
  100.             sed_UpdateCurrField(sed);
  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.     sed_SetBaton(sed, -1);
  113. }
  114.  
  115. char *strminus(s)
  116.     char *s;
  117. /*
  118.     Toggles the minus sign in a numeric string.
  119. */
  120. {
  121.     char *p;
  122.  
  123.     for (p = s;; p++) {
  124.         if (*p == '-') {
  125.             *p = ' ';
  126.             break;
  127.         }
  128.         else if (*p != ' ' && p > s) {
  129.             *(p-1) = '-';
  130.             break;
  131.         }
  132.         else if (*p == '\0' && p > s+1) {
  133.             *(p-2) = '-';
  134.             *(p-1) = '0';
  135.             break;
  136.         }
  137.     }
  138.     return(s);
  139. }
  140.  
  141. int digit_count(str)
  142.     char *str;
  143. /*
  144.     Counts number of (hex) digits in a string.
  145. */
  146. {
  147.     register int    count = 0;
  148.  
  149.     for(;*str;str++) {
  150.         if (isxdigit(*str))
  151.             count++;
  152.     }
  153.  
  154.     return(count);
  155. }
  156.  
  157. void clear_field(sed)
  158.     sed_type sed;
  159. /*
  160.     Clear a field to 0.
  161. */
  162. {
  163.     strcpy(sed_GetScratchPad(sed), "");
  164.     strpad(sed_GetScratchPad(sed), sed_GetCurrRecordLen(sed));
  165.     sed_SetCurrRecord(sed, sed_GetScratchPad(sed));
  166.     sed_UpdateCurrField(sed);
  167.     sed_Overwrite(sed, '0');
  168. }
  169.