fdhwlib
2.0.25
|
00001 /*************************************************************************** 00002 00003 keyboard.h - description 00004 00005 00006 00007 begin : Mon Jul 31 2000 00008 00009 copyright : (C) 2000 by Andreas Kopmann 00010 00011 email : kopmann@hpe.fzk.de 00012 00013 status : 00014 00015 test : 00016 00017 history : 00018 00019 ***************************************************************************/ 00020 00021 00022 00023 #ifndef _INC_KEYBOARD_39253AB201E3_INCLUDED 00024 #define _INC_KEYBOARD_39253AB201E3_INCLUDED 00025 00026 00027 00028 #ifdef __GNUC__ 00029 # include <cstdio> 00030 # include <unistd.h> 00031 # include <termios.h> 00032 #else 00033 # include <conio.h> 00034 #endif // __GNUC__ 00035 00036 00037 00038 00039 00047 //##ModelId=3991220101D7 00048 00049 class keyboard { 00050 00051 public: 00052 00053 //##ModelId=3991220101E4 00054 00055 keyboard(); 00056 00057 //##ModelId=3991220101E3 00058 00059 ~keyboard(); 00060 00061 00062 00063 //##ModelId=3991220101E2 00064 00065 inline bool hit(); 00066 00068 inline bool hit(char key); 00069 00070 //##ModelId=3991220101E1 00071 00072 inline char getchar(); 00073 00075 inline char *getpasswd(); 00076 00077 00079 char passwd[20]; 00080 00081 private: 00082 00083 00084 #ifdef __GNUC__ 00085 00086 00087 //##ModelId=399125540343 00088 00089 struct termios orig; 00090 00091 00092 00093 //##ModelId=399125540339 00094 00095 struct termios newt; 00096 00097 //##ModelId=3991220101D8 00098 00099 int peek; 00100 00101 #else 00102 00103 char key; 00104 00105 #endif 00106 00107 00108 00109 }; 00110 00111 00112 00113 00114 00115 inline keyboard::keyboard() 00116 00117 { 00118 00119 00120 00121 #ifdef __GNUC__ 00122 00123 peek = -1; 00124 00125 00126 00127 tcgetattr(0, &orig); 00128 00129 newt = orig; 00130 00131 newt.c_lflag &= ~ICANON; 00132 00133 newt.c_lflag &= ~ECHO; 00134 00135 newt.c_lflag &= ~ISIG; 00136 00137 newt.c_cc[VMIN] = 1; 00138 00139 newt.c_cc[VTIME] = 0; 00140 00141 tcsetattr(0, TCSANOW, &newt); 00142 00143 #endif 00144 00145 00146 00147 } 00148 00149 00150 00151 inline keyboard::~keyboard() 00152 00153 { 00154 00155 #ifdef __GNUC__ 00156 00157 tcsetattr(0,TCSANOW, &orig); 00158 00159 #endif 00160 00161 } 00162 00163 00164 00165 inline bool keyboard::hit() 00166 00167 { 00168 00169 00170 00171 #ifdef __GNUC__ 00172 00173 00174 char ch; 00175 int nread; 00176 00177 00178 00179 if(peek != -1) return 1; 00180 00181 newt.c_cc[VMIN]=0; 00182 00183 tcsetattr(0, TCSANOW, &newt); 00184 00185 nread = read(0,&ch,1); 00186 00187 newt.c_cc[VMIN]=1; 00188 00189 tcsetattr(0, TCSANOW, &newt); 00190 00191 00192 00193 if(nread == 1) { 00194 00195 peek = ch; 00196 00197 return 1; 00198 00199 } 00200 00201 00202 00203 #else 00204 00205 //_kbhit(); // ??? Where is the difference 00206 if ( _kbhit() ) { 00207 key = _getch(); 00208 return 1; 00209 } 00210 00211 00212 #endif 00213 00214 00215 00216 return 0; 00217 00218 00219 } 00220 00221 00222 00223 inline bool keyboard::hit(char key){ 00224 if (hit()) 00225 return( getchar() == key); 00226 else 00227 return(false); 00228 } 00229 00230 00231 00232 inline char keyboard::getchar() 00233 00234 { 00235 00236 #ifdef __GNUC__ 00237 00238 char ch; 00239 00240 00241 00242 if(peek != -1) { 00243 00244 ch = peek; 00245 00246 peek = -1; 00247 00248 return ch; 00249 00250 } 00251 00252 00253 00254 read(0,&ch,1); 00255 00256 return ch; 00257 00258 #else 00259 return(key); 00260 00261 #endif 00262 00263 00264 00265 } 00266 00267 00268 inline char * keyboard::getpasswd(){ 00269 char ch; 00270 int i; 00271 00272 // Clear password 00273 fflush(stdout); 00274 ch = 0; 00275 i = 0; 00276 while ((ch != '\n') && (ch != '\r') && (i<20)){ 00277 if (hit()){ 00278 ch = getchar(); 00279 switch (ch){ 00280 case '\n': 00281 case '\r': 00282 break; 00283 default: 00284 passwd[i] = ch; 00285 printf("*"); fflush(stdout); 00286 i++; 00287 break; 00288 } 00289 } 00290 } 00291 00292 passwd[i] = 0; 00293 printf("\n"); 00294 00295 return(passwd); 00296 00297 } 00298 00299 00300 00301 00302 #endif 00303