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

  1. /*
  2.     fnhex.c             11/20/86
  3.  
  4.     % hex_funcs
  5.  
  6.     Hexadecimal editing functions.
  7.     Just like int_funcs except no minus sign.
  8.  
  9.     C-scape 3.2
  10.     Copyright (c) 1986, 1987, 1988 by Oakland Group, Inc.
  11.     ALL RIGHTS RESERVED.
  12.  
  13.     Revision History:
  14.     -----------------
  15.     10/01/87 jmd     added casting
  16.      4/06/88 jmd     added call to sed_DoSpecial
  17.      5/12/88 jmd    added calls to sed_GetScratchPad()
  18.      9/17/88 jmd     added std_ funcs
  19.     10/09/88 jmd     added SED_ABORT support
  20.     10/14/88 jdc    added var_size element to field_funcs_struct
  21.  
  22.      6/07/89 jmd    added test for mouse code (later removed)
  23.      7/20/89 jdc    changed hex_senter, sexit calls in hex_fexit to
  24.                     sed_DoFieldSenter, sed_DoFieldSexit
  25.      2/21/90 pmcm    made space key and 1st xdigit keypress clear field
  26.                     added DEL case
  27.      3/14/90 jmd    moved formatting before validation
  28.      3/28/90 jmd    ansi-fied
  29.      6/13/90 jdc    replaced backwards pointer math
  30.      8/08/90 mla    added standard numeric validation
  31.      9/07/90 jmd    ifdef'd out code that call sexit/senter
  32. */
  33.  
  34. #include <stdio.h>
  35. #include <string.h>
  36. #include <ctype.h>
  37.  
  38. #include "cscape.h"
  39. #include "fnfunc.h"            /* for field functions */
  40. #include "strdecl.h"        /* for C-scape string functions */
  41. #include "scancode.h"
  42.  
  43. OGLOBAL field_funcs_struct hex_funcs = {
  44.     num_fenter,
  45.     hex_fexit,
  46.     hex_fkey,
  47.     hex_senter,
  48.     hex_sexit,
  49.     sizeof(int)
  50. };
  51.  
  52. boolean hex_fexit(sed_type sed)
  53. {
  54.     int val;
  55.  
  56.     if (sed_GetBaton(sed) != SED_ABORT) {
  57.         /* format the field's record */
  58.         std_format(sed);
  59.  
  60.         sscanf(sed_GetCurrRecord(sed), "%x", &val);
  61.  
  62.         /* call standard numeric validation routine (fnstdval.c) */
  63.         if (!std_NumValid(sed, (double) val)) {
  64.             return(FALSE);
  65.         }
  66.  
  67. #ifdef DOSEXIT    
  68.         sed_DoFieldSexit(sed, sed_GetFieldNo(sed));
  69.         sed_DoFieldSenter(sed, sed_GetFieldNo(sed));
  70.         sed_UpdateCurrField(sed);
  71. #endif
  72.     }
  73.  
  74.     return(std_fexit(sed));
  75. }
  76.  
  77. void hex_fkey(sed_type sed)
  78. {
  79.     int   scancode, key;
  80.  
  81.     scancode = kb_Read();
  82.  
  83.     if (sed_DoSpecial(sed, scancode))
  84.         return;
  85.     if (special_key(sed, scancode))
  86.         return;
  87.     if (inter_field(sed, scancode))
  88.         return;
  89.     if (inter_page(sed, scancode))
  90.         return;
  91.  
  92.     switch(scancode) {
  93.     case DEL:
  94.     case BACKSPACE:
  95.         sed_PullLeft(sed);
  96.         strcpy(sed_GetScratchPad(sed), sed_GetCurrRecord(sed));
  97.         sed_SetCurrRecord(sed, strhex(sed_GetScratchPad(sed)));
  98.         sed_UpdateCurrField(sed);
  99.         break;
  100.     default:
  101.         key = ascii(scancode);
  102.         if (isxdigit(key) || key == ' ') {
  103.  
  104.             if (key == ' ') {
  105.  
  106.                 /* Clear the record if space key pressed */
  107.                 sprintf(sed_GetScratchPad(sed), "0");                
  108.             }
  109.             else if (sed_GetBaton(sed) == SED_FIRST) {
  110.  
  111.                 /* Start a new hex num if xdigit is first key pressed */
  112.                 sprintf(sed_GetScratchPad(sed), "%c", key);                
  113.             }
  114.             else  {
  115.  
  116.                 /* Add xdigits until full (no more leading zeros) */
  117.                 if (sed_GetChar(sed, 0) == '0') {
  118.                     sed_PushLeft(sed, key);
  119.                 }
  120.                 break;
  121.             }
  122.             strright(sed_GetScratchPad(sed), sed_GetCurrRecordLen(sed));
  123.             sed_SetCurrRecord(sed, strhex(sed_GetScratchPad(sed)));
  124.             sed_UpdateCurrField(sed);
  125.         }
  126.         break;
  127.  
  128.     }
  129.  
  130.     /* reset baton */
  131.     sed_SetBaton(sed, -1);
  132. }
  133.  
  134. void hex_senter(sed_type sed, int fieldno)
  135. /*
  136.     Convert native type to string for record.
  137. */
  138. {
  139.     sprintf(sed_GetScratchPad(sed), "%x", *((int *) sed_GetVar(sed, fieldno)));
  140.  
  141.     strright(sed_GetScratchPad(sed), sed_GetRecordLen(sed, fieldno));
  142.     sed_SetRecord(sed, strhex(sed_GetScratchPad(sed)), fieldno);
  143.  
  144.     std_senter(sed, fieldno);
  145. }
  146.  
  147. void hex_sexit(sed_type sed, int fieldno)
  148. /*
  149.     Converts record back to native type.
  150. */
  151. {
  152.     if (sed_GetBaton(sed) != SED_ABORT) {
  153.         sscanf(sed_GetRecord(sed, fieldno), "%x", (int *) sed_GetVar(sed, fieldno));
  154.     }
  155. }
  156.  
  157. char *strhex(char *s)
  158. /*
  159.     Formats a hexadecimal string
  160.     The string returned is a right justified hexadecimal
  161.     number padded out with leading zeroes.
  162. */
  163. {
  164.     int i;
  165.  
  166.     for (i = strlen(s) - 1; i >= 0; i--) {
  167.  
  168.         if (s[i] == ' ') {
  169.             s[i] = '0';
  170.         }
  171.     }
  172.  
  173.     return(s);
  174. }
  175.  
  176.  
  177.