/[LeafOK_CVS]/pvpgn-1.7.4/src/client/client.c
ViewVC logotype

Annotation of /pvpgn-1.7.4/src/client/client.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1.1.1 - (hide annotations) (vendor branch)
Tue Jun 6 03:41:38 2006 UTC (19 years, 9 months ago) by sysadm
Branch: GNU, MAIN
CVS Tags: arelease, HEAD
Changes since 1.1: +0 -0 lines
Content type: text/x-csrc
no message

1 sysadm 1.1 /*
2     * Copyright (C) 1998,1999,2000 Ross Combs (rocombs@cs.nmsu.edu)
3     * Copyright (C) 1999 Oleg Drokin (green@ccssu.ccssu.crimea.ua)
4     *
5     * This program is free software; you can redistribute it and/or
6     * modify it under the terms of the GNU General Public License
7     * as published by the Free Software Foundation; either version 2
8     * of the License, or (at your option) any later version.
9     *
10     * This program is distributed in the hope that it will be useful,
11     * but WITHOUT ANY WARRANTY; without even the implied warranty of
12     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13     * GNU General Public License for more details.
14     *
15     * You should have received a copy of the GNU General Public License
16     * along with this program; if not, write to the Free Software
17     * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18     */
19     #include "common/setup_before.h"
20     #include <stdio.h>
21     #ifdef STDC_HEADERS
22     # include <stdlib.h>
23     #endif
24     #ifdef HAVE_STRING_H
25     # include <string.h>
26     #else
27     # ifdef HAVE_STRINGS_H
28     # include <strings.h>
29     # endif
30     #endif
31     #include "compat/strrchr.h"
32     #ifdef HAVE_UNISTD_H
33     # include <unistd.h>
34     #endif
35     #include "compat/read.h"
36     #ifdef HAVE_SYS_IOCTL_H
37     # include <sys/ioctl.h>
38     #endif
39     #ifdef HAVE_SYS_TYPES_H
40     # include <sys/types.h>
41     #endif
42     #ifdef HAVE_SYS_SOCKET_H
43     # include <sys/socket.h>
44     #endif
45     #include "compat/socket.h"
46     #include "compat/psock.h"
47     #include "common/packet.h"
48     #include "common/network.h"
49     #ifdef WIN32
50     # include <conio.h> /* for kbhit() and getch() */
51     #endif
52     #include "client.h"
53     #include "common/setup_after.h"
54    
55    
56     extern int client_blocksend_packet(int sock, t_packet const * packet)
57     {
58     unsigned int size=0;
59    
60     for (;;)
61     switch (net_send_packet(sock,packet,&size))
62     {
63     case -1:
64     return -1;
65    
66     case 0:
67     continue;
68    
69     default:
70     return 0;
71     }
72     }
73    
74    
75     extern int client_blockrecv_packet(int sock, t_packet * packet)
76     {
77     unsigned int size=0;
78    
79     for (;;)
80     switch (net_recv_packet(sock,packet,&size))
81     {
82     case -1:
83     return -1;
84    
85     case 0:
86     continue;
87    
88     default:
89     /* printf("Got packet len %u/%u type 0x%04x\n",size,packet_get_size(packet),packet_get_type(packet)); */
90     return 0;
91     }
92     }
93    
94    
95     extern int client_blockrecv_raw_packet(int sock, t_packet * packet, unsigned int len)
96     {
97     unsigned int size=0;
98    
99     packet_set_size(packet,len);
100     for (;;)
101     switch (net_recv_packet(sock,packet,&size))
102     {
103     case -1:
104     return -1;
105     case 0:
106     continue;
107     case 1:
108     default:
109     return 0;
110     }
111     }
112    
113    
114     extern int client_get_termsize(int fd, unsigned int * w, unsigned int * h)
115     {
116     if (fd<0 || !w || !h)
117     return -1;
118    
119     *w = 0;
120     *h = 0;
121    
122     #ifdef HAVE_IOCTL
123     #ifdef TIOCGWINSZ
124     {
125     struct winsize ws;
126    
127     if (ioctl(fd,TIOCGWINSZ,&ws)>=0)
128     {
129     *w = (unsigned int)ws.ws_col;
130     *h = (unsigned int)ws.ws_row;
131     }
132     }
133     #endif
134     #endif
135    
136     #ifdef HAVE_GETENV
137     {
138     char const * str;
139     int val;
140    
141     if (!*w && (str = getenv("COLUMNS")) && (val = atoi(str))>0)
142     *w = val;
143     if (!*h && (str = getenv("LINES")) && (val = atoi(str))>0)
144     *h = val;
145     }
146     #endif
147    
148     if (!*w)
149     *w = DEF_SCREEN_WIDTH;
150     if (!*h)
151     *h = DEF_SCREEN_HEIGHT;
152    
153     return 0;
154     }
155    
156    
157     /* This routine gets keyboard input. It handles printing the prompt, cursor positioning, and
158     text scrolling. It unfortunatly assumes that the chars read from stdin are in ASCII. */
159     /* visible: -1=nothing, 0=prompt only, 1=prompt and text */
160     extern int client_get_comm(char const * prompt, char * text, unsigned int maxlen, unsigned int * curpos, int visible, int redraw, unsigned int width)
161     {
162     char temp;
163     unsigned int addlen;
164     unsigned int i;
165     unsigned int count;
166     int beg_pos;
167    
168     for (count=0; count<16; count++)
169     {
170     beg_pos = 0;
171     if (strlen(prompt)+1>=width)
172     visible = 0; /* no room to show any of the text */
173     else if (*curpos+strlen(prompt)+1>=width)
174     beg_pos = (int)(*curpos+strlen(prompt)+1-width);
175    
176     if (redraw)
177     {
178     if (visible!=-1)
179     printf("\r%s",prompt);
180     if (visible==1)
181     printf("%s",text+beg_pos);
182     }
183    
184     fflush(stdout);
185     #ifndef WIN32
186     addlen = read(fileno(stdin),&temp,1);
187     #else
188     temp = getch();
189     addlen=1;
190     #endif
191    
192     if (addlen<1)
193     return addlen;
194    
195     switch (temp)
196     {
197     case '\033': /* ESC */
198     return -1;
199     case '\r':
200     case '\n':
201     return 1;
202     case '\b': /* BS */
203     case '\177': /* DEL */
204     if (*curpos<1) /* already empty */
205     {
206     if (visible==1)
207     printf("\a");
208     continue;
209     }
210     (*curpos)--;
211     text[*curpos] = '\0';
212     if (visible==1)
213     {
214     if (beg_pos>0)
215     {
216     beg_pos--;
217     printf("\r%s%s",prompt,text+beg_pos);
218     }
219     else
220     { printf("\b \b"); }
221     }
222     continue;
223     case '\024': /* ^T */
224     if (*curpos<2)
225     {
226     if (visible==1)
227     printf("\a");
228     continue;
229     }
230     {
231     char swap;
232    
233     swap = text[*curpos-1];
234     text[*curpos-1] = text[*curpos-2];
235     text[*curpos-2] = swap;
236    
237     if (visible==1)
238     {
239     printf("\b\b");
240     printf("%s",&text[*curpos-2]);
241     }
242     }
243     continue;
244     case '\027': /* ^W */
245     if (*curpos<1)
246     {
247     if (visible==1)
248     printf("\a");
249     continue;
250     }
251     {
252     char * t=strrchr(text,' ');
253     unsigned int t1=beg_pos,t2;
254    
255     addlen = t ? t - text : 0;
256     text[addlen] = '\0';
257     beg_pos -= *curpos - addlen;
258     if (beg_pos < 0)
259     beg_pos=0;
260     if (visible==1)
261     {
262     if (t1 == 0)
263     for (i=0; i < *curpos - addlen; i++)
264     printf("\b \b");
265     else
266     {
267     /* the \r is counted in the return value, but that's ok
268     because the last column is always blank */
269     t2 = printf("\r%s%s",prompt,text+beg_pos);
270     if (t1 > 0 && beg_pos == 0)
271     {
272     for (i=0; i<width-t2; i++)
273     printf(" ");
274     for (i=0; i<width-t2; i++)
275     printf("\b");
276     }
277     }
278     }
279     }
280     *curpos = addlen;
281     continue;
282     case '\025': /* ^U */
283     if (visible==1)
284     {
285     unsigned int t2;
286    
287     t2 = printf("\r%s",prompt);
288     for (i=0; i<width-t2; i++)
289     printf(" ");
290     printf("\r%s",prompt);
291     }
292     *curpos = 0;
293     text[0] = '\0';
294     continue;
295     default:
296     if (temp>0 && temp<32) /* unhandled control char */
297     {
298     if (visible==1)
299     printf("\a");
300     continue;
301     }
302     if ((*curpos+1)>=maxlen) /* too full */
303     {
304     if (visible==1)
305     printf("\a");
306     continue;
307     }
308     if (visible==1)
309     {
310     if (beg_pos>0 || (*curpos + strlen(prompt) + 2 > width))
311     {
312     beg_pos++;
313     printf("\r%s%s",prompt,text+beg_pos);
314     }
315     printf("%c",temp);
316     }
317     text[*curpos] = temp;
318     (*curpos)++;
319     text[*curpos] = '\0';
320     continue;
321     }
322     }
323    
324     return 0;
325     }

webmaster@leafok.com
ViewVC Help
Powered by ViewVC 1.3.0-beta1