1212#include "str.h"
1313#include "xtime.h"
1414
15+ #define XBAR_FRAME_BYTES 3
16+ #define XCLI_PERCENT_MAX 4
17+
18+ XSTATUS XCLI_SetInputMode (void * pAttributes )
19+ {
1520#ifdef __linux__
16- #include <termios.h>
21+ struct termios tattr ;
22+ if (!isatty (STDIN_FILENO )) return XSTDERR ;
23+
24+ struct termios * pSavedAttrs = (struct termios * )pAttributes ;
25+ tcgetattr (STDIN_FILENO , pSavedAttrs );
26+ tcgetattr (STDIN_FILENO , & tattr );
27+
28+ tattr .c_lflag &= ~(ICANON | ECHO );
29+ tattr .c_cc [VMIN ] = 1 ;
30+ tattr .c_cc [VTIME ] = 0 ;
31+ tcsetattr (STDIN_FILENO , TCSANOW , & tattr );
32+ return XSTDOK ;
33+ #else
34+ (void )pAttributes ;
35+ return XSTDNON ;
1736#endif
37+ }
1838
19- #define XBAR_FRAME_BYTES 3
20- #define XCLI_PERCENT_MAX 4
39+ XSTATUS XCLI_RestoreAttributes (void * pAttributes )
40+ {
41+ #ifdef __linux__
42+ if (pAttributes == NULL ) return XSTDERR ;
43+ struct termios * pSavedAttrs = (struct termios * )pAttributes ;
44+ tcsetattr (STDIN_FILENO , TCSANOW , pSavedAttrs );
45+ return XSTDOK ;
46+ #else
47+ (void )pAttributes ;
48+ return XSTDNON ;
49+ #endif
50+ }
2151
22- int XCLI_GetPass ( const char * pText , char * pPass , size_t nSize )
52+ XSTATUS XCLI_ReadStdin ( char * pBuffer , size_t nSize , xbool_t bAsync )
2353{
54+ if (pBuffer == NULL || !nSize ) return XSTDINV ;
55+ int nLength = XSTDNON ;
56+ pBuffer [0 ] = XSTR_NUL ;
57+
58+ #ifdef __linux__
59+ if (bAsync )
60+ {
61+ int flags = fcntl (STDIN_FILENO , F_GETFL , 0 );
62+ if (flags < 0 ) return XSTDERR ;
63+
64+ if (!(flags & O_NONBLOCK ))
65+ fcntl (STDIN_FILENO , F_SETFL , flags | O_NONBLOCK );
66+ }
67+
68+ nLength = read (STDIN_FILENO , pBuffer , nSize );
69+ if (nLength < 0 )
70+ {
71+ if (errno == EWOULDBLOCK ||
72+ errno == EAGAIN ) return XSTDNON ;
73+
74+ return XSTDERR ;
75+ }
76+ #endif
77+
78+ if (nSize > 1 ) pBuffer [nLength ] = 0 ;
79+ return nLength ;
80+ }
81+
82+ XSTATUS XCLI_GetChar (char * pChar , xbool_t bAsync )
83+ {
84+ #ifdef __linux__
85+ if (pChar == NULL ) return XSTDERR ;
86+ return XCLI_ReadStdin (pChar , 1 , bAsync );
87+ #else
88+ (void )pChar ;
89+ return XSTDNON ;
90+ #endif
91+ }
92+
93+ XSTATUS XCLI_GetPass (const char * pText , char * pPass , size_t nSize )
94+ {
95+ if (pPass == NULL || !nSize ) return XSTDERR ;
2496 size_t nLength = XSTDNON ;
97+
2598#ifdef __linux__
2699 struct termios oflags , nflags ;
27100 tcgetattr (fileno (stdin ), & oflags );
@@ -43,10 +116,10 @@ int XCLI_GetPass(const char *pText, char *pPass, size_t nSize)
43116#endif
44117
45118 pPass [nLength ] = 0 ;
46- return (int )nLength ;
119+ return (XSTATUS )nLength ;
47120}
48121
49- int XCLI_GetInput (const char * pText , char * pInput , size_t nSize , xbool_t bCutNewLine )
122+ XSTATUS XCLI_GetInput (const char * pText , char * pInput , size_t nSize , xbool_t bCutNewLine )
50123{
51124 XASSERT (pInput , XSTDINV );
52125 pInput [0 ] = XSTR_NUL ;
0 commit comments