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

  1. /*
  2.     fnsecure.c         10/24/86
  3.  
  4.     % secure_funcs
  5.  
  6.     Editting functions for fields which do not print
  7.     out to the screen.  (i.e.) passwords.
  8.  
  9.     When a letter is typed in a MASK character is printed to the screen;
  10.     however, the field's variable maintains the correct value.
  11.  
  12.     SED_ABORT suppresses field formating.
  13.  
  14.     The RIGHT and LEFT keys don't do anything.
  15.  
  16.     C-scape 3.2
  17.     Copyright (c) 1986 - 1990 by Oakland Group, Inc.
  18.     ALL RIGHTS RESERVED.
  19.  
  20.     Revision History:
  21.     -----------------
  22.      4/06/88 jmd     added call to sed_DoSpecial
  23.      5/12/88 jmd    added calls to sed_GetScratchPad()
  24.      6/23/88 jmd     added casting to char * for sed_GetVar
  25.      9/17/88 jmd     added std_ funcs
  26.     10/14/88 jdc    added var_size element to field_funcs_struct
  27.  
  28.      6/07/89 jmd    added test for mouse code (later removed)
  29.      3/28/90 jmd    ansi-fied
  30.      6/13/90 jdc    replaced backwards pointer math
  31.      8/05/90 jdc    added secure_fexit for formatting
  32.      8/26/90 mla    fixed weird backspace case & added del case
  33. */
  34.  
  35. #include <stdio.h>
  36. #include <string.h>
  37. #include <ctype.h>
  38.  
  39. #include "cscape.h"
  40. #include "fnfunc.h"            /* for field functions */
  41. #include "scancode.h"
  42.  
  43. #define    MASK    '*'
  44.  
  45. OGLOBAL field_funcs_struct secure_funcs = {
  46.     std_fenter,
  47.     secure_fexit,
  48.     secure_fkey,
  49.     secure_senter,
  50.     FNULL,
  51.     VAR_STRING
  52. };
  53.  
  54. void secure_fkey(sed_type sed)
  55. {
  56.     int scancode, key;
  57.  
  58.     scancode = kb_Read();
  59.  
  60.     if (sed_DoSpecial(sed, scancode))
  61.         return;
  62.     if (special_key(sed, scancode))
  63.         return;
  64.     if (inter_field(sed, scancode))
  65.         return;
  66.     if (inter_page(sed, scancode))
  67.         return;
  68.  
  69.     switch(scancode) {
  70.     case DEL:
  71.     case BACKSPACE:
  72.         if (sed_GetRecordPos(sed) == sed_GetCurrRecordLen(sed) -1 
  73.                 && sed_GetCurrChar(sed) == MASK) {
  74.             sed_PullRight(sed);
  75.             ((char *) sed_GetCurrVar(sed))[sed_GetRecordPos(sed)] = '\0';
  76.         }
  77.         else {
  78.             if ( sed_DecChar(sed) ) {
  79.                 sed_PullRight(sed);
  80.                 ((char *) sed_GetCurrVar(sed))[sed_GetRecordPos(sed)] = '\0';
  81.             }
  82.         }
  83.         break;
  84.     default:
  85.  
  86.         key = ascii(scancode);
  87.         if (isprint(key)){
  88.             ((char *) sed_GetCurrVar(sed))[sed_GetRecordPos(sed)] = (char) key;
  89.             ((char *) sed_GetCurrVar(sed))[sed_GetRecordPos(sed)+1] = '\0';
  90.             sed_Overwrite(sed, MASK);
  91.             sed_IncChar(sed);
  92.         }
  93.         break;
  94.     }
  95.  
  96.     /* reset baton */
  97.     sed_SetBaton(sed, -1);
  98. }
  99.  
  100. void secure_senter(sed_type sed, int fieldno)
  101. /*
  102.     Convert native type to string for record.
  103. */
  104. {
  105.     char *s;
  106.     int i;
  107.  
  108.     /* mask the record */
  109.     s = sed_GetScratchPad(sed);
  110.     strcpy(s, (char *) sed_GetVar(sed, fieldno));
  111.  
  112.     for (i = strlen(s) - 1; i >= 0; i--) {
  113.  
  114.         if (s[i] != ' ') {
  115.             s[i] = MASK;
  116.         }
  117.     }
  118.  
  119.     sed_SetRecord(sed, s, fieldno);
  120. }
  121.  
  122. boolean secure_fexit(sed_type sed)
  123. {
  124.     if (sed_GetBaton(sed) != SED_ABORT) {
  125.  
  126.         /* format the field */
  127.         strcpy(sed_GetScratchPad(sed), sed_GetCurrRecord(sed));
  128.         sed_SetCurrRecord(sed, (char *)sed_GetCurrVar(sed));
  129.  
  130.         if (valid_Format(sed, sed_GetFieldNo(sed), (char *) sed_GetCurrFieldData(sed, 2))) {
  131.  
  132.             strcpy((char *)sed_GetCurrVar(sed), sed_GetCurrRecord(sed));
  133.         }
  134.         sed_SetCurrRecord(sed, sed_GetScratchPad(sed));
  135.     }
  136.  
  137.     return(std_fexit(sed));
  138. }
  139.