12
12
#include <termios.h>
13
13
14
14
#define BUFF 512 /* buffer size (see RFC 2812) */
15
- #define CMAX 92 /* max number of columns */
16
- #define GUTL 10 /* left gutter width and alignment */
17
15
18
16
static int conn ; /* socket connection */
19
17
static char sbuf [BUFF ]; /* string buffer */
20
18
static int verb = 0 ; /* verbose output (e.g. raw stream) */
19
+ static int cmax = 82 ;
20
+ static int gutl = 10 ;
21
21
static char * host = "irc.freenode.org" ; /* irc host address */
22
22
static char * chan = "kisslinux" ; /* channel */
23
23
static char * port = "6667" ; /* port */
@@ -55,7 +55,7 @@ raw(char *fmt, ...) {
55
55
vsnprintf (sbuf , BUFF , fmt , ap );
56
56
va_end (ap );
57
57
58
- if (verb ) printf ("<< \x1b[33m%s\x1b[0m " , sbuf );
58
+ if (verb ) printf ("<< %s " , sbuf );
59
59
60
60
write (conn , sbuf , strlen (sbuf ));
61
61
}
@@ -82,32 +82,33 @@ con(void) {
82
82
static void
83
83
printw (const char * format , ...) {
84
84
85
- int s1 = 0 , s2 , i , o ;
85
+ int s1 = 0 , s2 , len , i ;
86
86
va_list argptr ;
87
87
char line [BUFF + 1 ];
88
88
89
89
va_start (argptr , format );
90
90
vsnprintf (line , BUFF + 1 , format , argptr );
91
91
va_end (argptr );
92
92
93
- if (strlen (line ) <= CMAX ) printf ("%s" , line );
94
- else if (strlen (line ) > CMAX ) {
93
+ len = strlen (line );
94
+ if (len <= cmax + gutl ) printf ("%s" , & line [0 ]);
95
+ else if (len > cmax + gutl ) {
95
96
96
- for (i = 0 ; i < CMAX ; i ++ ) {
97
- if (line [i ] == ' ' ) s1 = i ;
98
- if (i == CMAX - 1 ) printf ("%-*.*s\n" , s1 , s1 , line );
97
+ for (i = gutl ; i < cmax + gutl ; i ++ ) {
98
+ if (isspace ( line [i ]) ) s1 = i ;
99
+ if (i == cmax + gutl - 1 ) printf ("%-*.*s\n" , s1 , s1 , & line [ 0 ] );
99
100
}
100
101
101
- s2 = o = s1 ;
102
+ s2 = s1 ;
102
103
103
104
for (i = s1 ; line [i ] != '\0' ; i ++ ) {
104
- if (line [i ] == ' ' ) s2 = i ;
105
- if ((i - o ) == (CMAX - GUTL )) {
106
- printf ("%*s %-*.*s\n" , GUTL , " " , s2 - o , s2 - o , & line [o + 1 ]);
107
- o = i = s2 ;
105
+ if (isspace ( line [i ]) ) s2 = i ;
106
+ if ((i - s1 ) == (cmax - gutl )) {
107
+ printf ("%*s %-*.*s\n" , gutl , "" , s2 - s1 , s2 - s1 , & line [s1 + 1 ]);
108
+ s1 = s2 ;
108
109
}
109
110
else if (line [i + 1 ] == '\0' ) {
110
- printf ("%*s %-*.*s" , GUTL , " " , i - o , i - o , & line [o + 1 ]);
111
+ printf ("%*s %-*.*s" , gutl , "" , i - s1 , i - s1 , & line [s1 + 1 ]);
111
112
}
112
113
}
113
114
}
@@ -128,7 +129,7 @@ pars(int sl, char *buf) {
128
129
buf_c [o + 1 ] = '\0' ;
129
130
o = -1 ;
130
131
131
- if (verb ) printf (">> \x1b[33m%s\x1b[0m " , buf_c );
132
+ if (verb ) printf (">> %s " , buf_c );
132
133
133
134
if (!strncmp (buf_c , "PING" , 4 )) {
134
135
buf_c [1 ] = 'O' ;
@@ -143,15 +144,13 @@ pars(int sl, char *buf) {
143
144
if (!strncmp (ltr , "001" , 3 )) raw ("JOIN #%s\r\n" , chan );
144
145
145
146
if (!strncmp (ltr , "QUIT" , 4 )) {
146
- printw ("%*.*s \x1b[34;1m%s\x1b[0m left %s\n" , \
147
- GUTL , GUTL , "<--" , nic , cha );
147
+ printw ("%*.*s \x1b[34;1m%s\x1b[0m\n" , gutl , gutl , "<--" , nic );
148
148
}
149
149
else if (!strncmp (ltr , "JOIN" , 4 )) {
150
- printw ("%*.*s \x1b[32;1m%s\x1b[0m joined %s\n" , \
151
- GUTL , GUTL , "-->" , nic , cha );
150
+ printw ("%*.*s \x1b[32;1m%s\x1b[0m\n" , gutl , gutl , "-->" , nic );
152
151
}
153
152
else {
154
- printw ("\x1b[1m%*.*s\x1b[0m %s\n" , GUTL , GUTL , nic , msg );
153
+ printw ("\x1b[33; 1m%*.*s\x1b[0m %s\n" , gutl , gutl , nic , msg );
155
154
}
156
155
}
157
156
}
@@ -163,11 +162,14 @@ main(int argc, char **argv) {
163
162
164
163
int fd [2 ], cval ;
165
164
166
- while ((cval = getopt (argc , argv , "s:p:n:k:c:vV" )) != -1 ) {
165
+
166
+ while ((cval = getopt (argc , argv , "s:p:n:k:c:w:W:vV" )) != -1 ) {
167
167
switch (cval ) {
168
168
case 'v' : puts ("kirc 0.0.1" ); break ;
169
169
case 'V' : verb = 1 ; break ;
170
170
case 's' : host = optarg ; break ;
171
+ case 'w' : gutl = atoi (optarg ); break ;
172
+ case 'W' : cmax = atoi (optarg ); break ;
171
173
case 'p' : port = optarg ; break ;
172
174
case 'n' : nick = optarg ; break ;
173
175
case 'k' : pass = optarg ; break ;
@@ -189,46 +191,64 @@ main(int argc, char **argv) {
189
191
pid_t pid = fork ();
190
192
191
193
if (pid == 0 ) {
192
- int sl , i , j ;
193
- char u [CMAX ];
194
+ int sl , i ;
195
+ char u [cmax ];
194
196
195
197
con ();
196
198
197
199
while ((sl = read (conn , sbuf , BUFF ))) {
198
200
pars (sl , sbuf );
199
- if (read (fd [0 ], u , CMAX ) > 0 ) {
201
+ if (read (fd [0 ], u , cmax ) > 0 ) {
200
202
for (i = 0 ; u [i ] != '\n' ; i ++ ) continue ;
201
- for (j = i ; j < CMAX ; j ++ ) u [j ] = ' ' ;
202
- if (!strstr (u , "WAIT_SIG" )) raw ("%-*.*s\r\n" , i , i , u );
203
+ if (u [0 ] != ':' ) raw ("%-*.*s\r\n" , i , i , u );
203
204
}
204
205
}
205
- printf ("(press <ENTER> to quit)\n " );
206
+ printf ("%*s \x1b[31mpress <RETURN> key to quit...\x1b[0m" , gutl , " " );
206
207
}
207
208
else {
208
- char usrin [CMAX ];
209
+ char usrin [cmax ], val1 [ cmax ], val2 [ 20 ];
209
210
210
211
while (waitpid (pid , NULL , WNOHANG ) == 0 ) {
211
212
while (!kbhit () && waitpid (pid , NULL , WNOHANG ) == 0 ) {
212
- write (fd [1 ], "WAIT_SIG" , CMAX );
213
+ dprintf (fd [1 ], ":\n" );
213
214
}
214
215
215
- fgets (usrin , CMAX , stdin );
216
-
217
- if (usrin [0 ] == ':' && usrin [1 ]) {
218
- char * cmd_val = & usrin [2 ];
216
+ fgets (usrin , cmax , stdin );
219
217
218
+ if (usrin [0 ] == ':' ) {
220
219
switch (usrin [1 ]) {
221
220
case 'q' :
222
221
dprintf (fd [1 ],"quit\n" );
223
222
break ;
224
223
case 'm' :
225
- while (isspace (* cmd_val )) cmd_val ++ ;
226
- dprintf (fd [1 ], "privmsg #%s :%s" , chan , cmd_val );
224
+ sscanf (usrin , ":m %[^\n]\n" , val1 );
225
+ dprintf (fd [1 ], "privmsg #%s :%s\n" , chan , val1 );
226
+ break ;
227
+ case 'n' :
228
+ sscanf (usrin , ":n %[^\n]\n" , val1 );
229
+ dprintf (fd [1 ], "privmsg nickserv :%s\n" , val1 );
230
+ break ;
231
+ case 'j' :
232
+ sscanf (usrin , ":j %[^\n]\n" , val1 );
233
+ dprintf (fd [1 ], "join %s\n" , val1 );
234
+ break ;
235
+ case 'p' :
236
+ sscanf (usrin , ":p %[^\n]\n" , val1 );
237
+ dprintf (fd [1 ], "part %s\n" , val1 );
238
+ break ;
239
+ case 'M' :
240
+ sscanf (usrin , ":M %s %[^\n]\n" , val2 , val1 );
241
+ dprintf (fd [1 ], "privmsg %s :%s\n" , val2 , val1 );
242
+ break ;
243
+ case '\n' :
244
+ break ;
245
+ default :
246
+ printf ("\x1b[31munknown ':%c' \x1b[0m\n" , usrin [1 ]);
227
247
break ;
228
248
}
229
249
}
230
250
else {
231
- write (fd [1 ], usrin , CMAX );
251
+ dprintf (fd [1 ], "%s" , usrin );
232
252
}
233
253
fflush (stdout );
234
254
}
0 commit comments