-
Notifications
You must be signed in to change notification settings - Fork 0
/
gregg_stdin.c
146 lines (136 loc) · 5.21 KB
/
gregg_stdin.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
/*============================[[ beg-code ]]============================*/
#include "gregg.h"
static char s_ready = '-';
static char s_recd [LEN_RECD] = "";
static int s_line = 0;
char
STDIN_check (void)
{
/*---(locals)-----------+-----------+-*/
char rce = -10; /* return code for errors */
char rc = 0;
int x_flags = 0;
int x_ch = ' ';
/*---(header)-------------------------*/
DEBUG_INPT yLOG_enter (__FUNCTION__);
/*---(set stdin to non-blocking)------*/
DEBUG_INPT yLOG_note ("make stdin non-blocking");
x_flags = fcntl(0, F_GETFL, 0);
rc = fcntl (stdin, F_SETFL, x_flags | O_NONBLOCK);
DEBUG_INPT yLOG_value ("rc" , rc);
/*> --rce; if (rc < 0) { <*
*> DEBUG_INPT yLOG_note ("can not set to non-blocking"); <*
*> DEBUG_INPT yLOG_exitr (__FUNCTION__, rce); <*
*> return rce; <*
*> } <*/
/*---(test stdin for input)-----------*/
DEBUG_INPT yLOG_note ("test for input on stdin");
x_ch = getc (stdin);
DEBUG_INPT yLOG_value ("x_ch" , x_ch);
--rce; if (x_ch == -1) {
DEBUG_INPT yLOG_note ("no input available");
DEBUG_INPT yLOG_exitr (__FUNCTION__, rce);
return rce;
}
/*---(put stdin back to normal)-------*/
DEBUG_INPT yLOG_note ("put stdin back to normal");
ungetc (x_ch, stdin);
rc = fcntl (0, F_SETFL, x_flags);
DEBUG_INPT yLOG_value ("rc" , rc);
/*> --rce; if (rc < 0) { <*
*> DEBUG_INPT yLOG_note ("can not set to back to normal"); <*
*> DEBUG_INPT yLOG_exitr (__FUNCTION__, rce); <*
*> return rce; <*
*> } <*/
/*---(set as ready)-------------------*/
s_ready = 'y';
/*---(complete)-----------------------*/
DEBUG_INPT yLOG_exit (__FUNCTION__);
return 0;
}
char
STDIN_getline (void)
{
/*---(locals)-----------+-----+-----+-*/
char rce = -10;
char rc = 0;
int x_len = 0;
/*---(begin)----------------------------*/
DEBUG_INPT yLOG_enter (__FUNCTION__);
/*---(defense)------------------------*/
DEBUG_INPT yLOG_char ("s_ready" , s_ready);
--rce; if (s_ready != 'y') {
DEBUG_INPT yLOG_exitr (__FUNCTION__, rce);
return rce;
}
/*---(find a record)------------------*/
while (1) {
/*---(read)------------------------*/
if (feof (stdin)) {
DEBUG_INPT yLOG_exitr (__FUNCTION__, rce);
return rce;
}
fgets (s_recd, LEN_RECD, stdin);
++s_line;
/*---(filter)----------------------*/
if (s_recd [0] == '\0') continue;
if (s_recd [0] == '#') continue;
if (s_recd [0] == ' ') continue;
/*---(clean-up)--------------------*/
x_len = strlen (s_recd);
if (x_len <= 1) continue;
if (s_recd [x_len - 1] == '\n') s_recd [--x_len] = '\0';
DEBUG_INPT yLOG_info ("s_recd" , s_recd);
break;
}
/*---(complete)-----------------------*/
DEBUG_INPT yLOG_exit (__FUNCTION__);
return 0;
}
char
STDIN_handler (void)
{
/*---(local variables)--+-----------+-*/
char rce = -10; /* return code for errors */
char rc = 0; /* return code for character */
int x_len = 0; /* input record length */
/*---(header)-------------------------*/
DEBUG_INPT yLOG_enter (__FUNCTION__);
/*---(prepare)------------------------*/
s_line = 0;
s_ready = '-';
/*---(check for input)----------------*/
rc = STDIN_check ();
--rce; if (rc < 0) {
DEBUG_INPT yLOG_exitr (__FUNCTION__, rce);
return rce;
}
/*---(begin page)---------------------*/
if (strchr (RUN_WRITING, my.run_mode) != NULL) REVERSE_page_beg ();
/*---(process file)-------------------*/
DEBUG_INPT yLOG_note ("start reading file");
while (1) {
/*---(take in a line)--------------*/
rc = STDIN_getline ();
if (rc < 0) break; /* end-of-input */
/*---(handle line)-----------------*/
switch (my.run_mode) {
case RUN_ENGLISH :
REVERSE_english_text (s_recd, SHAPE_DRAW, 1, '-');
break;
case RUN_GREGG :
REVERSE_gregg_text (s_recd, SHAPE_DRAW, 1, '-');
break;
case RUN_CONVERT :
break;
case RUN_EXACT :
break;
case RUN_REVERSE :
break;
}
}
if (strchr (RUN_WRITING, my.run_mode) != NULL) REVERSE_page_end ();
/*---(complete)-----------------------*/
DEBUG_INPT yLOG_exit (__FUNCTION__);
return 0;
}