home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 7 / 07.iso / c / c185 / 1.ddi / FUNCS.EXE / CSCAPE / SOURCE / FNHEX.C < prev    next >
Encoding:
C/C++ Source or Header  |  1989-09-07  |  3.0 KB  |  142 lines

  1. /*
  2.     fnhex.c             11/20/86
  3.  
  4.     % hex_funcs
  5.  
  6.     Hexadecimal editting functions.
  7.     Just like int_funcs except no minus sign.
  8.  
  9.     C-scape 3.1
  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.     07/20/89 jdc    changed hex_senter, sexit calls in hex_fexit to
  24.                     sed_DoFieldSenter, sed_DoFieldSexit
  25. */
  26.  
  27. #include <stdio.h>
  28. #include <string.h>
  29. #include <ctype.h>
  30.  
  31. #include "cscape.h"
  32. #include "fnfunc.h"            /* for field functions */
  33. #include "strdecl.h"        /* for C-scape string functions */
  34. #include "scancode.h"
  35.  
  36. OGLOBAL field_funcs_struct hex_funcs = {
  37.     num_fenter,
  38.     hex_fexit,
  39.     hex_fkey,
  40.     hex_senter,
  41.     hex_sexit,
  42.     sizeof(int)
  43. };
  44.  
  45. boolean hex_fexit(sed)
  46.     sed_type sed;
  47. {
  48.     if (sed_GetBaton(sed) != SED_ABORT) {
  49.         sed_DoFieldSexit(sed, sed_GetFieldNo(sed));
  50.         sed_DoFieldSenter(sed, sed_GetFieldNo(sed));
  51.         sed_UpdateCurrField(sed);
  52.     }
  53.  
  54.     return(std_fexit(sed));
  55. }
  56.  
  57. void hex_fkey(sed)
  58.     sed_type sed;
  59. {
  60.     int   scancode, key;
  61.  
  62.     scancode = kb_Read();
  63.  
  64.     if (sed_DoSpecial(sed, scancode))
  65.         return;
  66.     if (special_key(sed, scancode))
  67.         return;
  68.     if (inter_field(sed, scancode))
  69.         return;
  70.     if (inter_page(sed, scancode))
  71.         return;
  72.  
  73.     switch(scancode) {
  74.     case BACKSPACE:
  75.         sed_PullLeft(sed);
  76.         strcpy(sed_GetScratchPad(sed), sed_GetCurrRecord(sed));
  77.         sed_SetCurrRecord(sed, strhex(sed_GetScratchPad(sed)));
  78.         sed_UpdateCurrField(sed);
  79.         break;
  80.     default:
  81.         /*     Overwrite leading zeroes. */
  82.         key = ascii(scancode);
  83.         if (isxdigit(key) && sed_GetChar(sed, 0) == '0') {
  84.             sed_PushLeft(sed, key);
  85.             strcpy(sed_GetScratchPad(sed), sed_GetCurrRecord(sed));
  86.             sed_SetCurrRecord(sed, strhex(sed_GetScratchPad(sed)));
  87.             sed_UpdateCurrField(sed);
  88.         }
  89.         break;
  90.     }
  91.  
  92.     /* reset baton */
  93.     sed_SetBaton(sed, -1);
  94. }
  95.  
  96. void hex_senter(sed, fieldno)
  97.     sed_type sed;
  98.     int fieldno;
  99. /*
  100.     Convert native type to string for record.
  101. */
  102. {
  103.     sprintf(sed_GetScratchPad(sed), "%x", *((int *) sed_GetVar(sed, fieldno)));
  104.  
  105.     strright(sed_GetScratchPad(sed), sed_GetRecordLen(sed, fieldno));
  106.     sed_SetRecord(sed, strhex(sed_GetScratchPad(sed)), fieldno);
  107.  
  108.     std_senter(sed, fieldno);
  109. }
  110.  
  111. void hex_sexit(sed, fieldno)
  112.     sed_type sed;
  113.     int fieldno;
  114. /*
  115.     Converts record back to native type.
  116. */
  117. {
  118.     if (sed_GetBaton(sed) != SED_ABORT) {
  119.         sscanf(sed_GetRecord(sed, fieldno), "%x", (int *) sed_GetVar(sed, fieldno));
  120.     }
  121. }
  122.  
  123. char *strhex(s)
  124.     char *s;
  125. /*
  126.     Formats a hexadecimal string
  127.     The string returned is a right justified hexadecimal
  128.     number padded out with leading zeroes.
  129. */
  130. {
  131.     char *p;
  132.  
  133.     for (p = s + strlen(s) - 1; p >= s; p--) {
  134.         if (*p == ' ')
  135.             *p = '0';
  136.     }
  137.  
  138.     return(s);
  139. }
  140.  
  141.  
  142.