mess822x 1.23
mess822x
Loading...
Searching...
No Matches
822received.c
Go to the documentation of this file.
1#include <sys/types.h>
2#include <time.h>
3#include "buffer.h"
4#include "logmsg.h"
5#include "getln.h"
6#include "mess822.h"
7#include "exit.h"
8#include "leapsecs.h"
9#include "caltime.h"
10#include "tai.h"
11#include "case.h"
12
13#define WHO "822received"
14
15static void nomem()
16{
17 logmsg(WHO,111,FATAL,"out of memory");
18}
19
21struct tai sec;
22unsigned char secpack[TAI_PACK];
23time_t secunix;
24
25stralloc tokens = {0};
26
27stralloc line = {0};
28
29static void doit()
30{
31 int i;
32 int j;
33 int state;
34 char ch;
35 char *x;
36
37 for (i = 0; i < line.len; ++i)
38 if (line.s[i] == 0)
39 line.s[i] = '\n';
40 if (!stralloc_0(&line)) nomem();
41
42 t.known = 0;
43 if (!mess822_token(&tokens,line.s)) nomem();
44 if (!mess822_when(&t,line.s)) nomem();
45 --line.len;
46
47 if (!t.known)
48 buffer_puts(buffer_1,"\t\t\t");
49 else {
51 tai_pack((char *)secpack,&sec);
52 secunix = secpack[0] - 64;
53 secunix = (secunix << 8) + secpack[1];
54 secunix = (secunix << 8) + secpack[2];
55 secunix = (secunix << 8) + secpack[3];
56 secunix = (secunix << 8) + secpack[4];
57 secunix = (secunix << 8) + secpack[5];
58 secunix = (secunix << 8) + secpack[6];
59 secunix = (secunix << 8) + secpack[7];
60 secunix -= 10;
61 buffer_put(buffer_1,ctime(&secunix),24);
62 }
63 buffer_puts(buffer_1," ");
64
65 state = 1;
66 /* 1: start; 2: middle; 3: immediately after space; 4: after semicolon */
67
68 for (j = i = 0; j < tokens.len; ++j)
69 if (!tokens.s[j]) {
70 x = tokens.s + i;
71 if (*x == '(') {
72#ifdef notdef
73 if (state == 3)
74 buffer_puts(buffer_1,"\n\t\t\t ");
75#endif
76 buffer_puts(buffer_1,"(");
77 while ((ch = tokens.s[++i])) {
78 if (ch == '\n') ch = 0;
79 buffer_put(buffer_1,&ch,1);
80 }
81 buffer_puts(buffer_1,")");
82 if (state & 1) state = 2;
83 }
84 else if (*x == '|') {
85 if (state == 3)
86 if (!case_diffs(x,"|from")
87 ||!case_diffs(x,"|by")
88 ||!case_diffs(x,"|for")
89 ||!case_diffs(x,"|id")
90 )
91 buffer_puts(buffer_1,"\n\t\t\t ");
92 while ((ch = tokens.s[++i])) {
93 if (ch == '\n') ch = 0;
94 buffer_put(buffer_1,&ch,1);
95 }
96 if (state & 1) state = 2;
97 }
98 else if (*x == ';') {
99 if ((state == 2) || (state == 3))
100 buffer_puts(buffer_1,"\n\t\t\t ");
101 state = 4;
102 buffer_puts(buffer_1,";");
103 if (state & 1) state = 2;
104 }
105 else if ((*x == ' ') || (*x == '\t')) {
106 if ((state != 1) && (state != 3))
107 buffer_puts(buffer_1," ");
108 if (state == 2) state = 3;
109 }
110 else {
111 buffer_put(buffer_1,tokens.s + i,1);
112 if (state & 1) state = 2;
113 }
114 i = j + 1;
115 }
116
117 buffer_puts(buffer_1,"\n");
118}
119
120stralloc received = {0};
121
124 { "received:", 0, 0, &received, 0, 0, 0 }
125, { 0, 0, 0, 0, 0, 0, 0 }
126} ;
127
128int main(int argc,char **argv)
129{
130 int i;
131 int j;
132 int match;
133
134 if (leapsecs_init() == -1)
135 logmsg(WHO,111,FATAL,"unable to init leapsecs: ");
136
137 if (!mess822_begin(&h,a)) nomem();
138 for (;;) {
139 if (getln(buffer_0,&line,&match,'\n') == -1)
140 logmsg(WHO,111,FATAL,"unable to read input: ");
141 if (!mess822_ok(&line)) break;
142 if (!mess822_line(&h,&line)) nomem();
143 if (!match) break;
144 }
145 if (!mess822_end(&h)) nomem();
146
147 i = 0;
148 j = received.len;
149 for (;;) {
150 if (!j || (received.s[j - 1] == '\n')) {
151 if (i >= j) {
152 if (!stralloc_copyb(&line,received.s + j,i - j)) nomem();
153 doit();
154 }
155 if (!j) break;
156 i = j - 1;
157 }
158 --j;
159 }
160
161 buffer_flush(buffer_1);
162 _exit(0);
163}
mess822_action a[]
Definition: 822received.c:123
stralloc tokens
Definition: 822received.c:25
struct tai sec
Definition: 822received.c:21
mess822_header h
Definition: 822received.c:122
stralloc line
Definition: 822received.c:27
time_t secunix
Definition: 822received.c:23
stralloc received
Definition: 822received.c:120
#define WHO
Definition: 822received.c:13
unsigned char secpack[TAI_PACK]
Definition: 822received.c:22
mess822_time t
Definition: 822received.c:20
int main()
Definition: 822print.c:351
int match
Definition: 822body.c:10
int leapsecs_init(void)
Definition: leapsecs_init.c:5
int mess822_when(mess822_time *, char *)
Definition: mess822_when.c:9
int mess822_line(mess822_header *, stralloc *)
Definition: mess822_line.c:107
int mess822_end(mess822_header *)
Definition: mess822_line.c:26
int mess822_ok(stralloc *)
Definition: mess822_ok.c:4
#define MESS822_HEADER
Definition: mess822.h:48
int mess822_begin(mess822_header *, mess822_action *)
Definition: mess822_line.c:5
int mess822_token(stralloc *, char *)
Definition: mess822_token.c:5
void caltime_tai(struct caltime *ct, struct tai *t)
Definition: caltime_tai.c:8
int known
Definition: mess822.h:9
struct caltime ct
Definition: mess822.h:8