⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 getkey.c

📁 des算法的一种升级算法
💻 C
字号:
#include <string.h>
#include <fcntl.h>

#ifndef BSD		/* System V */
#include <sys/ioctl.h>
#include <termio.h>

#define GETMODES	TCGETA
#define	SETMODES	TCSETA
#define	TTYFLAGS	c_lflag
#define	MODETYPE	termio
#endif

#ifdef BSD
#include <sgtty.h>

#define GETMODES	TIOCGETP
#define	SETMODES	TIOCSETN
#define	TTYFLAGS	sg_flags 
#define	MODETYPE	sgttyb
#endif

#ifndef MSDOS
#include <signal.h>

int setEcho(fd, echo)
   int fd;
   int echo;
{  
   struct MODETYPE modes;
   int res, oldecho;

   res = ioctl(fd, GETMODES, &modes);
   oldecho = modes.TTYFLAGS & ECHO;
   if (echo >= 0) {
      if (echo) {
	 modes.TTYFLAGS |= ECHO;
      } else {
	 modes.TTYFLAGS &= ~ECHO;
      }
      res = ioctl(fd, SETMODES, &modes);
   }
   return oldecho;
}

static void (*oldSigInt)();
static int  oldEcho = 1;			/* assume echo was on */
static int  fd = -1;

void intHandler()
{
   setEcho(fd, oldEcho);			/* restore echoing */
   close(fd);					/* close /dev/tty */
   (void) signal(SIGINT, oldSigInt);		/* restore old handler */
   kill(getpid(), SIGINT);			/* invoke old handler */
}

/*
 * A machine dependent function to prompt for and read a keystring from stdin
 *
 * Input:
 *   prompt - A string output to display prior to requesting input
 *   str    - where to put the characters
 *   size   - the number of storage locations reserved for the key
 *    
 * Returns: 
 *    The number of characters read (not counting terminating '\n')
 *
 * Reads in upto <size> characters from the terminal.  Terminated by EOF
 * or '\n'.  String will be '\0' terminated if its less than size bytes.
 */
int getkey(prompt, str, size)
   char *prompt;
   char *str;
   register unsigned size;
{
   int count, len;
   char buf[1], *chp = str;;

   fd = open("/dev/tty", O_RDWR);
   if (fd < 0) return fd;
   oldSigInt = signal(SIGINT, intHandler);
   oldEcho = setEcho(fd, 0);		/* disable printing of input */

   len   = strlen(prompt);
   count = write(fd, prompt, len);

   if (size != 0) do {
      count = read(fd, buf, 1);
      if (count != 1) break;
      if (buf[0] == '\n') break;
      *chp++ = buf[0];
   } while (--size != 0);
 
   if (size != 0) {
      *chp = '\0';
   }
   write(fd, "\n", 1);			/* goto next line */
   setEcho(fd, oldEcho);		/* restore echo to previous state */
   (void) signal(SIGINT, oldSigInt);
   close(fd);
   return chp - str;
}
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -